0
程序是实现数字时钟,按第一个按键显示闹钟时间(蜂鸣器响),第二,第三键是时分加一,第四键是时钟,再按第二三键是时分加一,秒钟用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; ***it P3_2=P3^2; // 定时显示开调整定义 ***it P3_3=P3^3; //minite调整定义 ***it P3_4=P3^4; //hour调整定义 ***it P3_5=P3^5; //定时显示关调整定义 ***it BUZZER=P2^4; //蜂鸣器调整定义
/*函数声明*/ void delay(uchar k ); //延时子程序 voidtime_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( ); //定时时间比对 }
} }
|
|