📄 main.c
字号:
keyFlag&=~(0x0001<<(iScan*4+2)); /*清此键的标志位*/
}
if((scanTempUchar&0x08) == 0x00) /*第四列被按*/
{
keyFlag|=0x0001<<(iScan*4+3); /*置此键的标志位*/
}
else
{
keyFlag&=~(0x0001<<(iScan*4+3)); /*清此键标志位*/
}
scanValue = scanValue<<1|0x01; /*置下次扫描值*/
}
}
uchar KeyJudge(void) /*按键预处理*/
{
uchar j,counterKeyPressedNum;
uchar keyRet = 0x55; /*初始按键返回码设定为无按码0x55*/
uint uintTemp;
ScanKeys(); /*扫描键盘*/
if(keyFlag!=0)
{
Delay(1000); /*掩饰10ms以消除抖动*/
ScanKeys();
P1 = 0x0f;
while((P1&0x0f)!=0x0f); /*没松开按键就等按键松开*/
counterKeyPressedNum = 0;
for(j=0;j<16;j++)
{
uintTemp = ((uint)0x0001)<<j;
if((keyFlag&uintTemp)==uintTemp)
/*依次检测键盘扫描标志KeyFlag,如某位置一则按键个数寄存器加1*/
{
counterKeyPressedNum++;
keyRet = j;
}
}
if(counterKeyPressedNum>1) /*如果不止一个键被按则丢弃此状态返回无码0x55*/
{
return 0x55;
}
else /*某键被按,返回此键的标识码*/
{
return(keyRet);
}
}
return(0x55); /*无键被按则返回无按码*/
}
void KeyHandle(uchar keyIndex) /*按键处理模块*/
{
static uchar cnt = 0;
switch(keyIndex)
{
case 0x00: /*按1键*/
showitem = SHOW_TIME; /*标识当前显示时间*/
str1[0]='T';str1[1]='I';str1[2]='M';str1[3]='E';
cnt = 0;
current = CUR_MINUTE;
if((cs.cs2 & 0x08) == 0x08){ /*如果闹钟标志位置位(设定闹钟过程中可能会设置)*/
cs.cs2 &= 0xf7; /*清闹钟标志位*/
PCF8563_SetCS(cs); /*写8563控制/状态字*/
}
break;
case 0x01: /*按2键*/
showitem = SHOW_ALARM; /*标识当前显示闹钟*/
str1[0]='A';str1[1]='L';str1[2]='R';str1[3]='M';
cnt = 0;
current = CUR_MINUTE;
break;
case 0x02: /*按3见*/
if(showitem == SHOW_TIME){ /*如果显示时间*/
switch(cnt){ /*设定项目更改*/
case 0:current = CUR_MINUTE;break;
case 1:current = CUR_HOUR;break;
case 2:current = CUR_DAY;break;
case 3:current = CUR_WEEKDAY;break;
case 4:current = CUR_MONTH;break;
case 5:current = CUR_YEAR;break;
case 6:current = CUR_SECOND;break;
}
if(++cnt>6){ /*轮回*/
cnt = 0;
}
}else if(showitem == SHOW_ALARM){ /*如果显示闹钟*/
switch(cnt){
case 0:current = CUR_MINUTE;break;
case 1:current = CUR_HOUR;break;
}
if(++cnt>1){ /*轮回*/
cnt = 0;
}
}
break;
case 0x03: /*INC*/
if(showitem == SHOW_TIME){ /*如果显示时间*/
PCF8563_ReadTime(&tm); /*读时间*/
set_min = (tm.minutes>>4)*10+(tm.minutes&0x0f); /*BCD到HEX*/
set_hour = (tm.hours>>4)*10+(tm.hours&0x0f);
set_day = (tm.days>>4)*10+(tm.days&0x0f);
set_weekday = tm.weekdays;
set_month = (tm.mon_cen>>4)*10+(tm.mon_cen&0x0f);
set_year = (tm.years>>4)*10+(tm.years&0x0f);
set_second = (tm.seconds>>4)*10+(tm.seconds&0x0f);
switch(current){ /*根据当前设定项目加减时间*/
case CUR_MINUTE:set_min++;break;
case CUR_HOUR:set_hour++;break;
case CUR_DAY:set_day++;break;
case CUR_WEEKDAY:set_weekday++;break;
case CUR_MONTH:set_month++;break;
case CUR_YEAR:set_year++;break;
case CUR_SECOND:set_second++;break;
}
ModTime(&tm); /*调整时间*/
ModShow(tm); /*调整显示内容*/
DisplayString(0,0,str1);
DisplayString(0,1,str2);
tm.minutes = (tm.minutes>>4)*10+(tm.minutes&0x0f); /*BCD到HEX*/
tm.hours = (tm.hours>>4)*10+(tm.hours&0x0f);
tm.days = (tm.days>>4)*10+(tm.days&0x0f);
tm.weekdays = tm.weekdays;
tm.mon_cen = (tm.mon_cen>>4)*10+(tm.mon_cen&0x0f);
tm.years = (tm.years>>4)*10+(tm.years&0x0f);
tm.seconds = (tm.seconds>>4)*10+(tm.seconds&0x0f);
PCF8563_SetTime(tm); /*设定时间*/
}else if(showitem == SHOW_ALARM){ /*如果显示闹钟*/
switch(current){ /*根据当前设定项目加减闹钟*/
case CUR_MINUTE:setalarm_min++;break;
case CUR_HOUR:setalarm_hour++;break;
}
ModAlarm(&alm); /*调整闹钟*/
tm.minutes = alm.minute; /*待显*/
tm.hours = alm.hour;
tm.days = alm.day;
tm.weekdays = alm.weekday;
ModShow(tm); /*调整显示内容*/
DisplayString(0,0,str1);
DisplayString(0,1,str2);
alm.minute = (alm.minute>>4)*10 + (alm.minute&0x0f); /*BCD到HEX*/
alm.hour = (alm.hour>>4)*10 + (alm.hour&0x0f);
alm.day = (alm.day>>4)*10 + (alm.day&0x0f);
alm.weekday = (alm.weekday>>4)*10 + (alm.weekday&0x0f);
PCF8563_SetAlarm(alm,1,1,0,0); /*设定闹钟*/
}
break;
case 0x04: /*DEC*/
if(showitem == SHOW_TIME){ /*如果显示时间*/
PCF8563_ReadTime(&tm); /*读时间*/
set_min = (tm.minutes>>4)*10+(tm.minutes&0x0f); /*BCD到HEX*/
set_hour = (tm.hours>>4)*10+(tm.hours&0x0f);
set_day = (tm.days>>4)*10+(tm.days&0x0f);
set_weekday = tm.weekdays;
set_month = (tm.mon_cen>>4)*10+(tm.mon_cen&0x0f);
set_year = (tm.years>>4)*10+(tm.years&0x0f);
set_second = (tm.seconds>>4)*10+(tm.seconds&0x0f);
switch(current){ /*根据当前设定项目加减时间*/
case CUR_MINUTE:set_min--;break;
case CUR_HOUR:set_hour--;break;
case CUR_DAY:set_day--;break;
case CUR_WEEKDAY:set_weekday--;break;
case CUR_MONTH:set_month--;break;
case CUR_YEAR:set_year--;break;
case CUR_SECOND:set_second--;break;
}
ModTime(&tm); /*调整时间*/
ModShow(tm); /*调整显示内容*/
DisplayString(0,0,str1);
DisplayString(0,1,str2);
tm.minutes = (tm.minutes>>4)*10+(tm.minutes&0x0f); /*BCD到HEX*/
tm.hours = (tm.hours>>4)*10+(tm.hours&0x0f);
tm.days = (tm.days>>4)*10+(tm.days&0x0f);
tm.weekdays = tm.weekdays;
tm.mon_cen = (tm.mon_cen>>4)*10+(tm.mon_cen&0x0f);
tm.years = (tm.years>>4)*10+(tm.years&0x0f);
tm.seconds = (tm.seconds>>4)*10+(tm.seconds&0x0f);
PCF8563_SetTime(tm); /*设定时间*/
}else if(showitem == SHOW_ALARM){ /*如果显示闹钟*/
switch(current){ /*根据当前设定项目加减闹钟*/
case CUR_MINUTE:setalarm_min--;break;
case CUR_HOUR:setalarm_hour--;break;
}
ModAlarm(&alm); /*调整闹钟*/
tm.minutes = alm.minute; /*待显*/
tm.hours = alm.hour;
tm.days = alm.day;
tm.weekdays = alm.weekday;
ModShow(tm); /*调整显示内容*/
DisplayString(0,0,str1);
DisplayString(0,1,str2);
alm.minute = (alm.minute>>4)*10 + (alm.minute&0x0f); /*BCD到HEX*/
alm.hour = (alm.hour>>4)*10 + (alm.hour&0x0f);
alm.day = (alm.day>>4)*10 + (alm.day&0x0f);
alm.weekday = (alm.weekday>>4)*10 + (alm.weekday&0x0f);
PCF8563_SetAlarm(alm,1,1,0,0); /*设定闹钟*/
}
break;
}
}
void ModAlarm(struct alarm *alm)
{
if(setalarm_min == 60){ /*如果分钟大于59*/
setalarm_min = 0;
}else if(setalarm_min == 0xFF){ /*如果分钟小于0*/
setalarm_min = 59;
}
alm->minute = (setalarm_min%10) | ((setalarm_min/10)<<4); /*HEX到BCD*/
if(setalarm_hour == 24){ /*如果小时大于23*/
setalarm_hour = 0;
}else if(setalarm_hour == 0xFF){ /*如果小时小于0*/
setalarm_hour = 23;
}
alm->hour = (setalarm_hour%10) | ((setalarm_hour/10)<<4); /*HEX到BCD*/
}
void ModTime(struct time *tm)
{
if(set_min == 60){ /*如果分钟大于59*/
set_min = 0;
}else if(set_min == 0xff){ /*如果分钟小于0*/
set_min = 59;
}
tm->minutes = (set_min%10) | ((set_min/10)<<4); /*HEX到BCD*/
if(set_hour == 24){ /*如果小时大于23*/
set_hour = 0;
}else if(set_hour == 0xff){ /*如果小时小于0*/
set_hour = 23;
}
tm->hours = (set_hour%10) | ((set_hour/10)<<4); /*HEX到BCD*/
if(set_day==31 && (tm->mon_cen==4 || tm->mon_cen==6 || tm->mon_cen==9 || tm->mon_cen==11)){
set_day = 1;
}else if(set_day==29 && (tm->mon_cen==2 && tm->years%4!=0)){
set_day = 1;
}else if(set_day==30 && (tm->mon_cen==2 && tm->years%4==0)){
set_day = 1;
}else if(set_day == 32){
set_day = 1;
}else if(set_day==0 && (tm->mon_cen==4 || tm->mon_cen==6 || tm->mon_cen==9 || tm->mon_cen==11)){
set_day = 30;
}else if(set_day==0 && (tm->mon_cen==2 && tm->years%4!=0)){
set_day = 28;
}else if(set_day==0 && (tm->mon_cen==2 && tm->years%4==0)){
set_day = 29;
}else if(set_day == 0){
set_day = 31;
}
tm->days = (set_day%10)|((set_day/10)<<4); /*HEX到BCD*/
if(set_weekday == 7){ /*如果星期大于6*/
set_weekday = 0;
}else if(set_weekday == 0xff){ /*如果星期小于0*/
set_weekday = 6;
}
tm->weekdays = (set_weekday%10)|((set_weekday/10)<<4); /*HEX到BCD*/
if(set_month == 13){ /*如果月份大于12*/
set_month = 1;
}else if(set_month == 0){ /*如果月份小于1*/
set_month = 12;
}
tm->mon_cen = (set_month%10)|((set_month/10)<<4); /*HEX到BCD*/
if(set_year == 100){ /*如果年份大于100*/
set_year = 0;
}else if(set_year == 0xff){ /*如果年份小于0*/
set_year = 99;
}
tm->years = (set_year%10)|((set_year/10)<<4); /*HEX到BCD*/
if(set_second == 60){ /*如果秒大于59*/
set_second = 0;
}else if(set_second == 0xff){ /*如果秒小于0*/
set_second = 59;
}
tm->seconds = (set_second%10)|((set_second/10)<<4); /*HEX到BCD*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -