找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2301|回复: 2
打印 上一主题 下一主题
收起左侧

STM32 lcd子菜单的实现程序

[复制链接]
跳转到指定楼层
楼主
ID:500655 发表于 2019-10-21 10:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实现了一个stm32 上LCD屏幕的菜单选择

单片机源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"                           
  4. #include "lcd.h"
  5. #include "led.h"
  6. #include "key.h"      
  7. #include "malloc.h"
  8. #include "sdio_sdcard.h"  
  9. #include "w25qxx.h"   
  10. #include "ff.h"  
  11. #include "exfuns.h"   
  12. #include "text.h"  
  13. #include "pyinput.h"
  14. #include "touch.h"       
  15. #include "string.h"           
  16. #include "usmart.h"   




  17. u16 kbdxsize;        //虚拟键盘按键宽度
  18. u16 kbdysize;//虚拟键盘按键高度
  19. u8  aaa;//一级菜单翻转位
  20. vu8 key=0;       
  21. u16 i;





  22. //数字表
  23. const u8* kbd_tbl[9]={"LED1","LED2","LED3","LED4","LED5","LED6","set","fun","close"};
  24. //字符表
  25. const u8* kbs_tbl[9]={"灯1","灯2","灯3","灯4","灯5","灯6","设置","功能","关闭"};

  26. void first_meau_1(void)
  27. {
  28.         POINT_COLOR=RED;
  29.         Show_Str(30,5,200,16,"led灯管控制",16,0);               
  30.         Show_Str(30,20,200,16,"all点亮所有",16,0);
  31.         Show_Str(30,35,200,16,"fun进入功能",16,0);
  32.         Show_Str(30,50,200,16,"close关闭当前",16,0);                     
  33.         Show_Str(30,65,200,16,"circle1:校准  KEY0:切换",16,0);         
  34.         Show_Str(30,90,200,16,"输入:",16,0);
  35.         Show_Str(30,110,200,32,"结果:",16,0);

  36. }

  37. void first_meau_2(void)
  38. {
  39.   POINT_COLOR=RED;
  40.         Show_Str(30,5,200,16,"led control",16,0);               
  41.         Show_Str(30,20,200,16,"all lights on",16,0);
  42.         Show_Str(30,35,200,16,"function",16,0);
  43.         Show_Str(30,50,200,16,"close now",16,0);                             
  44.         Show_Str(30,65,200,16,"circle1:adjust  KEY0:change",16,0);         
  45.         Show_Str(30,90,200,16,"in:",16,0);
  46.         Show_Str(30,110,200,32,"out:",16,0);

  47. }

  48. void Init_all(void)
  49. {
  50.         delay_init();                     //延时函数初始化          
  51.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  52.         uart_init(115200);                 //串口初始化为115200
  53.         usmart_dev.init(72);                //初始化USMART
  54.         KEY_Init();                                        //初始化按键
  55.         LCD_Init();                                           //初始化LCD     
  56.         W25QXX_Init();                                //初始化W25Q128
  57.         tp_dev.init();                                //初始化触摸屏
  58.         my_mem_init(SRAMIN);                //初始化内部内存池
  59.         exfuns_init();                                //为fatfs相关变量申请内存  
  60.         f_mount(fs[0],"0:",1);                 //挂载SD卡
  61.         f_mount(fs[1],"1:",1);                 //挂载FLASH.
  62.         POINT_COLOR=RED;      
  63.         while(font_init())                         //检查字库
  64.         {            
  65.                 LCD_ShowString(30,50,200,16,16,"Font Error!");
  66.                 delay_ms(200);                                  
  67.                 LCD_Fill(30,50,240,66,WHITE);//清除显示             
  68.         }
  69. }


  70. void secondMeau(void)
  71. {
  72.        
  73.        


  74. }
  75. //加载键盘界面
  76. //x,y:界面起始坐标
  77. void py_load_ui(u16 x,u16 y,u8 flag)
  78. {
  79.   
  80.         POINT_COLOR=BLACK;
  81.         LCD_DrawRectangle(x,y,x+kbdxsize*3,y+kbdysize*3);                                                  
  82.         LCD_DrawRectangle(x+kbdxsize,y,x+kbdxsize*2,y+kbdysize*3);                                                  
  83.         LCD_DrawRectangle(x,y+kbdysize,x+kbdxsize*3,y+kbdysize*2);
  84.         POINT_COLOR=BLUE;
  85.         if(flag)
  86. {
  87.                   first_meau_2();
  88.             for(i=0;i<9;i++)
  89.              {
  90.                        Show_Str_Mid(x+(i%3)*kbdxsize,y+4+kbdysize*(i/3),(u8*)kbd_tbl[i],16,kbdxsize);        //Chinese

  91.              }
  92.        
  93. }

  94.   else
  95. {
  96.                   first_meau_1();
  97.                         for(i=0;i<9;i++)
  98.              {
  99.                  Show_Str_Mid(x+(i%3)*kbdxsize,y+kbdysize/2+kbdysize*(i/3),(u8*)kbs_tbl[i],16,kbdxsize);          //English
  100.              }       
  101. }
  102. }
  103.        

  104. //按键状态设置
  105. //x,y:键盘坐标
  106. //key:键值(0~8)
  107. //sta:状态,0,松开;1,按下;
  108. void py_key_staset(u16 x,u16 y,u8 keyx,u8 sta)
  109. {          
  110.         u16 i=keyx/3,j=keyx%3;
  111.         if(keyx>8)
  112.                 return;
  113.         if(sta)
  114.                 LCD_Fill(x+j*kbdxsize+1,y+i*kbdysize+1,x+j*kbdxsize+kbdxsize-1,y+i*kbdysize+kbdysize-1,GREEN);
  115.         else
  116.           LCD_Fill(x+j*kbdxsize+1,y+i*kbdysize+1,x+j*kbdxsize+kbdxsize-1,y+i*kbdysize+kbdysize-1,WHITE);
  117.        
  118. }


  119. //得到触摸屏的输入
  120. //x,y:键盘坐标
  121. //返回值:按键键值(1~9有效;0,无效)
  122. u8 py_get_keynum(u16 x,u16 y)
  123. {
  124.         u16 i,j;
  125.         static u8 key_x=0;//0,没有任何按键按下;1~9,1~9号按键按下
  126.         u8 key=0;
  127.         tp_dev.scan(0);                  
  128.         if(tp_dev.sta&TP_PRES_DOWN)                        //触摸屏被按下
  129.         {       
  130.                 for(i=0;i<3;i++)
  131.                 {
  132.                         for(j=0;j<3;j++)
  133.                         {
  134.                                  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))
  135.                                 {       
  136.                                         key=i*3+j+1;         
  137.                                         break;                           
  138.                                 }
  139.                         }
  140.                        
  141.                         if(key)
  142.                         {          
  143.                                 if(key_x==key)key=0;
  144.                                 else
  145.                                 {
  146.                                         py_key_staset(x,y,key_x-1,0);
  147.                                         key_x=key;
  148.                                         py_key_staset(x,y,key_x-1,1);
  149.                                 }
  150.                                 break;
  151.                         }
  152.                 }  
  153.         }
  154.        
  155.         else if(key_x)
  156.         {
  157.                 py_key_staset(x,y,key_x-1,0);
  158.                 key_x=0;
  159.         }
  160.         return key; //得到key值
  161. }
  162.        

  163. int main(void)
  164. {         
  165.         u8 i=0;                                  
  166.         u8 circle1,circle2,circle3;//按键标志位
  167.         u8 inputstr[100];                //最大输入100个字符+结束符
  168.         u8 inputlen;                //输入长度         
  169.   u8  ok=0;
  170.         Init_all();
  171.         if(lcddev.id==0X5310){kbdxsize=86;kbdysize=43;}//根据LCD分辨率设置按键大小
  172.         else if(lcddev.id==0X5510||lcddev.id==0X1963){kbdxsize=140;kbdysize=70;}
  173.         else {kbdxsize=60;kbdysize=40;}
  174.        
  175.         memset(inputstr,0,7);        //全部清零
  176.         inputlen=0;                                //输入长度为0
  177.        
  178.                         while(1)
  179.                 {
  180.                                        
  181.                         circle1=KEY_Scan(0);
  182.                         circle2 = circle1;
  183.                         while(circle2==KEY0_PRES)
  184.                          {
  185.                                  
  186.                                  circle2=KEY_Scan(0);
  187.                                  
  188.                          }
  189.                         if(circle1==KEY0_PRES)
  190.                         {
  191.                                  ok =~ok;
  192.                                  LCD_Clear(WHITE);
  193.                          }
  194.                        
  195.                                 i++;
  196.                                 delay_ms(10);
  197.                                
  198.                         if(aaa==1)
  199.                         {
  200.                                 secondMeau();
  201.                                 circle3=KEY_Scan(0);
  202.                                 if(circle3==KEY1_PRES)
  203.                                  {
  204.                                          aaa=0;
  205.                                  }       
  206.                         }
  207.                                  
  208.                        
  209.                         else
  210.                         {
  211.                                  py_load_ui(30,195,ok);
  212.                                  key=py_get_keynum(30,195);
  213.                                                          if(key)
  214.                                          {
  215.                                                          if(key==9)//删除
  216.                                                  {
  217.                                                                  Show_Str(30,130,200,16,"关闭当前",16,0);
  218.                                                                  delay_ms(1000);
  219.                                                                  LCD_Fill(30,130,30+100,140+16,WHITE);
  220.                                                                         if(inputlen)
  221.                                                                         {
  222.                                                                                 inputstr[inputlen-1]=' ';//添加结束符
  223.                                                                                 inputlen--;
  224.                                                                         }
  225.                                                
  226.                                                         }
  227.                                                         else
  228.                                                 {
  229.                                                                 if(key==8)
  230.                                                                         {
  231.                                                                                 Show_Str(30,130,200,16,"进入下一功能",16,0);
  232.                                                                                 delay_ms(1000);
  233.                                                                                 LCD_Fill(30,130,30+100,140+16,WHITE);
  234.                                                                                 LCD_Fill(30+40,90,30+40+48,110+16,WHITE);        //清除之前的显示
  235.                                                                                 delay_ms(1000);
  236.                                                                                 LCD_Fill(0,0,2000,2000,WHITE);
  237.                                                                                 Show_Str(30+40,90,200,16," ",16,0);
  238.                                                                                 aaa=1;
  239.                                                                         }
  240.                                                        
  241.                                                                 if(key==7)
  242.                                                                         {
  243.                                                                                 Show_Str(30,130,200,16,"设置地址",16,0);
  244.                                                                                 delay_ms(1000);
  245.                                                                                 Show_Str(30+40,90,200,16," ",16,0);
  246.                                                                                
  247.                                                                         }
  248.                                
  249.                                                 inputstr[inputlen]=key+'0';//输入字符
  250.                                                 if(inputlen<100)
  251.                                                 inputlen++;
  252.                                                
  253.                                                        
  254.                                         }
  255.                                        
  256.                                
  257.                                        
  258.                                         LCD_Fill(30+40,90,30+40+48,110+16,WHITE);        //清除之前的显示
  259.                                         if(key!=8&&key!=7)
  260.                                         {
  261.                                                  Show_Str(30+40,90,200,16,inputstr,16,0);        //显示有效的数字串
  262.                                          }
  263.                                        


  264.                                 }                                                                                                                
  265. }












  266.      }
  267.         }
复制代码

所有资料51hei提供下载:
LCD显示.7z (1.39 MB, 下载次数: 41)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:618759 发表于 2019-11-24 19:28 | 只看该作者
解决燃眉之急
回复

使用道具 举报

板凳
ID:265664 发表于 2020-4-11 19:37 | 只看该作者
正好需要,,多谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表