
#include #define uint unsigned int #define uchar unsigned char sbit LS138A = P2^2; //定义138译码器的输入A脚由P2.2控制 sbit LS138B = P2^3; //定义138译码器的输入脚B由P2.3控制 sbit LS138C = P2^4; //定义138译码器的输入脚C由 sbit k1=P2^0; sbit k2=P2^1 ; sbit k3=P2^5; bit flag; uchar sec=0,min=0,hour=12; uchar count_10ms, DelayCNT; int m=1; //此表为 LED 的字模, 共阴数码管 0-9 - unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; void delay(uint z) { int x,y; for(x=z;x>0;x--) for(y=20;y>0;y--) ; } void timer() { TMOD=0x01; TH0=0xdc;TL0=0x00; EA=1;ET0=1;TR0=1; } void key() { int t; if(k1==0) { delay(30); if(k1==0) { while(!k1); t++; m=t%2; } } } /************主函数**********************/ main() { unsigned int i ; unsigned int LedOut[10]; timer(); while(1) //进入循环状态 { if(m==0) { if(k2==0) { delay(30); if(k2==0) while(!k2); hour++; } if(hour>=24) hour=0; if(k3==0) { delay(30); if(k3==0) while(!k3); min++; } if(min>=60) min=0; } LedOut[0]=Disp_Tab[hour/10]; LedOut[1]=Disp_Tab[hour%10]; LedOut[2]=Disp_Tab[10]; LedOut[3]=Disp_Tab[min/10]; LedOut[4]=Disp_Tab[min%10]; LedOut[5]=Disp_Tab[10]; LedOut[6]=Disp_Tab[sec/10]; LedOut[7]=Disp_Tab[sec%10]; for( i=0; i<9; i++) //实现8位动态扫描循环 { P0 = LedOut[i]; //将字模送到P0口显示 switch(i) //使用switch 语句控制位选 也可以是用查表的方式 学员可以试着自己修改 { case 0:LS138A=0; LS138B=0; LS138C=0; break; case 1:LS138A=1; LS138B=0; LS138C=0; break; case 2:LS138A=0; LS138B=1; LS138C=0; break; case 3:LS138A=1; LS138B=1; LS138C=0; break; case 4:LS138A=0; LS138B=0; LS138C=1; break; case 5:LS138A=1; LS138B=0; LS138C=1; break; case 6:LS138A=0; LS138B=1; LS138C=1; break; case 7:LS138A=1; LS138B=1; LS138C=1; break; } delay(10); } } } void timer1() interrupt 1 // 中断函数 { TH0=0xdc;TH0=0x00; key(); if(m) { { count_10ms++; } if(count_10ms==10) { count_10ms=0; sec++; if(sec>=60) { sec=0; min++; if(min>=60) { min=0; hour++; if(hour>=24) { hour=0;sec=0;min=0; } } } } } }
