微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 时钟程序C程序转化为汇编程序

时钟程序C程序转化为汇编程序

时间:10-02 整理:3721RD 点击:
程序是实现数字时钟,按第一个按键显示闹钟时间(蜂鸣器响),第二,第三键是时分加一,第四键是时钟,再按第二三键是时分加一,秒钟用led实现,每两秒亮一次。现跪求汇编程序。
#include"reg52.h"
//#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
/*七段共阴管显示定义*/            //段选和位选都是低电平有效
code unsigned char digseg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
                         //   0    1    2    3    4    5    6    7    8    9   
code unsigned char digseg1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10
                         //   0    1    2    3    4    5    6    7    8    9   
code unsigned char segsel[]={0xfe,0xfd,0xfb,0xf7};
/*定义并初始化变量*/
uchar dminite=5;
uchar dhour=12;
uchar mstcnt=0;
uchar seconde=0;
uchar minite=0;
uchar hour=12;
uchar n=0;
uchar temp=0x7f;
sbit P3_2=P3^2;                 // 定时显示开调整定义
sbit P3_3=P3^3;                 //minite调整定义
sbit P3_4=P3^4;                 //hour调整定义
sbit P3_5=P3^5;                                        //定时显示关调整定义
sbit BUZZER=P2^4;                                 //蜂鸣器调整定义
/*函数声明*/
void delay(uchar k );           //延时子程序
void time_pro( );              //时间处理子程序
void display( );                    //显示当前时间子程序
void dishow( );                                                //显示定时子程序
void keyscan( );                //键盘扫描子程序
void compare( );                                //定时时间比对程序
/*****************************/
        /*延时子程序*/
/****************************/
void delay (uchar k)
{
uchar j;
while((k--)!=0)
   {
    for(j=0;j<125;j++)
     {;}
   }
}      
/**************************/
      /*时间处理子程序*/
/**************************/
void time_pro( void)
{
        if(seconde==60)                   //秒钟设为60进制
          { seconde=0;
            minite++;
           if( minite==60)              //分钟设为60进制
              { minite=0;
                hour++;
              if(hour==24)              //时钟设为24进制
                 {hour=0; }
              }
          }
}
/*******************************/
/*键盘扫描子程序*/
/*******************************/
void keyscan (void)
{
  if(P3_2==0)
             { delay(90);
                      if(P3_2==0)
                          n=1;
                         }
if(P3_5==0)
         {  delay(90);
               if(P3_5==0)
                   n=0;
         }
if(n==0)
{ if(P3_3==0)                     //按键1分的调整
               {
                   delay(90);
                       if(P3_3==0)
                           {
                             hour++;
                              if(hour==24)
                                hour=0;
                           }
                    }
  if(P3_4==0)                    //按键1小时的调整
         {
            delay(90);
               if(P3_4==0)
                 {
                    minite++;
                    if(minite==60)
                      {minite=0;}
       }           }
}
if(n==1)
           { dishow();                                           //显示定时时间
             if(P3_4==0)                     //按键1分的调整
               {
                   delay(90);
                       if(P3_4==0)
                           {
                              dminite++;
                              if(dminite==60)
                                 dminite=0;
                           }
               }
if(P3_3==0)                    //按键1小时的调整
{
    delay(90);
       if(P3_3==0)
         {
            dhour++;
            if(dhour==24)
              {dhour=0;}
    }
}
}
}
/*****************************/
/* 显示时间子程序*/
/*****************************/
void display(void)   
{      
        P2=segsel[0];
        P0=digseg[hour/10];                 //显示小时的十位
        delay(3);
        P2=segsel[1];
        P0=(digseg1[(hour%10)]);        //显示小时的个位
       delay(3);
        P2=segsel[2];
        P0=digseg[minite/10];               //显示分的十位
        delay(3);
        P2=segsel[3];
        P0=digseg[minite%10];        //显示分的个位
        delay(3);
}
/*****************************/
/* 显示定时时间子程序*/
/*****************************/
void dishow(void)   
{      
        P2=segsel[0];
        P0=digseg[dhour/10];                 //显示小时的十位
        delay(3);
        P2=segsel[1];
        P0=(digseg1[(dhour%10)]);        //显示小时的个位
        delay(3);
        P2=segsel[2];
        P0=digseg[dminite/10];               //显示分的十位
        delay(3);
        P2=segsel[3];
        P0=digseg[dminite%10];        //显示分的个位
        delay(3);
}

/*************************/
/*中断程序*/
/*************************/

void timer0(void) interrupt 1 using 0     //定时器0方式1,5ms中断一次
    {
         TH0=0xed;             //预置计数初值
         TL0=0xff;
   //  TMOD=0x01;
        mstcnt++;
        if(mstcnt==200)
        { seconde++;
           mstcnt=0;
                if(seconde%2==1)
                  {   
                 P1=0;}
                  else
                   P1=0xff;
        //        P1=temp;
        //        temp=_crol_(temp,1);
            }              

}
/**************************/
/*定时时间比对程序*/
/**************************/
void compare(void)
  { if(dhour==hour&&minite==dminite)
               {   
                         BUZZER=0;
                                  delay(9);
                                //  display( );
                                //  BUZZER=1;
                                //  delay(9000);
                                //  display();
                     }
}

/**************************/
/*主函数*/
/**************************/
void main(void)
{P1=0xff;                //初始化p1口,全设为1      
TMOD=0x01; //time0为定时器,方式1,16为计数器
TH0=0xed;             //预置计数初值
TL0=0xff;
EA=1;
ET0=1;
TR0=1;
while (1)
                {      keyscan( );    //按键扫描
                       time_pro( ); //时间处理
                                if(n==0)
                        {display( ); //显示时间
                             compare( );   //定时时间比对
                                 }
                                  
                }
}



C语言比汇编更有可读性 还是用C比较简单一些

但是老师要求用汇编啊!

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

网站地图

Top