?? rili.c
字號(hào):
LED_ON(i); /*選通相應(yīng)位*/
XBYTE[LED_SEG]=dispbuf[i]; /*寫顯示段碼*/
deley(50); /*延時(shí)顯示*/
LED_OFF; /*寫LED全滅段碼*/
}
}
void update_dispbuf(unsigned char *str) /*更新顯示緩沖區(qū)子函數(shù),參數(shù)為要用來更新緩沖區(qū)的源字符數(shù)組的首地址*/
{
dispbuf[0]=str[0]; /*將要更新的源字符數(shù)組內(nèi)容COPY至dispbuf數(shù)組,用作顯示緩沖區(qū)*/
dispbuf[1]=str[1];
dispbuf[2]=str[2]|0x80; /*默認(rèn)把時(shí)位和分位后面的小數(shù)點(diǎn)顯示出來,根據(jù)需要再取舍*/
dispbuf[3]=str[3];
dispbuf[4]=str[4]|0x80;
dispbuf[5]=str[5];
}
void deley(int i) /*延時(shí)子函數(shù)*/
{
while(i--);
}
unsigned char getkeycode(void) /*鍵盤掃描子程序,返回獲得的鍵碼*/
{
unsigned char keycode; /*鍵碼變量,一開始存行碼*/
unsigned char scancode=0x20; /*列掃描碼*/
unsigned char icolumn=0; /*鍵的列號(hào)*/
display(); /*用刷新數(shù)碼管顯示的時(shí)間去抖*/
XBYTE[KEY_COLUMN]=0x00;
keycode=XBYTE[KEY_LINE]&0x0f; /*從行端口讀入四位行碼*/
while((scancode&0x3f)!=0) /*取scancode的低六位,只要沒變?yōu)槿?,則執(zhí)行循環(huán)*/
{
XBYTE[KEY_COLUMN]=(~scancode)&0x3f; /*給列賦掃描碼,第一次為011111*/
if((XBYTE[KEY_LINE]&0x0f)==keycode) break; /*檢測按鍵所在的列跳出循環(huán)*/
scancode=scancode>>1; /*列掃描碼右移一位*/
icolumn++; /*列號(hào)加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) /*鍵值處理函數(shù)*/
{
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)/*得到某月的天數(shù)*/
{
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;
}
/*功能鍵子函數(shù)部分*/
void Akey(void) /*對(duì)當(dāng)前設(shè)置位進(jìn)行加一操作,如果設(shè)置秒位,則給秒位清零*/
{
if(CurrentMode==TIMER) /*秒表模式下啟閉走時(shí)*/
{ TR1=!TR1;
return;
}
if(!IsSet) return; /*如果不是設(shè)置模式退出*/
switch (SetSelect)
{
case SECOND:if(CurrentMode==CLOCK)
{
clock.s=0; /*如果當(dāng)前被設(shè)置位是秒位,則清零秒位*/
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; /*如果當(dāng)前被設(shè)置分位,則分位加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; /*如果當(dāng)前被設(shè)置時(shí)位,則時(shí)位加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) /*對(duì)當(dāng)前設(shè)置位進(jìn)行減一操作,如果設(shè)置秒分,則給秒位清零,類比Akey()函數(shù)*/
{
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) /*正常走時(shí)模式和設(shè)置模式的切換*/
{
if(CurrentMode==TIMER)
{
TR1=0; /*初始化定時(shí)器1設(shè)置,停止秒表記時(shí)*/
TH1=6;
TL1=6;
timer.ms=0; /*初始化秒表數(shù)組*/
timer.s=0;
timer.m=0;
update_timerstr();
}else
{
if(IsSet==0) /*在非秒表模式下,第一次按下C鍵進(jìn)入設(shè)置模式,設(shè)置時(shí)位*/
{
IsSet=1; /*置位標(biāo)志位,進(jìn)入設(shè)置模式 */
SetSelect=HOUR;
return;
} /*第二次按C鍵設(shè)置分位,第三次按鍵設(shè)置秒位,第四次按鍵完成退出設(shè)置*/
if(SetSelect==0) /*按到第四次,即設(shè)置完秒位后,將標(biāo)志位IsSet置0,完成設(shè)置*/
{
IsSet=0; /*復(fù)位標(biāo)志位,進(jìn)入正常走時(shí)模式*/
return;
}
if(SetSelect>0) SetSelect--; /*設(shè)置位的標(biāo)志變量SetSelect=0:時(shí)位 1:分位 2:秒位*/
}
}
void Dkey(void) /*工作狀態(tài)切換:時(shí)鐘、鬧鐘、日期、秒表*/
{
if(CurrentMode==CLOCK) /*切換至鬧鐘,同時(shí)開關(guān)鬧鐘*/
{ CurrentMode=ALART;
Alart_EN=!Alart_EN;
update_alartstr();
return;
}
if(CurrentMode==ALART) /*切換至日期*/
{ CurrentMode=DATE;
return;
}
if(CurrentMode==DATE) /*切換至秒表,同時(shí)關(guān)閉設(shè)置模式*/
{
CurrentMode=TIMER;
IsSet=0;
return;
}
if(CurrentMode==TIMER) /*切換至?xí)r鐘*/
{
CurrentMode=CLOCK;
return;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -