效果视频
这个是主界面
这个是主菜单界面
这个是设置时间的子界面
这个是设置日期
设置背景光
这是设置了按键音和闹铃以后,主界面出现状态标志
闹铃的界面,喇叭出现铃声。
生日倒计时提醒功能。
这个是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; //清零标签
关键字:12864液晶 菜单界面 小系统『本文转载自网络,版权归原作者所有,如有侵权请联系删除』