高级会员
主题
帖子
积分71
阅读权限30
注册时间2018-8-15
最后登录1970-1-1
在线时间 小时
|
学习单片机过程中经验总结程序源码,包含多级菜单显示功能//引用头文件
/*-------------------------------------------------------------*/
#include "Mu_menu.h"
#include "delay.h"
//#include "AHT10_get.h"
#include "AHT10i2c_data.h"
#include "LCD.h"
#include "BMP_Display.h"
#include "Key.h"
//菜单的实现
/*-------------------------------------------------------------*/
//void Read_TempAndHum(void);
//菜单的实现
/*-------------------------------------------------------------*/
bit S14a=0;
bit S14b=0;
bit S14c=0;
bit page = 0;
void (*KeyFuncPtr)(); //定义按键功能指针extern
u8 variable = 0;
uint8_t code s0[]="OMenuTest1 ";
uint8_t code s1[]="1-温湿度显示2 ";
uint8_t code s2[]="2-曲线显示3 ";
uint8_t code s3[]="3-测试画面4 ";
uint8_t code s4[]="4-测试画面5 ";
uint8_t code s5[]="5-测试画面6 ";
uint8_t code s6[]="6-测试画面7 ";
uint8_t code s7[]="7-测试画面8 ";
uint8_t code s8[]="8-测试画面9 ";
uint8_t code s9[]="9-测试画面10 ";
uint8_t code s10[]="A-Han- ";
uint8_t code s11[]="B-ceshiv1- ";
uint8_t code s12[]="C-系统设置- ";
uint8_t code s13[]="D-下一页- ";
uint8_t code s14[]="E-Return main- ";
//菜单的实现
/*-------------------------------------------------------------*/
/******************************************************************
功能: 各显示窗口
输入: 无
输出: 无
版本:
作者:
修改日期:
说明:
1. 修改画面显示
2.
******************************************************************/
void MAIN_Stat (void) //1层-1
{
Lcd_P16x16Ch(0,0,"主菜单画面",0);
Lcd_P12x12Ch(0,2,s1,0);
Lcd_P12x12Ch(0,4,s2,0);
Lcd_P12x12Ch(0,6,s3,0);
}
/*-------------------------------------------------------------*/
void Stat0 (void) //1层-1
{
Lcd_P16x16Ch(0,0,"主菜单画面1",0);
Lcd_P12x12Ch(0,2,s1,0);
Lcd_P12x12Ch(0,4,s2,0);
Lcd_P12x12Ch(0,6,s3,0);
}
/*-------------------------------------------------------------*/
void Stat1(void) //1层-2
{
Lcd_P16x16Ch(0,0,"主菜单画面2",0);
Lcd_P12x12Ch(120,2,"<",0);
Lcd_P12x12Ch(0,2,s1,0);
Lcd_P12x12Ch(0,4,s2,0);
Lcd_P12x12Ch(0,6,s3,0);
}
/*-------------------------------------------------------------*/
void Stat2(void) //1层-3
{
Lcd_P16x16Ch(0,0,"主菜单画面3",0);
Lcd_P12x12Ch(120,4,"<",0);
Lcd_P12x12Ch(0,2,s1,0);
Lcd_P12x12Ch(0,4,s2,0);
Lcd_P12x12Ch(0,6,s3,0);
}
/*-------------------------------------------------------------*/
void Stat3(void) //1层-4 返回主页
{
Lcd_P16x16Ch(0,0,"主菜单画面4",0);
Lcd_P12x12Ch(120,6,"<",0);
Lcd_P12x12Ch(0,2,s1,0);
Lcd_P12x12Ch(0,4,s2,0);
Lcd_P12x12Ch(0,6,s3,0);
}
/*-------------------------------------------------------------*/
void Stat4(void) //1层-5
{
Lcd_P16x16Ch(0,0,"主菜单画面5",0);
Lcd_P12x12Ch(120,6,"<",0);
Lcd_P12x12Ch(0,2,s2,0);
Lcd_P12x12Ch(0,4,s3,0);
Lcd_P12x12Ch(0,6,s12,0);
}
/*-----------------------------第一页第七行--------------------------------*/
void Stat5(void) //1层-6
{
Lcd_P16x16Ch(0,0,"主菜单画面6",0);
Lcd_P12x12Ch(120,6,"<",0);
Lcd_P12x12Ch(0,2,s3,0);
Lcd_P12x12Ch(0,4,s12,0);
Lcd_P12x12Ch(0,6,s13,0);
}
/*-------------------------------------------------------------*/
void Stat6(void) //2层-1
{
Lcd_P16x16Ch(0,0,"液晶屏测试1",0);
Lcd_P12x12Ch(120,2,"<",0);
// Lcd_P12x12Ch(120,2," ",0);
Lcd_P12x12Ch(0,2,s3,0);
Lcd_P12x12Ch(0,3,s4,0);
Lcd_P12x12Ch(0,4,s5,0);
Lcd_P12x12Ch(0,5,s6,0);
Lcd_P12x12Ch(0,6,s11,0);
}
/*-------------------------------------------------------------*/
void Stat7(void) //2层-2
{
Lcd_P16x16Ch(0,0,"液晶屏测试2",0);
Lcd_P12x12Ch(120,3,"<",0);
// Lcd_P12x12Ch(120,3," ",0);
Lcd_P12x12Ch(0,2,s3,0);
Lcd_P12x12Ch(0,3,s4,0);
Lcd_P12x12Ch(0,4,s5,0);
Lcd_P12x12Ch(0,5,s6,0);
Lcd_P12x12Ch(0,6,s11,0);
}
/*-------------------------------------------------------------*/
void Stat8(void)
{
Lcd_P16x16Ch(0,0,"液晶屏测试3",0);
Lcd_P12x12Ch(120,4,"<",0);
// Lcd_P12x12Ch(120,4," ",0);
Lcd_P12x12Ch(0,2,s3,0);
Lcd_P12x12Ch(0,3,s4,0);
Lcd_P12x12Ch(0,4,s5,0);
Lcd_P12x12Ch(0,5,s6,0);
Lcd_P12x12Ch(0,6,s11,0);
}
/*-------------------------------------------------------------*/
void Stat9(void)
{
Lcd_P16x16Ch(0,0,"液晶屏测试4",0);
Lcd_P12x12Ch(120,5,"<",0);
// Lcd_P12x12Ch(120,5," ",0);
Lcd_P12x12Ch(0,2,s3,0);
Lcd_P12x12Ch(0,3,s4,0);
Lcd_P12x12Ch(0,4,s5,0);
Lcd_P12x12Ch(0,5,s6,0);
Lcd_P12x12Ch(0,6,s11,0);
}
/*-------------------第二页第七行------------------------------------------*/
void Stat10(void)
{
Lcd_P16x16Ch(0,0,"液晶屏测试5",0);
Lcd_P12x12Ch(120,6,"<",0);
// Lcd_P12x12Ch(120,6," ",0);
Lcd_P12x12Ch(0,2,s3,0);
Lcd_P12x12Ch(0,3,s4,0);
Lcd_P12x12Ch(0,4,s5,0);
Lcd_P12x12Ch(0,5,s6,0);
Lcd_P12x12Ch(0,6,s11,0);
}
/*-------------------第二页第七行------------------------------------------*/
/*-------------------------------------------------------------*/
void Stat11(void)
{
Lcd_P16x16Ch(0,0,"液晶屏测试6",0);
Lcd_P12x12Ch(120,6,"<",0);
// Lcd_P12x12Ch(120,6,"<",0);
Lcd_P12x12Ch(0,2,s4,0);
Lcd_P12x12Ch(0,3,s5,0);
Lcd_P12x12Ch(0,4,s6,0);
Lcd_P12x12Ch(0,5,s11,0);
Lcd_P12x12Ch(0,6,s14,0);
}/*-------------------------------------------------------------*/
void Stat12(void)//温湿度显示
{
Read_TempAndHum();
}
/*-------------------------------------------------------------*/
void Stat13(void)//键值
{
Lcd_P12x12Ch(0,0,"系统设置13",0);
//显示电源符号
PowerScan();
}
/*-------------------------------------------------------------*/
void Stat14(void)//显示对比对数值
{
/*****************************************************************************/
//初始化显示
// timems = Key_GetNum();
Lcd_P12x12Ch(0,0,"系统设置14",0);
//显示键值
Lcd_P8x16char(10,6,'0'+(timems/100),S14c);
Lcd_P8x16char(18,6,'0'+(timems%100/10),S14c);
Lcd_P8x16char(26,6,'0'+(timems%10),S14c);
//显示对比对数值
Lcd_P12x12Ch(4,2,"对比度",0);
Lcd_P8x16char(4,4,'0'+(lcd_contrast/100),S14a);
Lcd_P8x16char(12,4,'0'+(lcd_contrast%100/10),S14a);
Lcd_P8x16char(20,4,'0'+(lcd_contrast%10),S14a);
//LCD设置水平镜像
Lcd_P12x12Ch(58,2,"水平镜像",0);
Lcd_P8x16char(58,4,'0'+(key2value/100),1);
Lcd_P8x16char(66,4,'0'+(key2value%100/10),1);
Lcd_P8x16char(74,4,'0'+(key2value%10),1);
//调试:显示按键返回主画面键值
Lcd_P8x16char(114,4,'0'+(KeyFuncIndex%100/10),S14c);
Lcd_P8x16char(120,4,'0'+(KeyFuncIndex%10),S14c);
Lcd_P5x7int(60, 7,MU_menu_i ,S14c);
// Lcd_P5x7int(60, 7,'0'+(MU_menu_i/100) ,S14c);//环境湿度-十位
// Lcd_P5x7int(66, 7,'0'+(MU_menu_i%100/10),S14c);//环境湿度-个位
// Lcd_P5x7int(72, 7,'0'+(MU_menu_i%10),S14c);//环境湿度-小数位
//转换对比度数值
Lcd_set_contrast(lcd_contrast);
/******************************************************************************/
// if(KeyFuncIndex == 0x00)
// {
if(KEY2==0)//确认
{
if (key2value < 5) key2value = key2value + 1; else {KeyFuncIndex = 0x0E; Lcd_cls(); KeyFuncIndex=KeyTab[KeyFuncIndex].KeyEnterState;key2value = 0;}
while(!KEY2); //松手检测
}
if (key2value == 1) {S14a=1;} else S14a=0;
if (key2value == 2) {S14c=1;} else S14c=0;
if(KEY1==0)//
{
switch(key2value)
{
case 1: lcd_contrast=lcd_contrast-1; break;
case 2: timems=timems - 1; break;
} Delay_ms(10);
while(!KEY1); //松手检测
}
if(KEY3==0)//
{
switch(key2value)
{
case 1: lcd_contrast=lcd_contrast+1; break;
case 2: timems=timems+1; break;
} Delay_ms(10);
while(!KEY3); //松手检测
}
}
/*-------------------------------------------------------------*/
void Stat15(void)//显示绘制直线
{
Lcd_P12x12Ch(0,0,"系统设置15",0);
//显示绘制直线
Lcd_P12x12Ch(4,2,"曲线显示",0);
LCD_DrawLine(90,4,120,2,1);
}
/*-------------------------------------------------------------*/
/*-------------------------------------------------------------*/
void Stat16(void)
{
Lcd_P12x12Ch(0,0,"主页面16",0);
}
/*-------------------------------------------------------------*/
/*-------------------------------------------------------------*/
void Stat17(void)
{
}
/*-------------------------------------------------------------*/
/*-------------------------------------------------------------*/
void Stat18(void)
{
}
/*-------------------------------------------------------------*/
/******************************************************************
功能: 菜单切换MenuOperate(0);
输入: 无
输出: 无
版本:
作者:
修改日期:
说明:
1.
2.
******************************************************************/
void MenuOperate(void)
{
// keyscan();
// keyMvalue = key_multi();
if((KEY1==0)||(KEY2==0)||(KEY3==0))
{
Delay_ms(10);//消抖
if(KEY3==0)//上
{
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState;
while(!KEY3);//松手检测
Lcd_cls();
}
if(KEY1==0)//下
{
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyDownState;
while(!KEY1); //松手检测
Lcd_cls();
}
if(KEY2==0)//确认
{
if(KeyFuncIndex != 0x0E)
{
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyEnterState;
}
while(!KEY2);//松手检测
Lcd_cls();
}
Delay_ms(10);//消抖
//Lcd_init();
//此处添加按键错误代码
}
//下面是执行按键的操作
KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate;
(*KeyFuncPtr)(); //执行当前的按键操作
}
/******************************************************************
功能:
输入: 无
输出: 无
版本:
作者:
修改日期:
说明:
1.
2.
******************************************************************/
//void MenuOperate(void)
//{
//if((keyup==0)||(keydown==0)||(keyenter==0))
//{
// Delay1ms(10);//消抖
// if(keyup==0)
// {
// Lcd_cls();
// KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState;
// while(!keyup);//松手检测
// }
// if(keydown==0)
// {
// Lcd_cls();
// KeyFuncIndex=KeyTab[KeyFuncIndex].KeyDownState;
// while(!keydown); //松手检测
// }
// if(keyenter==0)
// {
// Lcd_cls();
// KeyFuncIndex=KeyTab[KeyFuncIndex].KeyEnterState;
// while(!keyenter);//松手检测
// }
// //Lcd_init();
// //此处添加按键错误代码
// }
// //下面是执行按键的操作
// KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate;
// (*KeyFuncPtr)(); //执行当前的按键操作
//}
/******************************************************************
功能: 定时器2中断服务函数
输入: 无
输出: 无
版本:
作者:
修改日期:
说明:
1.
2.
******************************************************************/
//void InterruptTimer2() interrupt 20
//{
////uint8_t keyA;
//// count++;
//// count %= 1000;
//// keyA=keyscan();
//// MenuOperate(keyA);
////Lcd_cls();
//}
/******************************************************************
功能: 定时器2中断16位自动重装初始化
输入: 无
输出: 无
版本:
作者:
修改日期:
说明:
1.
2.
******************************************************************/
//void Uart4Init()
//{
// TM4PS = 0x01; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
// T4T3M |= 0x20; //定时器时钟1T模式
// T4L = 0xA0; //设置定时初始值
// T4H = 0x15; //设置定时初始值
// T4T3M |= 0x80; //定时器4开始计时
// IE2 |= 0x40; //使能定时器4中断
//}
//#endif
|
|