标题:
STM32 lcd子菜单的实现程序
[打印本页]
作者:
456654321123
时间:
2019-10-21 10:50
标题:
STM32 lcd子菜单的实现程序
实现了一个stm32 上LCD屏幕的菜单选择
单片机源程序如下:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "lcd.h"
#include "led.h"
#include "key.h"
#include "malloc.h"
#include "sdio_sdcard.h"
#include "w25qxx.h"
#include "ff.h"
#include "exfuns.h"
#include "text.h"
#include "pyinput.h"
#include "touch.h"
#include "string.h"
#include "usmart.h"
u16 kbdxsize; //虚拟键盘按键宽度
u16 kbdysize;//虚拟键盘按键高度
u8 aaa;//一级菜单翻转位
vu8 key=0;
u16 i;
//数字表
const u8* kbd_tbl[9]={"LED1","LED2","LED3","LED4","LED5","LED6","set","fun","close"};
//字符表
const u8* kbs_tbl[9]={"灯1","灯2","灯3","灯4","灯5","灯6","设置","功能","关闭"};
void first_meau_1(void)
{
POINT_COLOR=RED;
Show_Str(30,5,200,16,"led灯管控制",16,0);
Show_Str(30,20,200,16,"all点亮所有",16,0);
Show_Str(30,35,200,16,"fun进入功能",16,0);
Show_Str(30,50,200,16,"close关闭当前",16,0);
Show_Str(30,65,200,16,"circle1:校准 KEY0:切换",16,0);
Show_Str(30,90,200,16,"输入:",16,0);
Show_Str(30,110,200,32,"结果:",16,0);
}
void first_meau_2(void)
{
POINT_COLOR=RED;
Show_Str(30,5,200,16,"led control",16,0);
Show_Str(30,20,200,16,"all lights on",16,0);
Show_Str(30,35,200,16,"function",16,0);
Show_Str(30,50,200,16,"close now",16,0);
Show_Str(30,65,200,16,"circle1:adjust KEY0:change",16,0);
Show_Str(30,90,200,16,"in:",16,0);
Show_Str(30,110,200,32,"out:",16,0);
}
void Init_all(void)
{
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
usmart_dev.init(72); //初始化USMART
KEY_Init(); //初始化按键
LCD_Init(); //初始化LCD
W25QXX_Init(); //初始化W25Q128
tp_dev.init(); //初始化触摸屏
my_mem_init(SRAMIN); //初始化内部内存池
exfuns_init(); //为fatfs相关变量申请内存
f_mount(fs[0],"0:",1); //挂载SD卡
f_mount(fs[1],"1:",1); //挂载FLASH.
POINT_COLOR=RED;
while(font_init()) //检查字库
{
LCD_ShowString(30,50,200,16,16,"Font Error!");
delay_ms(200);
LCD_Fill(30,50,240,66,WHITE);//清除显示
}
}
void secondMeau(void)
{
}
//加载键盘界面
//x,y:界面起始坐标
void py_load_ui(u16 x,u16 y,u8 flag)
{
POINT_COLOR=BLACK;
LCD_DrawRectangle(x,y,x+kbdxsize*3,y+kbdysize*3);
LCD_DrawRectangle(x+kbdxsize,y,x+kbdxsize*2,y+kbdysize*3);
LCD_DrawRectangle(x,y+kbdysize,x+kbdxsize*3,y+kbdysize*2);
POINT_COLOR=BLUE;
if(flag)
{
first_meau_2();
for(i=0;i<9;i++)
{
Show_Str_Mid(x+(i%3)*kbdxsize,y+4+kbdysize*(i/3),(u8*)kbd_tbl[i],16,kbdxsize); //Chinese
}
}
else
{
first_meau_1();
for(i=0;i<9;i++)
{
Show_Str_Mid(x+(i%3)*kbdxsize,y+kbdysize/2+kbdysize*(i/3),(u8*)kbs_tbl[i],16,kbdxsize); //English
}
}
}
//按键状态设置
//x,y:键盘坐标
//key:键值(0~8)
//sta:状态,0,松开;1,按下;
void py_key_staset(u16 x,u16 y,u8 keyx,u8 sta)
{
u16 i=keyx/3,j=keyx%3;
if(keyx>8)
return;
if(sta)
LCD_Fill(x+j*kbdxsize+1,y+i*kbdysize+1,x+j*kbdxsize+kbdxsize-1,y+i*kbdysize+kbdysize-1,GREEN);
else
LCD_Fill(x+j*kbdxsize+1,y+i*kbdysize+1,x+j*kbdxsize+kbdxsize-1,y+i*kbdysize+kbdysize-1,WHITE);
}
//得到触摸屏的输入
//x,y:键盘坐标
//返回值:按键键值(1~9有效;0,无效)
u8 py_get_keynum(u16 x,u16 y)
{
u16 i,j;
static u8 key_x=0;//0,没有任何按键按下;1~9,1~9号按键按下
u8 key=0;
tp_dev.scan(0);
if(tp_dev.sta&TP_PRES_DOWN) //触摸屏被按下
{
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(tp_dev.x[0]<(x+j*kbdxsize+kbdxsize)&&tp_dev.x[0]>(x+j*kbdxsize)&&tp_dev.y[0]<(y+i*kbdysize+kbdysize)&&tp_dev.y[0]>(y+i*kbdysize))
{
key=i*3+j+1;
break;
}
}
if(key)
{
if(key_x==key)key=0;
else
{
py_key_staset(x,y,key_x-1,0);
key_x=key;
py_key_staset(x,y,key_x-1,1);
}
break;
}
}
}
else if(key_x)
{
py_key_staset(x,y,key_x-1,0);
key_x=0;
}
return key; //得到key值
}
int main(void)
{
u8 i=0;
u8 circle1,circle2,circle3;//按键标志位
u8 inputstr[100]; //最大输入100个字符+结束符
u8 inputlen; //输入长度
u8 ok=0;
Init_all();
if(lcddev.id==0X5310){kbdxsize=86;kbdysize=43;}//根据LCD分辨率设置按键大小
else if(lcddev.id==0X5510||lcddev.id==0X1963){kbdxsize=140;kbdysize=70;}
else {kbdxsize=60;kbdysize=40;}
memset(inputstr,0,7); //全部清零
inputlen=0; //输入长度为0
while(1)
{
circle1=KEY_Scan(0);
circle2 = circle1;
while(circle2==KEY0_PRES)
{
circle2=KEY_Scan(0);
}
if(circle1==KEY0_PRES)
{
ok =~ok;
LCD_Clear(WHITE);
}
i++;
delay_ms(10);
if(aaa==1)
{
secondMeau();
circle3=KEY_Scan(0);
if(circle3==KEY1_PRES)
{
aaa=0;
}
}
else
{
py_load_ui(30,195,ok);
key=py_get_keynum(30,195);
if(key)
{
if(key==9)//删除
{
Show_Str(30,130,200,16,"关闭当前",16,0);
delay_ms(1000);
LCD_Fill(30,130,30+100,140+16,WHITE);
if(inputlen)
{
inputstr[inputlen-1]=' ';//添加结束符
inputlen--;
}
}
else
{
if(key==8)
{
Show_Str(30,130,200,16,"进入下一功能",16,0);
delay_ms(1000);
LCD_Fill(30,130,30+100,140+16,WHITE);
LCD_Fill(30+40,90,30+40+48,110+16,WHITE); //清除之前的显示
delay_ms(1000);
LCD_Fill(0,0,2000,2000,WHITE);
Show_Str(30+40,90,200,16," ",16,0);
aaa=1;
}
if(key==7)
{
Show_Str(30,130,200,16,"设置地址",16,0);
delay_ms(1000);
Show_Str(30+40,90,200,16," ",16,0);
}
inputstr[inputlen]=key+'0';//输入字符
if(inputlen<100)
inputlen++;
}
LCD_Fill(30+40,90,30+40+48,110+16,WHITE); //清除之前的显示
if(key!=8&&key!=7)
{
Show_Str(30+40,90,200,16,inputstr,16,0); //显示有效的数字串
}
}
}
}
}
复制代码
所有资料51hei提供下载:
LCD显示.7z
(1.39 MB, 下载次数: 41)
2019-10-21 17:35 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
耿庆梓!!@#!
时间:
2019-11-24 19:28
解决燃眉之急
作者:
asm555
时间:
2020-4-11 19:37
正好需要,,多谢
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1