?? 51mcu.txt
字號:
void update_timerstr(void) /*更新秒表顯示代碼數組timerstr*/
{
timerstr[0]=led[timer.ms%10];
timerstr[1]=led[(int)(timer.ms/10)];
timerstr[2]=led[timer.s%10];
timerstr[3]=led[(int)(timer.s/10)];
timerstr[4]=led[timer.m%10];
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; /*給列賦掃描碼,第一次為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)
{
if(++date.year==100) date.year=0;
update_datestr();
}
break;
default: break;
}
update_dispbuf(CurrentMode);
}
void Bkey(void) /*對當前設置位進行減一操作,如果設置秒分,則給秒位清零,類比Akey()函數*/
{
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==0x00) date.day=getmonthdays(date.year,date.month);
update_datestr();
}
break;
case MINUTE:if(CurrentMode==CLOCK)
{
if(--clock.m==0xff) clock.m=59;
update_clockstr();
}
if(CurrentMode==ALART)
{
if(--alart.m==0xff) alart.m=59;
update_alartstr();
}
if(CurrentMode==DATE)
{
if(--date.month==0x00) date.month=12;
update_datestr();
}
break;
case HOUR: if(CurrentMode==CLOCK)
{
if(--clock.h==0xff) clock.h=23;
update_clockstr();
}
if(CurrentMode==ALART)
{
if(--alart.h==0xff) alart.h=23;
update_alartstr();
}
if(CurrentMode==DATE)
{
if(--date.year==0xffff) date.year=99;
update_datestr();
}
break;
default: break;
}
update_dispbuf(CurrentMode);
}
void Ckey(void) /*正常走時模式和設置模式的切換*/
{
if(CurrentMode==TIMER)
{
TR1=0; /*初始化定時器1設置,停止秒表記時*/
TH1=6;
TL1=6;
timer.ms=0; /*初始化秒表數組*/
timer.s=0;
timer.m=0;
update_timerstr();
}else
{
if(IsSet==0) /*在非秒表模式下,第一次按下C鍵進入設置模式,設置時位*/
{
IsSet=1; /*置位標志位,進入設置模式 */
SetSelect=HOUR;
return;
} /*第二次按C鍵設置分位,第三次按鍵設置秒位,第四次按鍵完成退出設置*/
if(SetSelect==0) /*按到第四次,即設置完秒位后,將標志位IsSet置0,完成設置*/
{
IsSet=0; /*復位標志位,進入正常走時模式*/
return;
}
if(SetSelect>0) SetSelect--; /*設置位的標志變量SetSelect=0:時位 1:分位 2:秒位*/
}
}
void Dkey(void) /*工作狀態切換:時鐘、鬧鐘、日期、秒表*/
{
if(CurrentMode==CLOCK) /*切換至鬧鐘,同時開關鬧鐘*/
{ CurrentMode=ALART;
Alart_EN=!Alart_EN;
update_alartstr();
return;
}
if(CurrentMode==ALART) /*切換至日期*/
{ CurrentMode=DATE;
return;
}
if(CurrentMode==DATE) /*切換至秒表,同時關閉設置模式*/
{
CurrentMode=TIMER;
IsSet=0;
return;
}
if(CurrentMode==TIMER) /*切換至時鐘*/
{
CurrentMode=CLOCK;
return;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -