单片机源程序如下:
- #include "reg52.h"
- typedef unsigned int u16; //重新定义关键字
- typedef unsigned char u8;
- u8 code segment[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; //定义位码0~7
- u8 code dofly_DuanMa[10={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 显示段码值0~9
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- sbit k1=P3^0;
- sbit k2=P3^1;
- sbit k3=P3^2;
- sbit k4=P3^3;
- u8 hour, minute,second,count,TempData[8],Key_Num;
- void Delay_1us(u8 i) //延时函数1us
- {
- while (i--);
- }
- void Dig_Display() //数码管显示函数
- {
- u8 i;
- for (i=0;i<8;i++){
- switch (i){
- case 7:
- LSA=0;LSB=0;LSC=0;break;
- case 6:
- LSA=1;LSB=0;LSC=0;break;
- case 5:
- LSA=0;LSB=1;LSC=0;break;
- case 4:
- LSA=1;LSB=1;LSC=0;break;
- case 3:
- LSA=0;LSB=0;LSC=1;break;
- case 2:
- LSA=1;LSB=0;LSC=1;break;
- case 1:
- LSA=0;LSB=1;LSC=1;break;
- case 0:
- LSA=1;LSB=1;LSC=1;break;
- }
- P0=TempData[i];
- Delay_1us(100);
- P0=0x00;
- }
- }
- void Init_Timer0(void) //中断函数初始化
- {
- TH0=(65532-5000)/256; //赋初始值
- TL0=(65532-5000)%256;
- TMOD=0x01; //定时器0以工作方式1工作
- ET0=1;
- TR0=1;
- EA=1;
- }
- void Init_Exten0(void)
- {
- EX0=1;
- EA=1;
- IT0=0;
- }
- void Timer_Interrupt0(void) interrupt 1 //定时器0中断
- {
- TH0=(65532-5000)/256; //赋初始值
- TL0=(65532-5000)%256;
- count++;
- if (count == 140){
- count = 0;
- second++;
- if (second == 60){
- second = 0;
- minute++;
- if (minute == 60){
- minute = 0;
- hour++;
- if (hour == 24){
- hour = 0;
- }
- }
- }
- }
- }
- void Key_Scan() // 键盘扫描程序
- {
- if(k1==0){
- Delay_1us(1000);
- if(k1==0){
- Key_Num=1;
- }
- while(!k1);
- }
- if(k2==0){
- Delay_1us(1000);
- if(k2==0){
- Key_Num=2;
- }
- while(!k2);
- }
- if(k3==0){
- Delay_1us(1000);
- if(k3==0){
- Key_Num=3;
- }
- while(!k3);
- }
- if(k4==0){
- Delay_1us(1000);
- if(k4==0){
- Key_Num=4;
- }
- while(!k4);
- }
- }
- void Key_Control() //键盘的控制
- {
- TempData[0=dofly_DuanMa[0];
- TempData[1=dofly_DuanMa[0];
- TempData[2=0x40;
- TempData[3=dofly_DuanMa[0];
- TempData[4=dofly_DuanMa[0];
- TempData[5=0x40;
- TempData[6=dofly_DuanMa[0];
- TempData[7=dofly_DuanMa[0];
- switch(Key_Num){
- case 1:
- hour++;if(hour==24)hour=0;Key_Num=0; //正常时间 小时 加1
- break;
- case 2:
- hour--;if(hour==255)hour=23;Key_Num=0; //正常时间 小时减1
- break;
- case 3:
- minute++;if(minute==60)minute=0;Key_Num=0; //分钟加1
- break;
- case 4:
- minute--;if(minute==255)minute=59;Key_Num=0; //分钟减1
- break;
- }
- }
- Dig_Now_Display() //数码管刷新
- {
- TempData[0=dofly_DuanMa[hour/10];
- TempData[1=dofly_DuanMa[hour%10];
- TempData[2=0x40;
- TempData[3=dofly_DuanMa[minute/10];
- TempData[4=dofly_DuanMa[minute%10];
- TempData[5=0x40;
- TempData[6=dofly_DuanMa[second/10];
- TempData[7=dofly_DuanMa[second%10];
- Dig_Display();
- }
- void main(){
- Init_Timer0();
- while(1){
- Key_Scan();
- Key_Control();
- Dig_Now_Display();
- Dig_Display();
- }
- }
复制代码
|