我写的LCD液晶屏菜单程序,实现时钟的年月日时分秒的调节,实现闹钟的设置,实现温度的上下限设置并按照设置值驱动继电器,温度和闹钟的设置参数都写入EEPROM中,掉电开机设置参数不丢失,大个数字显示时分秒。菜单为三级,三级留空白,可自行添加内容,自己写的,水平有限,发给坛里师兄吐槽,共同进步,下一步写一个结构体加指针的菜单程序。望坛里师傅有的奉献出来一下,谢谢。
制作出来的实物图如下:
单片机源程序如下:
- #include "LCD19264.h"
- #include "1302.H"
- #include "18B20.h"
- #include "tm1650.h"
- #include "24C16.h"
- #include "UART.h"
- #include "Fonts.h"
- #include "delay.h"
- #include "FengMingQiJiDianQi.h"
- bit MenuFlag1,MenuFlag2,MenuFlag3; // 各级菜单标志位,如果为1代表已进入该机菜单,为0代表退出该级菜单
- char NaoZhongShi=8,NaoZhongFen=0,NaoZhongMiao=0; //这里用char而不是unsigned char 的原因是操作此变量时减到0就停止,如果定义unsigned char,变量减到小于0就自动变为65535
- uchar kjcs; //开机次数
- uchar key,num; //键值
- uint wenduszd,wenduszg;//温度设置上下限值,wenduszd温度设置低,wenduszg温度设置高,wdszgzjz温度设置高未保存的值,wdszdzjz温度设置高未保存的值
- #define SHORT_JIAO 80
- #define LONG_JIAO 150
- /************************************待机页面函数**********************************/
- void DeskWall() //待机桌面
- {
- Read_temp(); //读取温度值
- Read_time(); //读取时间值
- // Disp_chinese_16x16(176,0,0,leijijd[8]);//在右上角显示电池电量图案
- // Disp_chinese_16x16(0,0,0,leijijd[9]);//在右上角显示WIFI信号图案
- if(shi==NaoZhongShi&&fen==NaoZhongFen&&miao==NaoZhongMiao)
- {
- ClearDisplay(); //清理一次屏幕
- }
- if(shi==NaoZhongShi&&fen==NaoZhongFen&&miao<NaoZhongMiao+30)
- {
- Beep(50,5,5); //闹钟响起
- Beep(50,8,4);
- Disp_chinese_N_16x16(48,2,2,1,NZSZ); //显示“闹钟”设置2个字
- Disp_chinese_N_16x16(80,2,2,1,SJSZ); //显示“时间”设置2个字
- Disp_chinese_16x16(112,2,1,leijijd[4]);//显示“到”字
- }
- else
- {
- /******************显示年 月 日 时 分 秒 星期 ************************/
- Disp_Char_16x32(32,4,0,DSZ[shi/10%10]);
- Disp_Char_16x32(48,4,0,DSZ[shi%10]);
- Disp_Char_16x32(64,4,0,DSZ[10]); //冒号
- Disp_Char_16x32(80,4,0,DSZ[fen/10%10]);
- Disp_Char_16x32(96,4,0,DSZ[fen%10]);
- Disp_Char_16x32(112,4,0,DSZ[10]); //冒号
- Disp_Char_16x32(128,4,0,DSZ[miao/10%10]);
- Disp_Char_16x32(144,4,0,DSZ[miao%10]);
- Disp_Char(0,6,0,SZ[nian/10%10]);
- Disp_Char(8,6,0,SZ[nian%10]);
- Disp_chinese_16x16(16,6,0,NYRSFMZ[0]); //年字
- Disp_Char(32,6,0,SZ[yue/10%10]);
- Disp_Char(40,6,0,SZ[yue%10]);
- Disp_chinese_16x16(48,6,0,NYRSFMZ[1]); //月字
- Disp_Char(64,6,0,SZ[ri/10%10]);
- Disp_Char(72,6,0,SZ[ri%10]);
- Disp_chinese_16x16(80,6,0,NYRSFMZ[2]); //日字
- switch(xingqi) //将星期1-7转换成中文显示
- {
- case 1: {
- Disp_chinese_16x16(96,6,0,NYRSFMZ[6]);
- Disp_chinese_16x16(112,6,0,DaXieShuZi[1]);
- };break;
- case 2: {
- Disp_chinese_16x16(96,6,0,NYRSFMZ[6]);
- Disp_chinese_16x16(112,6,0,DaXieShuZi[2]);
- };break;
- case 3: {
- Disp_chinese_16x16(96,6,0,NYRSFMZ[6]);
- Disp_chinese_16x16(112,6,0,DaXieShuZi[3]);
- };break;
- case 4: {
- Disp_chinese_16x16(96,6,0,NYRSFMZ[6]);
- Disp_chinese_16x16(112,6,0,DaXieShuZi[4]);
- };break;
- case 5: {
- Disp_chinese_16x16(96,6,0,NYRSFMZ[6]);
- Disp_chinese_16x16(112,6,0,DaXieShuZi[5]);
- };break;
- case 6: {
- Disp_chinese_16x16(96,6,0,NYRSFMZ[6]);
- Disp_chinese_16x16(112,6,0,DaXieShuZi[6]);
- };break;
- case 7: {
- Disp_chinese_16x16(96,6,0,NYRSFMZ[6]);
- Disp_chinese_16x16(112,6,0,NYRSFMZ[2]);
- };break;
- }
- /*************************************显示温度值*********************************************/
- //////////////////////////////////如果温度为零下时////////////////////////////////////////
- if(tflag==1)
- {
-
- if(tvalue==0)
- {
- Disp_Char(136,6,0,F8X16[0]); //用空白字模擦除不需要显示的内容
- Disp_Char(144,6,0,F8X16[0]); //用空白字模擦除不需要显示的内容
- Disp_Char(152,6,0,F8X16[0]);//用空白字模擦除不需要显示的内容
- Disp_Char(160,6,0,F8X16[0]); //用空白字模擦除不需要显示的内容
- Disp_Char(168,6,0,SZ[0]);
- Disp_Char(176,6,0,F8X16[97]); //温度符号摄氏度的点
- Disp_Char(184,6,0,F8X16[35]); //温度符号摄氏度的"C"
- }
- else
- {
- if(tvalue<10)
- {
- Disp_Char(136,6,0,F8X16[0]); //用空白字模擦除不需要显示的内容
- Disp_Char(144,6,0,F8X16[13]); //用空白字模擦除不需要显示的内容
- Disp_Char(152,6,0,SZ[0]);
- Disp_Char(160,6,0,F8X16[14]); //小数点
- Disp_Char(168,6,0,SZ[tvalue%10]);
- Disp_Char(176,6,0,F8X16[97]); //温度符号摄氏度的点
- Disp_Char(184,6,0,F8X16[35]); //温度符号摄氏度的"C"
- }
- else
- {
- if(tvalue<100)
- {
- Disp_Char(136,6,0,F8X16[0]); //用空白字模擦除不需要显示的内容
- Disp_Char(144,6,0,F8X16[13]); //用空白字模擦除不需要显示的内容
- Disp_Char(152,6,0,SZ[tvalue/10%10]);
- Disp_Char(160,6,0,F8X16[14]); //小数点
- Disp_Char(168,6,0,SZ[tvalue%10]);
- Disp_Char(176,6,0,F8X16[97]); //温度符号摄氏度的点
- Disp_Char(184,6,0,F8X16[35]); //温度符号摄氏度的"C"
- }
- else
- {
- if(tvalue<1000)
- {
- Disp_Char(136,6,0,F8X16[13]); //用空白字模擦除不需要显示的内容
- Disp_Char(144,6,0,SZ[tvalue/100%10]); //显示温度十位
- Disp_Char(152,6,0,SZ[tvalue/10%10]);
- Disp_Char(160,6,0,F8X16[14]); //小数点
- Disp_Char(168,6,0,SZ[tvalue%10]);
- Disp_Char(176,6,0,F8X16[97]); //温度符号摄氏度的点
- Disp_Char(184,6,0,F8X16[35]); //温度符号摄氏度的"C"
- }
- /* else //一般不会达到零下100度的低温,不做无意义的事情,在这里屏蔽掉此段,
- {
- Disp_Char(136,6,0,SZ[tvalue/1000%10]);//温度的负数和超过100度温度时的显示待处理
- Disp_Char(144,6,0,SZ[tvalue/100%10]); //显示温度十位
- Disp_Char(152,6,0,SZ[tvalue/10%10]);
- Disp_Char(160,6,0,F8X16[14]); //小数点
- Disp_Char(168,6,0,SZ[tvalue%10]);
- Disp_Char(176,6,0,F8X16[97]); //温度符号摄氏度的点
- Disp_Char(184,6,0,F8X16[35]); //温度符号摄氏度的"C"
- } */
- }
- }
- }
- }
- else
- ////////////////////如果温度为正时/////////////////////////////////////////////
- {
- if(tvalue==0)
- {
- Disp_Char(136,6,0,F8X16[0]); //用空白字模擦除不需要显示的内容
- Disp_Char(144,6,0,F8X16[0]); //用空白字模擦除不需要显示的内容
- Disp_Char(152,6,0,F8X16[0]);//用空白字模擦除不需要显示的内容
- Disp_Char(160,6,0,F8X16[0]); //用空白字模擦除不需要显示的内容
- Disp_Char(168,6,0,SZ[0]);
- Disp_Char(176,6,0,F8X16[97]); //温度符号摄氏度的点
- Disp_Char(184,6,0,F8X16[35]); //温度符号摄氏度的"C"
- }
- else
- {
- if(tvalue<10)
- {
- Disp_Char(136,6,0,F8X16[0]); //用空白字模擦除不需要显示的内容
- Disp_Char(144,6,0,F8X16[0]); //用空白字模擦除不需要显示的内容
- Disp_Char(152,6,0,SZ[0]);
- Disp_Char(160,6,0,F8X16[14]); //小数点
- Disp_Char(168,6,0,SZ[tvalue%10]);
- Disp_Char(176,6,0,F8X16[97]); //温度符号摄氏度的点
- Disp_Char(184,6,0,F8X16[35]); //温度符号摄氏度的"C"
- }
- else
- {
- if(tvalue<100)
- {
- Disp_Char(136,6,0,F8X16[0]); //用空白字模擦除不需要显示的内容
- Disp_Char(144,6,0,F8X16[0]); //用空白字模擦除不需要显示的内容
- Disp_Char(152,6,0,SZ[tvalue/10%10]);
- Disp_Char(160,6,0,F8X16[14]); //小数点
- Disp_Char(168,6,0,SZ[tvalue%10]);
- Disp_Char(176,6,0,F8X16[97]); //温度符号摄氏度的点
- Disp_Char(184,6,0,F8X16[35]); //温度符号摄氏度的"C"
- }
- else
- {
- if(tvalue<1000)
- {
- Disp_Char(136,6,0,F8X16[0]); //用空白字模擦除不需要显示的内容
- Disp_Char(144,6,0,SZ[tvalue/100%10]); //显示温度十位
- Disp_Char(152,6,0,SZ[tvalue/10%10]);
- Disp_Char(160,6,0,F8X16[14]); //小数点
- Disp_Char(168,6,0,SZ[tvalue%10]);
- Disp_Char(176,6,0,F8X16[97]); //温度符号摄氏度的点
- Disp_Char(184,6,0,F8X16[35]); //温度符号摄氏度的"C"
- }
- else
- {
- Disp_Char(136,6,0,SZ[tvalue/1000%10]);//温度的负数和超过100度温度时的显示待处理
- Disp_Char(144,6,0,SZ[tvalue/100%10]); //显示温度十位
- Disp_Char(152,6,0,SZ[tvalue/10%10]);
- Disp_Char(160,6,0,F8X16[14]); //小数点
- Disp_Char(168,6,0,SZ[tvalue%10]);
- Disp_Char(176,6,0,F8X16[97]); //温度符号摄氏度的点
- Disp_Char(184,6,0,F8X16[35]); //温度符号摄氏度的"C"
- }
- }
- }
- }
- }
- }
- }
- /**********************************************************************************/
- /*******************************主函数************************************/
- void main()
- {
- char i=0; //将i的数据类型定义为char型,而不是unsigned char 型,在通过按键调节减这个变量时不会出现小于0时自动到255,而是停留在0不变
- uchar col,lie,cachu,kong;
- char flash=0; //反白显示温度调节的上下限值,在902行温度设置部分使用此变量
- uchar j=0,k=0;//将j默认定位在6是让调节选定用箭头放在分钟值上。k是闹钟时间值调节的位置
- bit Set_OK_Flag = 0; //设定OK标志位
- P4M1=0x0C; //将P4端口设为普通IO口
- P4M0=0x7E;
- P4SW=0x70;
- LcdInit(); //LCD初始化
- InitUART(); //串口初始化
- Init_time(30,59,10,02,14,01,20); //系统时间初始化
- x24C02_init(); //24c02初始化函数
- kjcs = x24C02_read(2);//把24c02的地址2读出来的数据赋给kjcs
- delay_xms(50);
- wenduszg = x24C02_read(3); //把24c16的地址3读出来的数据赋给wenduszg
- delay_xms(50);
- wenduszd = x24C02_read(4); //把24c16的地址4读出来的数据赋给wenduszd
- delay_xms(50);
- NaoZhongShi = x24C02_read(5); //把24c16的地址4读出来的数据赋给NaoZhongShi
- delay_xms(10);
- NaoZhongFen = x24C02_read(6); //把24c16的地址4读出来的数据赋给NaoZhongFen
- delay_xms(10);
- NaoZhongMiao = x24C02_read(7); //把24c16的地址4读出来的数据赋给NaoZhongMiao
- delay_xms(10);
- if(kjcs>9999) //限制开机次数计到9999后就归零
- kjcs = 0;
- kjcs++; //每次开机就加1
- delay_xms(20); //延时20毫秒
- x24C02_write(2,kjcs); //在24c02中的地址2写入数据开机次数
- ClearDisplay(); //清理一次屏幕
- DeskWall();//待机页面 */
- while(1)
- {
- key=Scan_Key(); //获取键值
- // num = Key_Get_Num();
- // Disp_Char(0,0,0,SZ[num%10]);//在右上角显示按键值,用于调试
- // Disp_Char(168,0,0,SZ[key/100%10]);//在右上角显示按键值,用于调试
- // Disp_Char(176,0,0,SZ[key/10%10]); //K
- // Disp_Char(184,0,0,SZ[key%10]);//在右上角显示按键值,用于调试
- /**************************制冷模式的温控*************************************************/
- if(((tvalue/10)>wenduszg)) //如果温度高于上限值,并且在温度设置界面时,继电器吸合制冷,显示“开启”
- {
- JDQ = 0;
- }
- else
- if(((tvalue/10)<wenduszd)) //如果温度低于下限值,并且在温度设置界面时,继电器释放制冷,显示“关闭”
- {
- JDQ = 1;
- }
- /***************************************************************************************/
-
- /**************************制热模式的温控************************************************/
- // if((tvalue/10)<wenduszd) //如果温度低于下限值,继电器吸合制热升温
- // {
- // JDQ = 0;
- // }
- // else
- // if((tvalue/10)>wenduszg)
- // {
- // JDQ = 1;
- // }
- /***************************************************************************************/
- if(MenuFlag1==0) //如果1级菜单退出,
- DeskWall(); //则显示桌面
- //////////////////////////////////////////////菜单框架
- if(key==ENT)//如果待机时不断地按ENT键,一级一级深入各级菜单
- {
-
- if(key==ENT&&MenuFlag1==0&&MenuFlag2==0&&MenuFlag3==0)
- {
- ClearDisplay(); //清理一次屏幕
- Beep(SHORT_JIAO,8,4);
- MenuFlag1=1;
- Set_OK_Flag = 0;
- Disp_chinese_16x16(48,i,0,leijijd[5]);//显示“箭头”在几行之间移动动
- Disp_chinese_N_16x16(64,0,4,0,SJSZ); //在第一行显示"时间设置"4个字
- Disp_chinese_N_16x16(64,2,4,0,NZSZ); //在第二行显示"闹钟设置"4个字
- Disp_chinese_N_16x16(64,4,4,0,WDSZ); //在第三行显示"温度设置"4个字
- Disp_Char(64,6,0,ZM[6]);
- Disp_Char(72,6,0,ZM[15]);
- Disp_Char(80,6,0,ZM[18]);
- Disp_chinese_N_16x16(88,6,2,0,XX); //在第四行显示"GPS信息"5个字
- }
- else
- {
- if(key==ENT&&MenuFlag1==1&&MenuFlag2==0&&MenuFlag3==0)
- {
- ClearDisplay(); //清理一次屏幕
- Beep(SHORT_JIAO,8,4);
- MenuFlag2=1;
- Set_OK_Flag = 0;
- j = 1;
- k = 1;
- switch(k) //通过调整k的值,对应赋lie的值,lie就是向上箭头位置,就是调节值的位置
- {
- case 1: { lie = 64; };break;
- case 2: { lie = 88; };break;
- case 3: { lie = 112; };break;
-
- }
- switch(j) //通过调整j的值,对应赋col的值,col就是向上箭头位置,就是调节值的位置
- {
- case 1: { col = 0; };break;
- case 2: { col = 32; };break;
- case 3: { col = 64; };break;
- case 4: { col = 112; };break;
- case 5: { col = 128; };break;
- case 6: { col = 152; };break;
- case 7: { col = 176; };break;
- }
- switch(i) //2级菜单要显示的内容决定于i的值,i值刚好在1级菜单时通过DOWM和UP键设定好了
- {
- case 0: { //i等于0时显示时间设置的具体界面
- Disp_chinese_N_16x16(64,0,4,0,SJSZ); //在第一行显示"时间设置"4个字
- Disp_chinese_16x16(col,4,0,leijijd[6]);//显示“向上箭头”在调节值之间切换移动
- Disp_Char(0,2,0,SZ[nian/10%10]);
- Disp_Char(8,2,0,SZ[nian%10]);
- Disp_chinese_16x16(16,2,0,NYRSFMZ[0]); //年
- Disp_Char(32,2,0,SZ[yue/10%10]);
- Disp_Char(40,2,0,SZ[yue%10]);
- Disp_chinese_16x16(48,2,0,NYRSFMZ[1]); //月
- Disp_Char(64,2,0,SZ[ri/10%10]);
- Disp_Char(72,2,0,SZ[ri%10]);
- Disp_chinese_16x16(80,2,0,NYRSFMZ[2]); //日
- Disp_chinese_16x16(96,2,0,NYRSFMZ[6]); //周
- Disp_chinese_16x16(112,2,0,DaXieShuZi[xingqi]);
- Disp_Char(128,2,0,SZ[shi/10%10]);
- Disp_Char(136,2,0,SZ[shi%10]);
- Disp_Char(144,2,0,FH[0]); //冒号
- Disp_Char(152,2,0,SZ[fen/10%10]);
- Disp_Char(160,2,0,SZ[fen%10]);
- Disp_Char(168,2,0,FH[0]); //冒号
- Disp_Char(176,2,0,SZ[miao/10%10]);
- Disp_Char(184,2,0,SZ[miao%10]);
- }; break;
- case 2: { //i等于2时显示闹钟设置的具体界面
- Disp_chinese_N_16x16(64,0,4,0,NZSZ); //在第1行显示"闹钟设置"4个字
- Disp_chinese_16x16(lie,4,0,leijijd[6]);//显示“向上箭头”在调节值之间切换移动
- Disp_Char(64,2,0,SZ[NaoZhongShi/10%10]);
- Disp_Char(72,2,0,SZ[NaoZhongShi%10]);
- Disp_Char(80,2,0,FH[0]); //冒号
- Disp_Char(88,2,0,SZ[NaoZhongFen/10%10]);
- Disp_Char(96,2,0,SZ[NaoZhongFen%10]);
- Disp_Char(104,2,0,FH[0]); //冒号
- Disp_Char(112,2,0,SZ[NaoZhongMiao/10%10]);
- Disp_Char(120,2,0,SZ[NaoZhongMiao%10]);
- }; break;
- case 4: { //i等于4时显示温度设置的具体界面
- Disp_chinese_N_16x16(64,0,4,0,WDSZ);//正中1行显示"温度设置"四个字
-
- Disp_chinese_16x16(0,2,0,gao);//"高"
- Disp_chinese_16x16(16,2,0,yu);//"于"
- Disp_Char(32,2,0,FH[0]);//":"
- if(wenduszg<100) //低于100时百位显示空白
- {
- Disp_Char(40,2,0,F8X16[0]);//"wenduszg"百位位置显示空白
- Disp_Char(48,2,0,SZ[wenduszg/10%10]);//"wenduszg"温度设置高
- Disp_Char(56,2,0,SZ[wenduszg%10]);
- }
- else
- {
- Disp_Char(40,2,0,SZ[wenduszg/100%10]);//"wenduszg"温度设置高
- Disp_Char(48,2,0,SZ[wenduszg/10%10]);//"wenduszg"温度设置高
- Disp_Char(56,2,0,SZ[wenduszg%10]);
- }
- // Disp_Char(40,2,0,SZ[wenduszg/100%10]);//"wenduszg"温度设置高
- // Disp_Char(48,2,0,SZ[wenduszg/10%10]);
- // Disp_Char(56,2,0,SZ[wenduszg%10]);
- Disp_Char(64,2,0,F8X16[97]); //温度符号摄氏度的点
- Disp_Char(72,2,0,F8X16[35]); //温度符号摄氏度的"C"
- Disp_chinese_16x16(80,2,0,kai);//"开"
- Disp_chinese_16x16(96,2,0,qi);//"启"
-
- Disp_chinese_16x16(0,6,0,di);//"低"
- Disp_chinese_16x16(16,6,0,yu);//"于"
- Disp_Char(32,6,0,FH[0]);//":"
- if(wenduszd<100)
- {
- Disp_Char(40,6,0,F8X16[0]);//"wenduszd"百位位置显示空白
- Disp_Char(48,6,0,SZ[wenduszd/10%10]);//"wenduszd"温度设置低
- Disp_Char(56,6,0,SZ[wenduszd%10]);
- }
- else
- {
- Disp_Char(40,6,0,SZ[wenduszd/100%10]);//"wenduszd"温度设置低
- Disp_Char(48,6,0,SZ[wenduszd/10%10]);//"wenduszd"温度设置低
- Disp_Char(56,6,0,SZ[wenduszd%10]);
- }
- // Disp_Char(40,6,0,SZ[wenduszd/100%10]);//"wenduszd"温度设置低
- // Disp_Char(48,6,0,SZ[wenduszd/10%10]);//"wenduszd"温度设置低
- // Disp_Char(56,6,0,SZ[wenduszd%10]);
- Disp_Char(64,6,0,F8X16[97]); //温度符号摄氏度的点
- Disp_Char(72,6,0,F8X16[35]); //温度符号摄氏度的"C"
- Disp_chinese_16x16(80,6,0,guan);//"关"
- Disp_chinese_16x16(96,6,0,bi);//"闭"
- if(JDQ==0)
- {
- Disp_chinese_16x16(160,4,1,kai);//"开"
- Disp_chinese_16x16(176,4,1,qi);//"启"
- }
- else
- {
- Disp_chinese_16x16(160,4,1,guan);//"关"
- Disp_chinese_16x16(176,4,1,bi);//"闭"
- }
- }; break;
- case 6: { //i等于6时显示GPS信息的具体界面
- Disp_Char(64,0,0,ZM[6]);
- Disp_Char(72,0,0,ZM[15]);
- Disp_Char(80,0,0,ZM[18]);
- Disp_chinese_N_16x16(88,0,2,0,XX);
- }; break;
- default:{;};break;
- }
- }
- else
- {
- if(key==ENT&&MenuFlag1==1&&MenuFlag2==1&&MenuFlag3==0) //如果进入了2级菜单还在按ENT键,就进入第三级菜单
- {
- ClearDisplay(); //清理一次屏幕
- Beep(SHORT_JIAO,8,4);
- MenuFlag3=1;
- Set_OK_Flag = 0;
- }
- else
- {
- if(key==ENT&&MenuFlag1==1&&MenuFlag2==1&&MenuFlag3==1)
- {
- Beep(LONG_JIAO,2,1);//如果打开到第三级到底了,还按ENT键的话就长叫提示到底不能再按
- }
- }
- }
- }
- }
-
- if(key==DOWN&&MenuFlag1==1&&MenuFlag2==0&&MenuFlag3==0) //如果进入1级菜单时按DOWN键
- {
- i+=2;
- if(i>6)
- i=0;
- if((i-2)<0)
- Disp_chinese_16x16(48,6,0,leijijd[7]);//当i-2小于0时,不能负数,此处完美解决
- // ClearDisplay(); //清理一次屏幕
- Beep(SHORT_JIAO,5,5);
- Disp_chinese_16x16(48,i-2,0,leijijd[7]);//把上次的箭头擦除
- Disp_chinese_16x16(48,i,0,leijijd[5]);//显示“箭头”在几行之间移动动
- Disp_chinese_N_16x16(64,0,4,0,SJSZ); //在第一行显示时间设置4个字
- Disp_chinese_N_16x16(64,2,4,0,NZSZ); //在第二行显示"闹钟设置"4个字
- Disp_chinese_N_16x16(64,4,4,0,WDSZ); //在第三行显示"温度设置"4个字
- Disp_Char(64,6,0,ZM[6]);
- Disp_Char(72,6,0,ZM[15]);
- Disp_Char(80,6,0,ZM[18]);
- Disp_chinese_N_16x16(88,6,2,0,XX); //在第四行显示"GPS信息"5个字
- }
-
- if(key==UP&&MenuFlag1==1&&MenuFlag2==0&&MenuFlag3==0)//如果进入1级菜单时按UP键
- {
- i-=2;
- if((i-2)<0)
- Disp_chinese_16x16(48,0,0,leijijd[7]);//当i-2小于0时,不能负数,此处完美解决
- if(i<0)
- i=6;
- // ClearDisplay(); //清理一次屏幕
- Beep(SHORT_JIAO,5,5);
- Disp_chinese_16x16(48,i+2,0,leijijd[7]);//把上次的箭头擦除
- Disp_chinese_16x16(48,i,0,leijijd[5]);//显示“箭头”在几行之间移动动
- Disp_chinese_N_16x16(64,0,4,0,SJSZ); //在第一行显示时间设置4个字
- Disp_chinese_N_16x16(64,2,4,0,NZSZ); //在第二行显示"闹钟设置"4个字
- Disp_chinese_N_16x16(64,4,4,0,WDSZ); //在第三行显示"温度设置"4个字
- Disp_Char(64,6,0,ZM[6]);
- Disp_Char(72,6,0,ZM[15]);
- Disp_Char(80,6,0,ZM[18]);
- Disp_chinese_N_16x16(88,6,2,0,XX); //在第四行显示"GPS信息"5个字
- }
- if(key==ESC) //如果待机时不断地按ESC键,一级一级退出各级菜单,直到桌面
- {
-
- if(key==ESC&&MenuFlag1==1&&MenuFlag2==1&&MenuFlag3==1) //如果第3级菜单打开时按ESC键,则退出3级菜单
- {
- ClearDisplay(); //清理一次屏幕
- Beep(SHORT_JIAO,8,4);
- MenuFlag3=0;
- Set_OK_Flag = 0;
- switch(k) //通过调整k的值,对应赋lie的值,lie就是向上箭头位置,就是调节值的位置
- {
- case 1: { lie = 64; };break;
- case 2: { lie = 88; };break;
- case 3: { lie = 112; };break;
-
- }
- switch(j) //通过调整j的值,对应赋col的值,col就是向上箭头位置,就是调节值的位置
- {
- case 1: { col = 0; };break;
- case 2: { col = 32; };break;
- case 3: { col = 64; };break;
- case 4: { col = 112; };break;
- case 5: { col = 128; };break;
- case 6: { col = 152; };break;
- case 7: { col = 176; };break;
- }
- switch(i) //2级菜单要显示的内容决定于i的值,i值刚好在1级菜单时通过DOWM和UP键设定好了
- {
- case 0: { //i等于0时显示时间设置的具体界面
- Disp_chinese_N_16x16(64,0,4,0,SJSZ); //在第一行显示"时间设置"4个字
- Disp_chinese_16x16(col,4,0,leijijd[6]);//显示“向上箭头”在调节值之间切换移动
- Disp_Char(0,2,0,SZ[nian/10%10]);
- Disp_Char(8,2,0,SZ[nian%10]);
- Disp_chinese_16x16(16,2,0,NYRSFMZ[0]); //年
- Disp_Char(32,2,0,SZ[yue/10%10]);
- Disp_Char(40,2,0,SZ[yue%10]);
- Disp_chinese_16x16(48,2,0,NYRSFMZ[1]); //月
- Disp_Char(64,2,0,SZ[ri/10%10]);
- Disp_Char(72,2,0,SZ[ri%10]);
- Disp_chinese_16x16(80,2,0,NYRSFMZ[2]); //日
- Disp_chinese_16x16(96,2,0,NYRSFMZ[6]); //周
- Disp_chinese_16x16(112,2,0,DaXieShuZi[xingqi]);
- Disp_Char(128,2,0,SZ[shi/10%10]);
- Disp_Char(136,2,0,SZ[shi%10]);
- Disp_Char(144,2,0,FH[0]); //冒号
- Disp_Char(152,2,0,SZ[fen/10%10]);
- Disp_Char(160,2,0,SZ[fen%10]);
- Disp_Char(168,2,0,FH[0]); //冒号
- Disp_Char(176,2,0,SZ[miao/10%10]);
- Disp_Char(184,2,0,SZ[miao%10]);
- }; break;
- case 2: { //i等于2时显示闹钟设置的具体界面
- Disp_chinese_N_16x16(64,0,4,0,NZSZ); //在第1行显示"闹钟设置"4个字
- Disp_chinese_16x16(lie,4,0,leijijd[6]);//显示“向上箭头”在调节值之间切换移动
- Disp_Char(64,2,0,SZ[NaoZhongShi/10%10]);
- Disp_Char(72,2,0,SZ[NaoZhongShi%10]);
- Disp_Char(80,2,0,FH[0]); //冒号
- Disp_Char(88,2,0,SZ[NaoZhongFen/10%10]);
- Disp_Char(96,2,0,SZ[NaoZhongFen%10]);
- Disp_Char(104,2,0,FH[0]); //冒号
- Disp_Char(112,2,0,SZ[NaoZhongMiao/10%10]);
- Disp_Char(120,2,0,SZ[NaoZhongMiao%10]);
- }; break;
- case 4: { //i等于4时显示温度设置的具体界面
- Disp_chinese_N_16x16(64,0,4,0,WDSZ);//正中1行显示"温度设置"四个字
-
- Disp_chinese_16x16(0,2,0,gao);//"高"
- Disp_chinese_16x16(16,2,0,yu);//"于"
- Disp_Char(32,2,0,FH[0]);//":"
- if(wenduszg<100) //低于100时百位显示空白
- {
- Disp_Char(40,2,0,F8X16[0]);//"wenduszg"百位位置显示空白
- Disp_Char(48,2,0,SZ[wenduszg/10%10]);//"wenduszg"温度设置高
- Disp_Char(56,2,0,SZ[wenduszg%10]);
- }
- else
- {
- Disp_Char(40,2,0,SZ[wenduszg/100%10]);//"wenduszg"温度设置高
- Disp_Char(48,2,0,SZ[wenduszg/10%10]);//"wenduszg"温度设置高
- Disp_Char(56,2,0,SZ[wenduszg%10]);
- }
- // Disp_Char(40,2,0,SZ[wenduszg/100%10]);//"wenduszg"温度设置高
- // Disp_Char(48,2,0,SZ[wenduszg/10%10]);
- // Disp_Char(56,2,0,SZ[wenduszg%10]);
- Disp_Char(64,2,0,F8X16[97]); //温度符号摄氏度的点
- Disp_Char(72,2,0,F8X16[35]); //温度符号摄氏度的"C"
- Disp_chinese_16x16(80,2,0,kai);//"开"
- Disp_chinese_16x16(96,2,0,qi);//"启"
-
- Disp_chinese_16x16(0,6,0,di);//"低"
- Disp_chinese_16x16(16,6,0,yu);//"于"
- Disp_Char(32,6,0,FH[0]);//":"
- if(wenduszd<100)
- {
- Disp_Char(40,6,0,F8X16[0]);//"wenduszd"百位位置显示空白
- Disp_Char(48,6,0,SZ[wenduszd/10%10]);//"wenduszd"温度设置低
- Disp_Char(56,6,0,SZ[wenduszd%10]);
- }
- else
- {
- Disp_Char(40,6,0,SZ[wenduszd/100%10]);//"wenduszd"温度设置低
- Disp_Char(48,6,0,SZ[wenduszd/10%10]);//"wenduszd"温度设置低
- Disp_Char(56,6,0,SZ[wenduszd%10]);
- }
- // Disp_Char(40,6,0,SZ[wenduszd/100%10]);//"wenduszd"温度设置低
- // Disp_Char(48,6,0,SZ[wenduszd/10%10]);
- // Disp_Char(56,6,0,SZ[wenduszd%10]);
- Disp_Char(64,6,0,F8X16[97]); //温度符号摄氏度的点
- Disp_Char(72,6,0,F8X16[35]); //温度符号摄氏度的"C"
- Disp_chinese_16x16(80,6,0,guan);//"关"
- Disp_chinese_16x16(96,6,0,bi);//"闭"
- if(JDQ==0)
- {
- Disp_chinese_16x16(160,4,1,kai);//"开"
- Disp_chinese_16x16(176,4,1,qi);//"启"
- }
- else
- {
- Disp_chinese_16x16(160,4,1,guan);//"关"
- Disp_chinese_16x16(176,4,1,bi);//"闭"
- }
- }; break;
- case 6: { //i等于6时显示GPS信息的具体界面
- Disp_Char(64,0,0,ZM[6]);
- Disp_Char(72,0,0,ZM[15]);
- Disp_Char(80,0,0,ZM[18]);
- Disp_chinese_N_16x16(88,0,2,0,XX);
- }; break;
- default:{;};break;
- }
- }
- else
- {
- if(key==ESC&&MenuFlag1==1&&MenuFlag2==1&&MenuFlag3==0) //如果退出到2级菜单还按ESC键,则进入1级菜单
- {
- ClearDisplay(); //清理一次屏幕
- Beep(SHORT_JIAO,8,4);
- MenuFlag2=0;
- Set_OK_Flag = 0;
- Disp_chinese_16x16(48,i,0,leijijd[5]);//显示“箭头”在几行之间移动动
- Disp_chinese_N_16x16(64,0,4,0,SJSZ); //在第一行显示时间设置4个字
- Disp_chinese_N_16x16(64,2,4,0,NZSZ); //在第二行显示"闹钟设置"4个字
- Disp_chinese_N_16x16(64,4,4,0,WDSZ); //在第三行显示"温度设置"4个字
- Disp_Char(64,6,0,ZM[6]);
- Disp_Char(72,6,0,ZM[15]);
- Disp_Char(80,6,0,ZM[18]);
- Disp_chinese_N_16x16(88,6,2,0,XX); //在第四行显示"GPS信息"5个字
- }
- else
- {
- if(key==ESC&&MenuFlag1==1&&MenuFlag2==0&&MenuFlag3==0) //如果退出到1级菜单还按ESC键,则进入桌面待机页面
- {
- ClearDisplay(); //清理一次屏幕
- Beep(SHORT_JIAO,8,4);
- MenuFlag1=0;
- Set_OK_Flag = 0;
- DeskWall();//最后回到待机页面 */
- }
- else
- {
- if(key==ESC&&MenuFlag1==0&&MenuFlag2==0&&MenuFlag3==0) //如果退出到桌面还按ESC键,告警音提示
- {
- Beep(LONG_JIAO,2,1);//如果关闭桌面到底了,还按ESC键的话就长叫提示到底不能再按
- }
- }
- }
- }
- }
-
-
- if(key==RIGHT&&i==0&&MenuFlag1==1&&MenuFlag2==1&&MenuFlag3==0) //如果第3级菜单打开时并且是在时间设置界面时按RIGHT键,
- {
- // ClearDisplay(); //清理一次屏幕
- Set_OK_Flag = 0; //
- Beep(SHORT_JIAO,8,4);
- j+=1;
- if(j>7)
- {
- j=1;
- }
-
- switch(j) //通过调整j的值,对应赋col的值,col就是向上箭头位置,就是调节值的位置
- {
- case 1: { col = 0; };break;
- case 2: { col = 32; };break;
- case 3: { col = 64; };break;
- case 4: { col = 112; };break;
- case 5: { col = 128; };break;
- case 6: { col = 152; };break;
- case 7: { col = 176; };break;
- }
- switch(j-1) //不同的J-1让不同的擦除空格换位置
- {
- case 1: { cachu = 0; };break;
- case 2: { cachu = 32; };break;
- case 3: { cachu = 64; };break;
- case 4: { cachu = 112; };break;
- case 5: { cachu = 128; };break;
- case 6: { cachu = 152; };break;
- case 7: { cachu = 176; };break;
- default:{ Disp_chinese_16x16(176,4,0,leijijd[7]);};break; //此处就是j-1=0时就让空白格停在秒值下
- }
- //i等于0时显示时间设置的具体界面
- Disp_chinese_16x16(cachu,4,0,leijijd[7]);//把上次显示的向上箭头通过空白替换,起到擦除的效果,目的是避免每按键一次要清全屏的闪烁缺点
- Disp_chinese_16x16(col,4,0,leijijd[6]);//显示“向上箭头”在调节值之间切换移动
- Disp_Char(0,2,0,SZ[nian/10%10]);
- Disp_Char(8,2,0,SZ[nian%10]);
- Disp_chinese_16x16(16,2,0,NYRSFMZ[0]); //年
- Disp_Char(32,2,0,SZ[yue/10%10]);
- Disp_Char(40,2,0,SZ[yue%10]);
- Disp_chinese_16x16(48,2,0,NYRSFMZ[1]); //月
- Disp_Char(64,2,0,SZ[ri/10%10]);
- Disp_Char(72,2,0,SZ[ri%10]);
- Disp_chinese_16x16(80,2,0,NYRSFMZ[2]); //日
- Disp_chinese_16x16(96,2,0,NYRSFMZ[6]); //周
- Disp_chinese_16x16(112,2,0,DaXieShuZi[xingqi]);
- Disp_Char(128,2,0,SZ[shi/10%10]);
- Disp_Char(136,2,0,SZ[shi%10]);
- Disp_Char(144,2,0,FH[0]); //冒号
- Disp_Char(152,2,0,SZ[fen/10%10]);
- Disp_Char(160,2,0,SZ[fen%10]);
- Disp_Char(168,2,0,FH[0]); //冒号
- Disp_Char(176,2,0,SZ[miao/10%10]);
- Disp_Char(184,2,0,SZ[miao%10]);
- }
-
- if(key==LEFT&&i==0&&MenuFlag1==1&&MenuFlag2==1&&MenuFlag3==0) //如果第3级菜单打开时并且是在时间设置界面时按LEFT键,
- {
- // ClearDisplay(); //清理一次屏幕
- Set_OK_Flag = 0;
- Beep(SHORT_JIAO,8,4);
- j-=1;
- if(j<1)
- j=7;
- switch(j) //通过调整j的值,对应赋col的值,col就是向上箭头位置,就是调节值的位置
- {
- case 1: { col = 0; };break;
- case 2: { col = 32; };break;
- case 3: { col = 64; };break;
- case 4: { col = 112; };break;
- case 5: { col = 128; };break;
- case 6: { col = 152; };break;
- case 7: { col = 176; };break;
- }
- switch(j+1) //不同的J+1让不同的擦除空格换位置,模拟擦除效果
- {
- case 1: { cachu = 0; };break;
- case 2: { cachu = 32; };break;
- case 3: { cachu = 64; };break;
- case 4: { cachu = 112; };break;
- case 5: { cachu = 128; };break;
- case 6: { cachu = 152; };break;
- case 7: { cachu = 176; };break;
- default:{ Disp_chinese_16x16(0,4,0,leijijd[7]);};break; //此处就是j+1=8时就让空白格停在年值下
- }
- //i等于0时显示时间设置的具体界面
- Disp_chinese_16x16(cachu,4,0,leijijd[7]);//把上次显示的向上箭头通过空白替换起到擦除的效果
- Disp_chinese_16x16(col,4,0,leijijd[6]);//显示“向上箭头”在调节值之间切换移动
- Disp_Char(0,2,0,SZ[nian/10%10]);
- Disp_Char(8,2,0,SZ[nian%10]);
- Disp_chinese_16x16(16,2,0,NYRSFMZ[0]); //年
- Disp_Char(32,2,0,SZ[yue/10%10]);
- Disp_Char(40,2,0,SZ[yue%10]);
- Disp_chinese_16x16(48,2,0,NYRSFMZ[1]); //月
- Disp_Char(64,2,0,SZ[ri/10%10]);
- Disp_Char(72,2,0,SZ[ri%10]);
- Disp_chinese_16x16(80,2,0,NYRSFMZ[2]); //日
- Disp_chinese_16x16(96,2,0,NYRSFMZ[6]); //周
- Disp_chinese_16x16(112,2,0,DaXieShuZi[xingqi]);
- Disp_Char(128,2,0,SZ[shi/10%10]);
- Disp_Char(136,2,0,SZ[shi%10]);
- Disp_Char(144,2,0,FH[0]); //冒号
- Disp_Char(152,2,0,SZ[fen/10%10]);
- Disp_Char(160,2,0,SZ[fen%10]);
- Disp_Char(168,2,0,FH[0]); //冒号
- Disp_Char(176,2,0,SZ[miao/10%10]);
- Disp_Char(184,2,0,SZ[miao%10]);
- }
-
- /*******************************时间设置之调整年值*****************************************/
- if(key==UP&&i==0&&j==1&&MenuFlag1==1&&MenuFlag2==1&&MenuFlag3==0)//调整年+
- { //i=0,限定是在时间设置模式,j=1限定在时间设置模式的年值设置,MenuFlag1、2、3 分别=1、1、0锁定在二级菜单
- nian+=1;
- if(nian>99)
- nian=20;
- Beep(SHORT_JIAO,8,4);
- Disp_Char(0,2,0,SZ[nian/10%10]);
- Disp_Char(8,2,0,SZ[nian%10]);
- Set_OK_Flag = 0;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
LCD菜单程序大数字电子钟(三级菜单,参数设置保存、温度控制器,).zip
(312.96 KB, 下载次数: 347)
|