锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2024-05-21 06:07:11

效果视频

这个是主界面


这个是主菜单界面


这个是设置时间的子界面


这个是设置日期


设置背景光


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


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


生日倒计时提醒功能。

全部完整的源代码下载:http://www.ruidan.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定义在12864.H中了,因为显示时间函数重复利用了.
//UI8 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_N=P0^1;//下调
sbit KEY_ER=P0^2;//确定

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

sbit BRIG=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(guide guide++;
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_ENR)
{
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_ClearG();
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();
nd=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();
}
}

}

/*------------------------------------
Menu1设置日期子菜单处理
------------------------------------*/
void Menu1_Pro()
{
UINT8 temp;
if(!Again)
{
LCD_ClearGDRAM();
Set_Date=0;
Again=1;
Refresh_SetTime=1;
LCD_WriteCommand(0x30);
LCD_WriteCommand(0x80);
LCD_SendString("设置日期:");
LCD_WriteCommand(0x98);
LCD_SendString("ENTER 键保存修改");
DS1302_ReadDate();
}

if(Menu1_Flag)//每次Menu1下最少轮询5个if条件,最7多个if.实验证明,能带得了,效果还行
{
Menu1_Flag=0;
//Refresh_SetTime=1;
Set_Date++;
}

if(Set_Date>2)
Set_Date=0;

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

if(!KEY_UP)
{
DelayMs(10);
if(!KEY_UP)
{
TR1=1;
while(!KEY_UP);
TR1=0;
if(Set_Date==0)
{
temp=Year/16;
Year=Year%16+temp*10;
if(Year<99)
Year++;
else Year=0;
temp=Year/10;
Year=Year%10+temp*16;
}
else if(Set_Date==1)
{
temp=Month/16;
Month=Month%16+temp*10;
if(Month<12)
Month++;
else Month=1;
temp=Month/10;
Month=Month%10+temp*16;
}

else if(Set_Date==2)
{
temp=Date/16;
Date=Date%16+temp*10;
if(Date<31)
Date++;
else Date=1;
temp=Date/10;
Date=Date%10+temp*16;
}
Refresh_SetTime=1;
}
}

else if(!KEY_DOWN)
{
DelayMs(10);
if(!KEY_DOWN)
{
TR1=1;
while(!KEY_DOWN);
TR1=0;
if(!Set_Date)
{
temp=Year/16;
Year=Year%16+temp*10;
if(Year>0)
Year--;
else Year=99;
temp=Year/10;
Year=Year%10+temp*16;
}
else if(Set_Date==1)
{
temp=Month/16;
Month=Month%16+temp*10;

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章