微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机+lcd12864液晶屏菜单程序

51单片机+lcd12864液晶屏菜单程序

时间:11-30 来源:互联网 点击:
这个是主界面

这个是主菜单界面

这个是设置时间的子界面

这个是设置日期

设置背景光

这是设置了按键音和闹铃以后,主界面出现状态标志

闹铃的界面,喇叭出现铃声。

生日倒计时提醒功能。

全部完整的源代码下载:http://www.51hei.com/bbs/dpj-20391-1.html
process.h文件:
/*------------------------------------
名称:菜单处理模块
编写:YuMin_Dong
时间:2013.01.24
------------------------------------*/
#ifndef _PROCESS_H_
#define _PROCESS_H_

bit Menu_Flag;//设置画面显示标志

bit FanHui1;//是否退出主菜单标签
bit Refresh_SetTime;//设置了时间需要刷新显示置位改表现
bit Menu1,Menu2,Menu3,Menu4,Menu5,Menu6,Enter_Menu;//Menu0定义在LCD12864.H中了,因为显示时间函数重复利用了.
//UINT8 MenuKey_Count;//菜单键按下的次数
//UINT8 fen,shi,miao;//秒表功能用
bit Again;//为了静态显示定义该标志,在子菜单下,第一次进入显示一次界面然后在不修改前不会去刷新它
//bit Speaker_Flag;//按键音标志
bit Set_Bright,Set_Speaker;//亮灭背景光和按键音开关选项标志

bit Bell_Flag;
bit Menu1_Flag,Menu2_Flag;

/*------------------------------------
按键控制位定义
------------------------------------*/
sbit KEY_MENU=P3^2;//选择键,调用中断,及时性
sbit KEY_UP=P0^0;//上调
sbit KEY_DOWN=P0^1;//下调
sbit KEY_ENTER=P0^2;//确定

sbit SPEAKER=P2^7;//驱动喇叭位

sbit BRIGHT=P0^7;//背光控制位

/*------------------------------------
主界面处理
------------------------------------*/
void MainMenu_Pro()
{
if(guide!=guide_old)//箭头位和之前的不同的话证明按键了,刷新显示
{
LCD_RefreshMenu();//刷新菜单显示
guide_old=guide;//LCD静态显示,不然快速刷屏不好看
LCD_WriteCommand(0x30);//修正回一般指令模式
LCD_WriteCommand(0x82);
LCD_SendString("功能菜单");//菜单标题
}
if(!KEY_DOWN)//
{
DelayMs(10);
if(!KEY_DOWN)
{
TR1=1;
while(!KEY_DOWN)
;
if(guideguide++;
TR1=0;
}
}

else if(!KEY_UP)
{
DelayMs(10);
if(!KEY_UP)
{
TR1=1;
while(!KEY_UP)
;
if(guide>0)
guide--;
TR1=0;
}
}

else if(!KEY_ENTER)
{
DelayMs(10);
if(!KEY_ENTER)
{
TR1=1;
while(!KEY_ENTER)
;
switch(guide)
{
case 0: Menu0=1;Enter_Menu=1;break;
case 1: Menu1=1;Enter_Menu=1;break;
case 2: Menu2=1;Enter_Menu=1;break;
case 3: Menu3=1;Enter_Menu=1;break;
case 4: Menu4=1;Enter_Menu=1;break;
case 5: Menu5=1;Enter_Menu=1;break;
case 6: FanHui1=1;Menu_Flag=0;guide=0;
LCD_WriteCommand(0x01);break;//轮询到有enter键,当guide指向返回时候直接去掉FanHui1控制的父菜单循环
default:return;
}
TR1=0;
}
}
}

/*------------------------------------
Menu0设置时间子菜单处理
------------------------------------*/
void Menu0_Pro()
{
UINT8 temp;
if(!Again)
{
LCD_ClearGDRAM();
Set_Hour=1;//第一次进入时候直接显示调小时位
Again=1;//执行一次的标置置高,表明运行到该if条件下不执行下面语句
Refresh_SetTime=1;
LCD_WriteCommand(0x30);
LCD_WriteCommand(0x80);
LCD_SendString("设置时间:");
LCD_WriteCommand(0x98);
LCD_SendString("ENTER 键保存修改");
DS1302_ReadTime();
Second=0;
}

if(Refresh_SetTime)//当调节了刷新显示
{
Refresh_SetTime=0;
Display_Time();
//Display_SetTime();
}

if(!KEY_UP)
{
DelayMs(10);
if(!KEY_UP)
{
TR1=1;
//Refresh_SetTime=1;
while(!KEY_UP);
TR1=0;
if(Set_Hour)
{
temp=Hour/16;//这里需要进行BCD数到十进制数的转换
Hour=Hour%16+temp*10;
if(Hour<23)
Hour++;
else Hour=0;
temp=Hour/10;//转换完以后再转换会BCD数
Hour=Hour%10+temp*16;
//Display_Time();
}
else
{
temp=Minute/16;
Minute=Minute%16+temp*10;
if(Minute<59)
Minute++;
else Minute=0;
temp=Minute/10;
Minute=Minute%10+temp*16;
}
//Display_Time();
Refresh_SetTime=1;
}
}

else if(!KEY_DOWN)
{
DelayMs(10);
if(!KEY_DOWN)
{
TR1=1;
//Refresh_SetTime=1;
while(!KEY_DOWN);
TR1=0;
if(Set_Hour)
{
temp=Hour/16;
Hour=Hour%16+temp*10;
if(Hour>0)
Hour--;
else Hour=23;
temp=Hour/10;
Hour=Hour%10+temp*16;
//Display_Time();
}
else
{
temp=Minute/16;
Minute=Minute%16+temp*10;
if(Minute>0)
Minute--;
else Minute=59;
temp=Minute/10;
Minute=Minute%10+temp*16;

}
//Display_Time();
Refresh_SetTime=1;
}
}

else if(!KEY_ENTER)
{
DelayMs(10);
if(!KEY_ENTER)
{
TR1=1;
while(!KEY_ENTER);
TR1=0;
Enter_Menu=0;
Menu0=0;
guide_old++;
Again=0;
guide=0;
Set_Hour=0;
//Set_Minute=0;
DS1302_WriteTime();
LCD_ClearGDRAM();
}
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top