微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求懂汇编的大神指导

求懂汇编的大神指导

时间: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;
            }
    }
}
}

把这个改为汇编

实在不知道,可以在网上下个反汇编软件,一键搞定

上一篇:STM32 RTC起振问题
下一篇:李全利-

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top