if(++clock.m==60) /*分位判断*/ {
clock.m=0;
if(++clock.h==24) /*时位判断*/ { clock.h=0;
if(++date.day==(getmonthdays(date.year,date.month)+1)) {
date.day=1;
if(++date.month==13) date.month=1; } } } } }
void timerplus() /*秒表1/100秒位加1,判断秒、分子程序*/ {
if(++timer.ms==100) {
timer.ms=0; if(++timer.s==60) {
timer.s=0; if(++timer.m==60) { timer.m=0; } } } }
void update_clockstr(void) /*更新时钟显示代码数组clockstr*/ {
clockstr[0]=led[clock.s]; /*给元素0赋相应数码管显示编码,编码序号是秒数的个位*/
clockstr[1]=led[(int)(clock.s/10)]; /*给元素1赋相应数码管显示编码,编码序号是秒数的十位*/ clockstr[2]=led[clock.m]; /*以下类推*/ clockstr[3]=led[(int)(clock.m/10)]; clockstr[4]=led[clock.h]; clockstr[5]=led[(int)(clock.h/10)]; }
void update_alartstr(void) /*更新闹钟显示代码数组alartstr*/ { /*右边两位显示on:闹钟开启 of:闹钟关闭*/ if(Alart_EN) alartstr[0]=ledchar[1];/*显示字母n*/
else alartstr[0]=ledchar[2]; /*显示字母f*/ alartstr[1]=ledchar[0]; /*显示字母o*/ alartstr[2]=led[alart.m]; alartstr[3]=led[(int)(alart.m/10)]; alartstr[4]=led[alart.h]; alartstr[5]=led[(int)(alart.h/10)]; }
void update_datestr(void) /*更新日期显示代码数组datestr*/ {
datestr[0]=led[date.day]; datestr[1]=led[(int)(date.day/10)]; datestr[2]=led[date.month]; datestr[3]=led[(int)(date.month/10)]; datestr[4]=led[date.year]; datestr[5]=led[(int)(date.year/10)]; }
void update_timerstr(void) /*更新秒表显示代码数组timerstr*/ {
timerstr[0]=led[timer.ms]; timerstr[1]=led[(int)(timer.ms/10)]; timerstr[2]=led[timer.s]; timerstr[3]=led[(int)(timer.s/10)];
timerstr[4]=led[timer.m]; timerstr[5]=led[(int)(timer.m/10)]; }
void display(void) /*刷新显示六位LED一次*/ {
unsigned char i; for(i=0;i<6;i++) {
LED_ON(i); /*选通相应位*/
XBYTE[LED_SEG]=dispbuf[i]; /*写显示段码*/ deley(50); /*延时显示*/ LED_OFF; /*写LED全灭段码*/ } }
void update_dispbuf(unsigned char *str) /*更新显示缓冲区子函数,参数为要用来更新缓冲区的源字符数组的首地址*/ {
dispbuf[0]=str[0]; /*将要更新的源字符数组内容COPY至dispbuf数组,用作显示缓冲区*/ dispbuf[1]=str[1];
dispbuf[2]=str[2]|0x80; /*默认把时位和分位后面的小数点显示出来,根据需要再取舍*/
dispbuf[3]=str[3]; dispbuf[4]=str[4]|0x80; dispbuf[5]=str[5]; }
void deley(int i) /*延时子函数*/ { while(i--); }
unsigned char getkeycode(void) /*键盘扫描子程序,返回获得的键码*/ {
unsigned char keycode; /*键码变量,一开始存行码*/ unsigned char scancode=0x20; /*列扫描码*/ unsigned char icolumn=0; /*键的列号*/ display(); /*用刷新数码管显示的时间去抖*/ XBYTE[KEY_COLUMN]=0x00;
keycode=XBYTE[KEY_LINE]&0x0f; /*从行端口读入四位行码*/
while((scancode&0x3f)!=0) /*取scancode的低六位,只要没变为全0,则执行循环*/ {
XBYTE[KEY_COLUMN]=(~scancode)&0x3f; /*给列赋扫描