LED数码管显示电子钟.doc
文本预览下载声明
#include?reg51.h#include?intrins.hunsigned燾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燿i s_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);?//?位选通值左移,?下次中断
显示全部