|
實(shí)現(xiàn)了一個(gè)stm32 上LCD屏幕的菜單選擇
單片機(jī)源程序如下:
- #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; //虛擬鍵盤(pán)按鍵寬度
- u16 kbdysize;//虛擬鍵盤(pán)按鍵高度
- u8 aaa;//一級(jí)菜單翻轉(zhuǎn)位
- vu8 key=0;
- u16 i;
-
- //數(shù)字表
- 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","設(shè)置","功能","關(guān)閉"};
- void first_meau_1(void)
- {
- POINT_COLOR=RED;
- Show_Str(30,5,200,16,"led燈管控制",16,0);
- Show_Str(30,20,200,16,"all點(diǎn)亮所有",16,0);
- Show_Str(30,35,200,16,"fun進(jìn)入功能",16,0);
- Show_Str(30,50,200,16,"close關(guān)閉當(dāng)前",16,0);
- Show_Str(30,65,200,16,"circle1:校準(zhǔn) KEY0:切換",16,0);
- Show_Str(30,90,200,16,"輸入:",16,0);
- Show_Str(30,110,200,32,"結(jié)果:",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(); //延時(shí)函數(shù)初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置中斷優(yōu)先級(jí)分組為組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
- uart_init(115200); //串口初始化為115200
- usmart_dev.init(72); //初始化USMART
- KEY_Init(); //初始化按鍵
- LCD_Init(); //初始化LCD
- W25QXX_Init(); //初始化W25Q128
- tp_dev.init(); //初始化觸摸屏
- my_mem_init(SRAMIN); //初始化內(nèi)部?jī)?nèi)存池
- exfuns_init(); //為fatfs相關(guān)變量申請(qǐng)內(nèi)存
- f_mount(fs[0],"0:",1); //掛載SD卡
- f_mount(fs[1],"1:",1); //掛載FLASH.
- POINT_COLOR=RED;
- while(font_init()) //檢查字庫(kù)
- {
- LCD_ShowString(30,50,200,16,16,"Font Error!");
- delay_ms(200);
- LCD_Fill(30,50,240,66,WHITE);//清除顯示
- }
- }
- void secondMeau(void)
- {
-
-
- }
- //加載鍵盤(pán)界面
- //x,y:界面起始坐標(biāo)
- 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
- }
- }
- }
-
- //按鍵狀態(tài)設(shè)置
- //x,y:鍵盤(pán)坐標(biāo)
- //key:鍵值(0~8)
- //sta:狀態(tài),0,松開(kāi);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:鍵盤(pán)坐標(biāo)
- //返回值:按鍵鍵值(1~9有效;0,無(wú)效)
- u8 py_get_keynum(u16 x,u16 y)
- {
- u16 i,j;
- static u8 key_x=0;//0,沒(méi)有任何按鍵按下;1~9,1~9號(hào)按鍵按下
- 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;//按鍵標(biāo)志位
- u8 inputstr[100]; //最大輸入100個(gè)字符+結(jié)束符
- u8 inputlen; //輸入長(zhǎng)度
- u8 ok=0;
- Init_all();
- if(lcddev.id==0X5310){kbdxsize=86;kbdysize=43;}//根據(jù)LCD分辨率設(shè)置按鍵大小
- else if(lcddev.id==0X5510||lcddev.id==0X1963){kbdxsize=140;kbdysize=70;}
- else {kbdxsize=60;kbdysize=40;}
-
- memset(inputstr,0,7); //全部清零
- inputlen=0; //輸入長(zhǎng)度為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,"關(guān)閉當(dāng)前",16,0);
- delay_ms(1000);
- LCD_Fill(30,130,30+100,140+16,WHITE);
- if(inputlen)
- {
- inputstr[inputlen-1]=' ';//添加結(jié)束符
- inputlen--;
- }
-
- }
- else
- {
- if(key==8)
- {
- Show_Str(30,130,200,16,"進(jìn)入下一功能",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,"設(shè)置地址",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); //顯示有效的數(shù)字串
- }
-
- }
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
LCD顯示.7z
(1.39 MB, 下載次數(shù): 41)
2019-10-21 17:35 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|