求懂汇编的大神指导
时间:10-02
整理:3721RD
点击:
#include<stdlib.h>
#include<stdio.h>
#include<reg51.h>
sbit key=P1^0;
sbit led=P1^1;
typedef unsigned char byte;
typedef unsigned int word;
static byte disp[5];
//byte table[] 内存放数码管码表
code byte
table[11]={/*0,1,2,3,4,5,6,7,8,9,*/
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
};
/************************************************************
*函数名:bot
*描 述:读取按键
*输入:无
*返回:有按键被按下则返回0,否则返回1
************************************************************/
byte bot(void) //读取按键,有按键被按下则返回0,否则返回1
{
if(key==0)return 0;
else return 1;
}
/************************************************************
*函数名:display
*描 述:将缓存区display[]中的整数译码后用数码管进行显示
*输 入:整形变量 ms
*返 回:无
************************************************************/
void display(word ms) //数码管上的显示反应时间
{
byte posi=0x01,i,j,temp;
disp[3]=ms/1000; //1s
disp[2]=(ms%1000)/100; //100ms
disp[1]=(ms%100)/10; //10ms
disp[0]=ms%10; //1ms
for(i=0;i<4;i++) //数码管显示
{
temp=disp;
temp=table[temp];
for(j=0;j<200;j++) //延时
{
P2=posi;
//显示xxxx秒形式
P0=temp;
}
posi*=2;
}
}
/************************************************************
*函数名:random
*描 述:调用系统随即函数
*输 入:无
*返 回:大的随机数
************************************************************/
unsigned long random(void) //生成随机数
{
word rt;
byte k=0;
srand (50000); //种下随机数种子,范围0-50000
rt=rand(); //生成随机熟
rt=rt*rand(); //使随机数足够大,能够延时足够时间
return rt;
}
/************************************************************
*描 述:定时器初始化子程序
*输 入:无
*返 回:无
*功 能:定时器0开中断程序,计数器1计算待测信号的脉冲熟
*************************************************************/
void INIT_TMR1(void)
{
TMOD=0x11;
TH1=0xfc;
TL1=0x66;
TR1=1;
}
void delaylms(void) //延时1ms
{
INIT_TMR1() ;
while(1)
{
if(TF1==1)
{
break;
}
}
}
void main(void)
{
byte k=0;
k=bot(); //获取按键情况
P1=0xff; //输入前先把P1口都加高电平
while(1) //主循环开始
{
word mstime=0,j;
word r;
while(bot()); //等待按键按下,否则始终等待
led=0; //按键被按下后,灯亮
r=random();
for (j=r;j>0;--j) //延时一段随机时间,为1马上的随机倍数
{
delaylms();
k=bot();
if (k==1) //如果在灯灭前谈起按键,显示最长时间作为惩罚
{
mstime=9999;
goto loop;
}
}
led=1; //灯灭
INIT_TMR1(); //初始定时状态
while(1) //如果按键弹起,反复进入定时状态,没1ms计时器溢出一次,毫秒数加1
{
if(TF1==1)
{
TH1=0xfc;
TL1=0x18;
TR1=1;
TF1=0;
++mstime;
}
if(k=bot()) break;
}
loop: led=1 ;
while(1)
{
if(k==1) //按键弹开后始终显示时间
{
k=bot();
display(mstime);
}
else //若按键按下,重新开始测试
{
mstime=0;
P2=0xff;
break;
}
}
}
}
#include<stdio.h>
#include<reg51.h>
sbit key=P1^0;
sbit led=P1^1;
typedef unsigned char byte;
typedef unsigned int word;
static byte disp[5];
//byte table[] 内存放数码管码表
code byte
table[11]={/*0,1,2,3,4,5,6,7,8,9,*/
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
};
/************************************************************
*函数名:bot
*描 述:读取按键
*输入:无
*返回:有按键被按下则返回0,否则返回1
************************************************************/
byte bot(void) //读取按键,有按键被按下则返回0,否则返回1
{
if(key==0)return 0;
else return 1;
}
/************************************************************
*函数名:display
*描 述:将缓存区display[]中的整数译码后用数码管进行显示
*输 入:整形变量 ms
*返 回:无
************************************************************/
void display(word ms) //数码管上的显示反应时间
{
byte posi=0x01,i,j,temp;
disp[3]=ms/1000; //1s
disp[2]=(ms%1000)/100; //100ms
disp[1]=(ms%100)/10; //10ms
disp[0]=ms%10; //1ms
for(i=0;i<4;i++) //数码管显示
{
temp=disp;
temp=table[temp];
for(j=0;j<200;j++) //延时
{
P2=posi;
//显示xxxx秒形式
P0=temp;
}
posi*=2;
}
}
/************************************************************
*函数名:random
*描 述:调用系统随即函数
*输 入:无
*返 回:大的随机数
************************************************************/
unsigned long random(void) //生成随机数
{
word rt;
byte k=0;
srand (50000); //种下随机数种子,范围0-50000
rt=rand(); //生成随机熟
rt=rt*rand(); //使随机数足够大,能够延时足够时间
return rt;
}
/************************************************************
*描 述:定时器初始化子程序
*输 入:无
*返 回:无
*功 能:定时器0开中断程序,计数器1计算待测信号的脉冲熟
*************************************************************/
void INIT_TMR1(void)
{
TMOD=0x11;
TH1=0xfc;
TL1=0x66;
TR1=1;
}
void delaylms(void) //延时1ms
{
INIT_TMR1() ;
while(1)
{
if(TF1==1)
{
break;
}
}
}
void main(void)
{
byte k=0;
k=bot(); //获取按键情况
P1=0xff; //输入前先把P1口都加高电平
while(1) //主循环开始
{
word mstime=0,j;
word r;
while(bot()); //等待按键按下,否则始终等待
led=0; //按键被按下后,灯亮
r=random();
for (j=r;j>0;--j) //延时一段随机时间,为1马上的随机倍数
{
delaylms();
k=bot();
if (k==1) //如果在灯灭前谈起按键,显示最长时间作为惩罚
{
mstime=9999;
goto loop;
}
}
led=1; //灯灭
INIT_TMR1(); //初始定时状态
while(1) //如果按键弹起,反复进入定时状态,没1ms计时器溢出一次,毫秒数加1
{
if(TF1==1)
{
TH1=0xfc;
TL1=0x18;
TR1=1;
TF1=0;
++mstime;
}
if(k=bot()) break;
}
loop: led=1 ;
while(1)
{
if(k==1) //按键弹开后始终显示时间
{
k=bot();
display(mstime);
}
else //若按键按下,重新开始测试
{
mstime=0;
P2=0xff;
break;
}
}
}
}
把这个改为汇编
实在不知道,可以在网上下个反汇编软件,一键搞定