×
单片机 > 单片机程序设计 > 详情

12864液晶菜单界面小系统

发布时间:2020-06-08 发布时间:
|

效果视频




这个是主界面

这个是主菜单界面

这个是设置时间的子界面

这个是设置日期


设置背景光

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


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

生日倒计时提醒功能。


这个是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液晶  菜单界面  小系统 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Keil(MDK-ARM)系列教程(七)_菜单