1、转】简易电子时钟,LED 数码管显示2010-05-14 19:06转载自 alexy000最终编辑 alexy000/* 描述: * 简易电子时钟,LED 数码管显示 串口发送命令: * 0x34-时调整 * 0x35-分调整 * * 上电时初始化显示: 12-00-00 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * P0为8位数据位P2为8位数码管选择位,低电平选
2、通8位共阳极7段数码管*/#include #include #define T2H_RELOAD 0xff /11.0592MHz 9600 baud rate at 12 clock#define T2L_RELOAD 0xdcunsigned char data dis_digit;unsigned char code dis_code11=0xc0,0xf9,0xa4,0xb0, / 0, 1, 2, 30x99,0x92,0x82,0xf8,0x80,0x90, 0xff;/ 4, 5, 6, 7, 8, 9, offunsigned char data dis_buf8;unsig
3、ned char data dis_index;unsigned char hour,min,sec;unsigned char sec100;void proc_key();void inc_sec();void inc_min();void inc_hour();void display();void delayms(unsigned char ms);void main(void)P0 = 0xff;P2 = 0xff;TMOD = 0x11; / 定时器0, 1工作模式1, 16位定时方式TH1 = 0xdc; /定时10msTL1 = 0;TH0 = 0xFC; / 定时1msTL0
4、 = 0x17;hour = 12;min = 00;sec = 00;sec100 = 0;dis_buf0 = dis_codehour / 10; / 时十位dis_buf1 = dis_codehour % 10; / 时个位dis_buf3 = dis_codemin / 10; / 分十位dis_buf4 = dis_codemin % 10; / 分个位dis_buf6 = dis_codesec / 10; / 秒十位dis_buf7 = dis_codesec % 10; / 秒个位dis_buf2 = 0xbf; / 显示“-“dis_buf5 = 0xbf; / 显示“-
5、“dis_digit = 0x7f;dis_index = 0x00;TCON = 0x01;IE = 0x8a; / 使能 timer0,1 中断TR0 = 1;TR1 = 1;SCON=0x50;TH2=T2H_RELOAD; /t2 used for uartRCAP2H=T2H_RELOAD;TL2=T2L_RELOAD;RCAP2L=T2L_RELOAD;T2CON=0x34; /9600bit per secondwhile(1)delayms(10);if(RI)RI=0;proc_key();void proc_key()EA = 0;if(0x34=SBUF) / K1inc
6、_hour();else if(0x35 = SBUF) / K2min+;if(min 59)min = 0;dis_buf3 = dis_codemin / 10; / 分十位dis_buf4 = dis_codemin % 10; / 分个位EA = 1;void timer0() interrupt 1/ 定时器0中断服务程序, 用于数码管的动态扫描/ dis_index - 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量/ dis_digit - 位选通值 , 传送到 P2口用于选通当前数码管的数值, 如等于0xfe 时,/ 选通 P2.0口数码/ dis_buf - 显于缓冲
7、区基地址TH0 = 0xFC;TL0 = 0x17;P2 = 0xff; / 先关闭所有数码管P0 = dis_bufdis_index; / 显示代码传送到 P0口P2 = dis_digit; /dis_digit = _cror_(dis_digit,1); / 位选通值左移, 下次中断时选通下一位数码管dis_index+;dis_index / 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描/void timer1() interrupt 3TH1 = 0xdc;sec100+;if(sec100 = 100)sec100 = 0;inc_sec();void inc_se
8、c()sec+;if(sec 59)sec = 0;inc_min();dis_buf6 = dis_codesec / 10; / 秒十位dis_buf7 = dis_codesec % 10; / 秒个位void inc_min()min+;if(min 59)min = 0;inc_hour();dis_buf3 = dis_codemin / 10; / 分十位dis_buf4 = dis_codemin % 10; / 分个位void inc_hour()hour+;if(hour 23)hour = 0;if(hour 9)dis_buf0 = dis_codehour / 10; / 时十位elsedis_buf0 = 0xff; / 当小时的十位为0时不显示dis_buf1 = dis_codehour % 10; / 时个位void delayms(unsigned char ms)/ 延时子程序 unsigned char i;while(ms-)for(i = 0; i 120; i+);