预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共11页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

#include<reg51.h>#include<intrins.h>unsignedchardatadis_digit;unsignedcharkey_s,key_v;unsignedcharcodedis_code[11]={0xc0,0xf9,0xa4,0xb0,//0,1,2,30x99,0x92,0x82,0xf8,0x80,0x90,0xff};//4,5,6,7,8,9,offunsignedchardatadis_buf[8];unsignedchardatadis_index;unsignedcharhour,min,sec;unsignedcharsec100;sbitK1=P1^4;sbitK2=P1^5;bitscan_key();voidproc_key();voidinc_sec();voidinc_min();voidinc_hour();voiddisplay();voiddelayms(unsignedcharms);voidmain(void){P0=0xff;P2=0xff;TMOD=0x11;//定时器0,1工作模式1,16位定时方式TH1=0xdc;TL1=0;TH0=0xFC;TL0=0x17;hour=12;min=00;sec=00;sec100=0;dis_buf[0]=dis_code[hour/10];//时十位dis_buf[1]=dis_code[hour%10];//时个位dis_buf[3]=dis_code[min/10];//分十位dis_buf[4]=dis_code[min%10];//分个位dis_buf[6]=dis_code[sec/10];//秒十位dis_buf[7]=dis_code[sec%10];//秒个位dis_buf[2]=0xbf;//显示"-"dis_buf[5]=0xbf;//显示"-"dis_digit=0xfe;dis_index=0;TCON=0x01;IE=0x8a;//使能timer0,1中断TR0=1;TR1=1;key_v=0x03;while(1){if(scan_key()){delayms(10);if(scan_key()){key_v=key_s;proc_key();}}}}bitscan_key(){key_s=0x00;key_s|=K2;key_s<<=1;key_s|=K1;return(key_s^key_v);}voidproc_key(){EA=0;if((key_v&0x01)==0)//K1{inc_hour();}elseif((key_v&0x02)==0)//K2{min++;if(min>59){min=0;}dis_buf[3]=dis_code[min/10];//分十位dis_buf[4]=dis_code[min%10];//分个位}EA=1;}voidtimer0()interrupt1//定时器0中断服务程序,用于数码管的动态扫描//dis_index---显示索引,用于标识当前显示的数码管和缓冲区的偏移量//dis_digit---位选通值,传送到P2口用于选通当前数码管的数值,如等于0xfe时,//选通P2.0口数码管//dis_buf---显于缓冲区基地址{TH0=0xFC;TL0=0x17;P2=0xff;//先关闭所有数码管P0=dis_buf[dis_index];//显示代码传送到P0口P2=dis_digit;//dis_digit=_crol_(dis_digit,1);//位选通值左移,下次中断时选通下一位数码管dis_index++;//dis_index&=0x07;//8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描}voidtimer1()interrupt3{TH1=0xdc;sec100++;if(sec100>=100){sec100=0;inc_sec();}}voidinc_sec(){sec++;if(sec>59){sec=0;inc_min();}dis_buf[6]=dis_code[sec/10];//秒十位dis_buf[7]=dis_code[sec%10];//秒个位}voidinc_min(){min++;if(min>59){min=0;inc_hour();}dis_buf[3]=dis_code[min/10];//分十位dis_buf[4]=dis_code[min%10];//分个位}voidinc_hour(){hour++;if(hour>23){hour=0;}if(hour>9)dis_buf[0]=dis_code[hour/10];//时十位elsedis_buf[0]=0xff;/