📄 main.c
字号:
//功能:公历节日数据库表
void Festival (void)
{ //在屏幕第一行显示节日
if(mo==0x01&&dd==0x01){lcdword(0,0,1," 新年快乐"); }//1月
else if( mo == 0x02 && dd == 0x10 ){ lcdword(0,0,1,"国际气象日"); }//2月
else if( mo == 0x02 && dd == 0x14 ){ lcdword(0,0,1,"今天情人节"); }
else if( mo == 0x03 && dd == 0x08 ){ lcdword(0,0,1," 3.8妇女节"); } //3月
else if( mo == 0x03 && dd == 0x12 ){ lcdword(0,0,1," 植树节 "); }
else if( mo == 0x03 && dd == 0x15 ){ lcdword(0,0,1,"国际消费日"); }
else if( mo == 0x04 && dd == 0x01 ){ lcdword(0,0,1," 愚人节 "); }//4
else if( mo == 0x04 && dd == 0x08 ){ lcdword(0,0,1," 复活节 "); }
else if( mo == 0x04 && dd == 0x22 ){ lcdword(0,0,1,"世界地球日"); }
else if( mo == 0x05 && dd == 0x01 ){ lcdword(0,0,1,"国际劳动节"); }//5
else if( mo == 0x05 && dd == 0x04 ){ lcdword(0,0,1,"中国青年节"); }
else if( mo == 0x05 && dd == 0x08 ){ lcdword(0,0,1," 红十字日"); }
else if( mo == 0x05 && dd == 0x12 ){ lcdword(0,0,1,"国际护士节"); }
else if( mo == 0x05 && dd == 0x05 ){ lcdword(0,0,1,"近日母亲节"); }
else if( mo == 0x05 && dd == 0x31 ){ lcdword(0,0,1,"世界无烟日"); }
else if( mo == 0x06 && dd == 0x01 ){ lcdword(0,0,1,"国际儿童节"); }//6
else if( mo == 0x06 && dd == 0x15 ){ lcdword(0,0,1,"近日父亲节"); }
else if( mo == 0x07 && dd == 0x01 ){ lcdword(0,0,1,"香港回归日"); }//7
else if( mo == 0x07 && dd == 0x07 ){ lcdword(0,0,1,"警!!国耻日"); }
else if( mo == 0x07 && dd == 0x11 ){ lcdword(0,0,1,"世界人口日"); }
else if( mo == 0x08 && dd == 0x01 ){ lcdword(0,0,1,"八一建军节"); }//8
else if( mo == 0x08 && dd == 0x15 ){ lcdword(0,0,1,"战胜日本日"); }
else if( mo == 0x09 && dd == 0x08 ){ lcdword(0,0,1,"国际扫盲日"); }//9
else if( mo == 0x09 && dd == 0x10 ){ lcdword(0,0,1,"中国教师节"); }
else if( mo == 0x09 && dd == 0x18 ){ lcdword(0,0,1,"!!9.18记念"); }
else if( mo == 0x09 && dd == 0x17 ){ lcdword(0,0,1,"国际和平日"); }
else if( mo == 0x10 && dd == 0x01 ){ lcdword(0,0,1," 国庆节 "); }//10
else if( mo == 0x10 && dd == 0x16 ){ lcdword(0,0,1,"世界粮食节"); }
else if( mo == 0x10 && dd == 0x24 ){ lcdword(0,0,1," 联合国日"); }
else if( mo == 0x11 && dd == 0x10 ){ lcdword(0,0,1,"世界青年节"); }//11
else if( mo == 0x11 && dd == 0x28 ){ lcdword(0,0,1," 感恩节"); }
else if( mo == 0x12 && dd == 0x01 ){ lcdword(0,0,1,"世界艾滋日"); }//12
else if( mo == 0x12 && dd == 0x24 ){ lcdword(0,0,1,"今晚平安夜"); }
else if( mo == 0x12 && dd == 0x25 ){ lcdword(0,0,1," 圣诞快乐"); }
else if( mo == 0x12 && dd == 0x31 ){ lcdword(0,0,1," 明日新年"); }
//非节日时显示时晨信息
else if ( hh >= 0x04 && hh < 0x06 ){ lcdword(0,0,1,"★★▲凌晨"); }
else if ( hh >= 0x06 && hh < 0x08 ){ lcdword(0,0,1,"☆○▲早晨"); }
else if ( hh >= 0x08 && hh < 0x12 ){ lcdword(0,0,1,"●▲▲上午"); }
else if ( hh == 0x12) { lcdword(0,0,1,"▲●▲中午"); }
else if ( hh >= 0x13 && hh < 0x18 ){ lcdword(0,0,1,"▲▲●下午"); }
else if ( hh >= 0x18 && hh < 0x22 ){ lcdword(0,0,1,"▲●☆晚上"); }
else if ( hh >= 0x22 && hh <=0x23 ){ lcdword(0,0,1,"★☆★夜里"); }
else if ( hh >= 0x00 && hh < 0x04 ){ lcdword(0,0,1,"★★★深夜"); }
}
/***************************************************************/
//功能:向LCM中填写年
void lcm_w_yy(void)
{ //if(read_clock(0x8d) != yy)
//{
yy=read_clock(0x8d); //读取年
lcdword(1,0,1,"20"); //显示20
lcdWriteData((yy/16)+0x30); //显示年十位
lcdWriteData(yy%16+0x30); //显示年个位
// }
}
/***************************************************************/
//向LCM中填写月
void lcm_w_mo(void)
{
//if(read_clock(0x89) != mo)
//{
mo = read_clock(0x89); //读取月
lcdWriteCommand(0x92);
lcdWriteData(0x16); //显示“-”
if(mo/16!=0)
{lcdWriteData((mo/16)+0x30);} //显示十位
else{lcdWriteData(0x20);} //十位为零则消隐
lcdWriteData(mo%16+0x30); //显示月的个位
lcdWriteData(0x16); //显示“-”
//}
}
/***************************************************************/
//功能:向LCD中填写日数据
void lcm_w_dd(void)
{
//if(read_clock(0x87) != dd)
//{
dd = read_clock(0x87); //读取日
lcdWriteCommand(0x94);
if(dd/16!= 0){lcdWriteData((dd/16)+0x30);} //显示十位
else{lcdWriteData(0x20);} //十位为零则消隐
lcdWriteData(dd%16+0x30);
//}
}
/***************************************************************/
//功能:星期处理并送入LCD的指定区域
void lcm_w_xq(void)
{
unsigned char sel;
if(read_clock(0x8b) != xq)
{
xq = read_clock(0x8b); //读取星期
sel = (read_clock(0x8b))%16; //字节低4位的BCD码放入sel
if(sel==7) {lcdword(1,6,1,"周日");} //
if(sel==6) {lcdword(1,6,1,"周六");} //
if(sel==5) {lcdword(1,6,1,"周五");} //
if(sel==4) {lcdword(1,6,1,"周四");} //
if(sel==3) {lcdword(1,6,1,"周");lcdWriteData(0xc8);lcdWriteData(0xfd);}
if(sel==2) {lcdword(1,6,1,"周二");} //
if(sel==1) {lcdword(1,6,1,"周一");} //星期一
}
}
/***************************************************************/
//向LCD中填写小时数据
void lcm_w_hh(void)
{
if(read_clock(0x85) != hh)
{
hh = read_clock(0x85); // 读取小时
if (hh>0x07&&hh<0x22&&setting==0)
{ beepBl(); } //整点报时音
}
lcdWriteCommand(0x9c);
lcdWriteData((hh/16)+0x30);
lcdWriteData(hh%16+0x30); //显示小时位
}
/***************************************************************/
//功能:向LCD中填写分钟
void lcm_w_mm(void)
{
if(read_clock(0x83) != mm)
{mm=read_clock(0x83);}
if(setting==0)Festival();//节日显示
lcdWriteCommand(0x9d);
lcdWriteData(0x3a); //显示":"
lcdWriteData((mm/16)+0x30);
lcdWriteData(mm%16+0x30); //显示分钟
lcdWriteData(0x3a); //":"
}
/***************************************************************/
//功能:刷新年月日星期时分
void Refresh(void)
{
lcm_w_mm(); //刷新 分
lcm_w_hh(); //刷新 小时
lcm_w_dd(); //刷新 日
lcm_w_xq(); //更新星期值
lcm_w_mo(); //刷新 月
lcm_w_yy(); //刷新 年
}
/***************************************************************/
//功能:实时更新LCD界面的各个数据
void lcd_Interface(void)
{ uchar *p;
uint i=0;
uchar a=0,b=0,c=0;
if(read_clock(0x81) != ss)
{ //判断是否需要更新
ss = read_clock(0x81); //更新数据
lcdWriteCommand(0x9f); //秒值在LCD上的写入位置
lcdWriteData((ss/16)+0x30); //写十位
lcdWriteData(ss%16+0x30); //写个位
led_secd=~led_secd; //LED闪烁
Refresh(); //刷新日期的其他数据
/**lcdWriteCommand(0x85); //温度在LCM上的写入位置
lcdWriteData(0x20); //显示符号'|'
i=ReadTemperature(); //读温度并送显
a=i/100;
lcdWriteData(a+0x30); //显示温度十位
b=i/10-a*10;
lcdWriteData(b+0x30); //显示个位
lcdWriteData(0x2e); //显示"."
c=i-a*100-b*10;
lcdWriteData(c+0x30); //显示小数位
lcdWriteData(0x43); //显示度C
****/
GetChinaCalendarStr(yy,mo,dd,p);
lcdword(2,0,1,p); //界面上更新农历
//if(JieQiStr_2word(yy,mo,dd,q)==1)
//lcdword(2,6,1,q); //界面上更新节气
}
}
/***************************************************************/
void mode_one(void)
{ setting=1;
lcdClear();
lcdword(0, 0, 1, " 重设密码");
lcdword(1, 0, 1, " 设置时间");
lcdword(2, 0, 1, " 设置闹钟");
lcdword(3, 0, 1, " 查看农历");
switch(cishu)
{ case 0: convertChar(0, 2, 8);break;
case 1: convertChar(1, 2, 8);break;
case 2: convertChar(2, 2, 8);break;
case 3: convertChar(3, 2, 8);break;
case 4: lcdword(0, 0, 1, " 设置时间");
lcdword(1, 0, 1, " 设置闹钟");
lcdword(2, 0, 1, " 查看农历");
lcdword(3, 0, 1, " 查看阳历");
convertChar(3, 2, 8);break;
}
cishu++;
if(cishu==5)cishu=0;
}
/***************************************************************/
//功能:根据获得的键值和当前的状态来确定下一步执行模块的次态
void view_state(void)
{
uchar i,x,*p;
switch(state)
{case 0: p=&fun_zero[0];break;
default: break;
}
for(i=1;i<+4;i++)
{ if(keys==*p) //表中的是不是和读取的键码一致
{++p;state=*p; //存放读取的状态
++p;x=*p; //附读取的执行模块的代码
switch(x)
{case 0: mode_one();i=4;break;
//ase 2: in_min();i=4;break;
// case 3: mode23_ret1();i=4;break;
// case 4: add_one();i=4;break;
//case 5: set_done_ret23();i=4;break;
default: break;
}
}
else if(0==*p)i=4;
p=p+3;
}
}
/***************************************************************/
//读取键盘
void read_key(void)
{
P1|=0x0f;keys=P1; //先保护P3口
keys|=0xf0; //屏蔽其他位
if((~keys)!=0) //有效按键
{delayMs(50); //消抖动
keys=P1; keys|=0xf0;
if((~keys)==0) keys=0;
switch(keys)
{ case 0xfe:keys=1;break;
case 0xfd:keys=2;break;
case 0xfb:keys=3;break;
case 0xf7:keys=4;break;
default: break;
}
}
else keys=0;
}
/***************************************************************/
//主程序开始
void main (void)
{ uchar InitLine,i;
state=0;
cishu=0;
Init_1302();
lcdInit ();
lcdClear();
lcdword(0, 0, 20, " 多功能液晶时钟");
lcdword(1, 0, 20, "设计者: 电容器");
lcdword(2, 0, 20, "仪表技术科陈志伟");
lcdword(3, 0, 20, "交流QQ:287458808");
delaySec(8);
lcdClear();
lcdword(0, 1, 20, "请稍等::::::::::");
convertChar(0, 1, 8);
lcdword(2, 0, 20, "系统初始化::::::");
for (InitLine=0; InitLine<17; InitLine++)
{ convertChar(2, 0, InitLine);
delaySec(2);
}
lcdClear();
while(1)
{if(setting==0) //正在设置则不刷新
lcd_Interface(); //刷新主界面
read_key(); //读取键盘
if(keys!=0) view_state(); //根据键值执行相应的操作
for(i=1;i<=25;i++)
delayMs(30);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -