文档详情

LED数码管显示电子钟.doc

发布:2017-09-19约7.92千字共11页下载文档
文本预览下载声明
#include?reg51.h #include?intrins.h unsigned燾har燿ata燿is_digit; unsigned燾har爇ey_s,爇ey_v; unsigned燾har燾ode燿is_code[11]={0xc0,0xf9,0xa4,0xb0,?/?,?,?,? 牋牋0x99,0x92,0x82,0xf8,0x80,0x90,?xff};//?,?,?,?,?,?,爋ff?unsigned燾har燿ata燿is_buf[8]; unsigned燾har燿ata燿is_index; unsigned燾har爃our,min,sec; unsigned燾har爏ec100;? sbit燢1?燩1^4; sbit燢2?燩1^5; bit爏can_key(); void爌roc_key(); void爄nc_sec(); void爄nc_min(); void爄nc_hour(); void燿isplay(); void燿elayms(unsigned燾har爉s); void?main(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(); ???} ??} ?? ?} } bit?scan_key() { 爇ey_s??x00; 爇ey_s爘=燢2; 爇ey_s?=?; 爇ey_s爘=燢1; 爎eturn(key_s燸爇ey_v);?} void爌roc_key() { 燛A??; 爄f((key_v??x01)?=?)牋//燢1 爗 牋inc_hour(); 爙 爀lse爄f((key_v??x02)?=?)?/燢2 爗 牋min++; 牋if(min??9) 牋{ 牋爉in??; 牋} 牋dis_buf[3]?燿is_code[min??0];牋//?分十位 ??dis_buf[4]?=?dis_code[min?%?10];??//?分个位 ?} ?EA?=?1; } void?timer0()?interrupt?1 //?定时器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);?//?位选通值左移,?下次中断
显示全部
相似文档