码,第一次为011111*/
if((XBYTE[KEY_LINE]&0x0f)==keycode) break; /*检测按键所在的列跳出循环*/
scancode=scancode>>1; /*列扫描码右移一位*/ icolumn++; /*列号加1*/ }
keycode=keycode<<4; /*把行码移到高四位*/ keycode=keycode|icolumn; /*由行码和列码组成键码*/ //等待按键放开
XBYTE[KEY_COLUMN]=0x00;
while((XBYTE[KEY_LINE]&0x0f)!=0x0f) display(); return keycode; }
void keyprocess(unsigned char keycode) /*键值处理函数*/ {
switch (keycode) {
case 0x73: Akey(); break;
case 0xB3: Bkey(); break;
case 0xD3: Ckey();
break;
case 0xE3: Dkey(); break; default: break; }
update_dispbuf(CurrentMode); }
unsigned char getmonthdays(unsigned int year,unsigned char month)/*得到某月的天数*/ {
unsigned char days; switch (month) { case 4: case 6: case 9:
case 11:days=30; break;
case 2: if(year%4==0) days=29; else days=28; break;
default:days=31;
break; }
return days; }
/*功能键子函数部分*/
void Akey(void) /*对当前设置位进行加一操作,如果设置秒位,则给秒位清零*/ {
if(CurrentMode==TIMER) /*秒表模式下启闭走时*/ { TR1=!TR1; return; }
if(!IsSet) return; /*如果不是设置模式退出*/ switch (SetSelect) {
case SECOND:if(CurrentMode==CLOCK) {
clock.s=0; /*如果当前被设置位是秒位,则清零秒位*/ update_clockstr(); }
if(CurrentMode==ALART) {
Alart_EN=!Alart_EN; update_alartstr(); }
if(CurrentMode==DATE) {
if(++date.day==(getmonthdays(date.year,date.month)+1)) date.day=1; update_datestr(); }
if(CurrentMode==TIMER) {
TR1=!TR1; } break;
case MINUTE:if(CurrentMode==CLOCK) {
if(++clock.m==60) clock.m=0; /*如果当前被设置分位,则分位加1*/ update_clockstr(); }
if(CurrentMode==ALART) {
if(++alart.m==60) alart.m=0; update_alartstr(); }
if(CurrentMode==DATE) {
if(++date.month==13) date.month=1; update_datestr(); } break;
case HOUR: if(CurrentMode==CLOCK) {
if(++clock.h==24) clock.h=0; /*如果当前被设置时位,则时位加1*/
update_clockstr(); }
if(CurrentMode==ALART) {
if(++alart.h==24) alart.h=0; update_alartstr(); }
if(CurrentMode==DATE) {