历史上的今天
今天是:2024年11月16日(星期六)
2019年11月16日 | 12864液晶菜单界面小系统
2019-11-16 来源:51hei
效果视频
这个是主界面
这个是主菜单界面
这个是设置时间的子界面
这个是设置日期
设置背景光
这是设置了按键音和闹铃以后,主界面出现状态标志
闹铃的界面,喇叭出现铃声。
生日倒计时提醒功能。
这个是main.c文件
/*------------------------------------
名称:多级菜单数字电子钟
编写:YuMin_Dong
时间:2013.01.24
------------------------------------*/
#include //#include #include #include"zm.h" #include"delay.h" #include"lcd12864.h" #include"ds18b20.h" #include"ds1302.h" #include"process.h" /*------------------------------------ 全局变量定义 ------------------------------------*/ bit Temperature_Flag; //读取并显示温度标签,使温度刷新频率低些 //bit Re_Time_Flag; //bit Flag1; //进入子菜单后置标志,中断一次Menu_Count自加一次 bit Bell_Work; /*------------------------------------ 转换表 ------------------------------------*/ //code UINT8 *WEEK_TAB[]={"一","二","三","四","五","六","日",}; //星期中文字库表 /*------------------------------------ 函数声明部分 ------------------------------------*/ //void Display_Time(); //void System_BootScreen(); //void Timer0_Init(); //void Int0_Init(); //void Display_Temperature(); //UINT8 Conver_Week(bit c,UINT8 year,UINT8 month,UINT8 date); /*------------------------------------ 启动画面 ------------------------------------*/ void System_BootScreen() { UINT8 i; LCD_SendImg128x64(User0_128x64); //欢迎画面 for(i=0;i<10;i++) DelayMs(255); //画面延时 LCD_SendImg128x64(User1_128x64); //照片显示 for(i=0;i<10;i++) DelayMs(255); } /*------------------------------------ 初始化定时器 ------------------------------------*/ void Timer_Init() { TMOD|=0x11; //两个定时器置方式一 IE|=0X8a; //开总中断开关和两个定时器中断开关 PT1=1; //按键音产生中断T1权拉高,使之能在INT0下产生声响 TR0=1; //开启定时器0,刷新用 //PX0=1; //TR1=1; } /*------------------------------------ 初始化INT0 ------------------------------------*/ void Int0_Init() { EX0=1; //打开外中断0,中断允许 IT0=1; //设置下降沿触发 } /*------------------------------------ INT0中断处理函数 ------------------------------------*/ void Int0_IRQ() interrupt 0 { Menu_Flag=1; //进入主菜单标签 TR1=1; //开启TR1有按键音 while(!KEY_MENU) //等待按键结束,使用中断做按键,能让它实时性比较好 ; TR1=0; //按键结束,按键音结束 if(Menu0) //子菜单0(设置时间进入后) { Set_Hour=~Set_Hour; //因为只有时钟和分钟个设置,0和1两种状态能区分了 } else if(Menu1) //子菜单1(设置日期进入后) Menu1_Flag=1; //为减少中断代码长度,事实证明,用个标志更好 else if(Menu2) Menu2_Flag=1; else if(Menu3) Set_Bright=~Set_Bright; //子菜单3(背景光开关) else if(Menu4) Set_Speaker=~Set_Speaker; //子菜单4(按键音开关) Refresh_SetTime=1; //在子状态中任何状态按一下都会使产生刷新显示标签。 } /*------------------------------------ T0中断处理函数 ------------------------------------*/ void Timer0_IRQ() interrupt 1 { static UINT8 i; TH0=-50000/256; TL0=-50000%256; i++; if(i==80) Temperature_Flag=1; //2.5s中产生一次(读取并刷新温度的标签) } /*------------------------------------ T1中断处理函数 ------------------------------------*/ void Timer1_IRQ() interrupt 3 { TH1=-600/256; //产生某种频率的按键音 TL1=-600%256; //经测试,2000HZ~4000HZ左右的比较适合做按键音 SPEAKER=~SPEAKER; //产生方波 提供某种频率的按键音 } /*------------------------------------ 主函数 ------------------------------------*/ void main() { LCD_ClearGDRAM(); //清除DDRAM和GDRAM的显示 System_BootScreen(); //启动画面 DS1302_Init(); //初始化DS1302 Int0_Init(); //初始化外中断0 LCD_Init(); //初始化12864 Timer_Init(); //初始化定时器 LCD_ClearGDRAM(); //清屏DDRAM和GDRAM LCD_SetCGRAM(1,User1_16x16);//写入CGRAM自定义字符 主菜单指向箭头 LCD_SetCGRAM(0,User0_16x16);//闹钟标志 LCD_SetCGRAM(2,User2_16x16);//℃ LCD_SetCGRAM(3,User4_16x16);//温度计 Display_Temperature(); //开始的时候先显示下温度,使界面比较完整不会空缺 SPEAKER=0; //断开喇叭,使之不会长时间导通烧坏 BRIGHT=1; //打开背景光 while(1) { SPEAKER=0; //断开喇叭,使之不会长时间导通烧坏 if(Temperature_Flag) //大循环下,温度标签置位后刷新显示温度 { Temperature_Flag=0; //清零标签 Display_Temperature(); } if(!Menu_Flag) //没有菜单标签则显示主时钟界面 { DS1302_ReadDate(); //读取日期 if(Bell_Flag) //Bell标志被置位,表明在设置菜单里,开始定时了,开始往下执行,等待定时到 { if(Hour==Bell_Hour&&Minute==Bell_Minute) { LCD_ClearGDRAM(); LCD_SendImg128x64(User2_128x64); Bell_Work=1; ET1=1;
史海拾趣
|
开关电源变压器铁芯磁滞回线测量-part1开关电源原理与设计(连载59) 2-1-1-9.开关电源变压器铁芯磁滞回线测量 现代电子设备对电源的工作效率和体积以及安全要求越来越高,在开关电源中决定工作效率和体积以及安全要求的诸多因素,基本上都与开关变压器有关,而与开关变压器技术性能相关最大的要算是变压器的铁芯材 ...… 查看全部问答> |
|
我用STC单片机测量频率(0-26HZ).频率信号由外部中断1—INT1引进,采用下降沿触发方式,由TIMER1测量两个下降沿之间的时间。我写的程序只能测量1—3HZ的,频率再高一点就乱跳 下面是我的代码。主程序应该没什么问题,已经调好久了,就是找不出原因 ...… 查看全部问答> |
|
ST原装的FlashLoaderv1.2怎么只提供了COM1和COM2选择? 这是很不方便的,有很多用笔记本电脑的没有COM1和COM2,都用USB转出来的串口,一般都在串口4以上,建议ST把可用的 ...… 查看全部问答> |
|
问题有两个: 1。 为什么xint1的中断函数中要再次使能group1中断(下面代码中①)和总中断使能(下面代码中②)即使没有关闭中断(DINT)?其它的比如TIMER1,PWM,CAPTURE等中断则不需要在服务程序中再次使能 2。进入XINT1中断后,程序总是跑飞?? ...… 查看全部问答> |




