搜索
bottom↓
回复: 19

[抛砖]我也发一个简单的带字库的LCD12864菜单

  [复制链接]

出0入55汤圆

发表于 2020-4-27 18:17:58 | 显示全部楼层 |阅读模式
本帖最后由 jssd 于 2020-4-29 12:24 编辑

增加:19楼更新了程序,上传了整个工程
这东西坛子里做的人太多了。但对于我这小白来说,一直用不了别人的,感觉还是用自己的顺手一些,所以搞了个简单的,满足平时使用。当然,还可以扩展
底层驱动:
  1. //以下头文件
  2. #ifndef __LCD12864_ZK_H
  3. #define __LCD12864_ZK_H

  4. #include "main.h"

  5. //数据显示长度
  6. #define  DISP_MASK           0x1F
  7. #define  DISP_ALL           0x00

  8. //进制格式
  9. #define  FORMAT_MASK           0x80
  10. #define  FORMAT_D           0x00 //十进制Decimal
  11. #define  FORMAT_H           0x80 //十六进制Hexadecimal

  12. //对齐方式
  13. #define  ALIGN_MASK           0x60
  14. #define  ALIGN_R                   0x00 //右对齐
  15. #define  ALIGN_L                   0x20 //左对齐
  16. #define  ALIGN_M                   0x40 //中间对齐

  17. void LCD_Init(void);
  18. unsigned char LCD_ShowString(unsigned char x,unsigned char y,const char *pStr);
  19. unsigned char LCD_ShowNumber(unsigned char x,unsigned char y,long num,unsigned char param,char fill);
  20. void LCD_SetWhite(unsigned char x,unsigned char y,unsigned char width);
  21. void LCD_SetBG(unsigned char x,unsigned char y,unsigned char w,unsigned char bg);
  22. void LCD_Process(void);
  23. void LCD_ClearAll(void);

  24. #endif


  25. //以下C文件
  26. #include "main.h"

  27. #define LCD_RST_1                P20 = 1
  28. #define LCD_RST_0                P20 = 0

  29. #define LCD_CS_1                P26 = 1
  30. #define LCD_CS_0                P26 = 0

  31. #define LCD_CLK_1                P24 = 1
  32. #define LCD_CLK_0                P24 = 0

  33. #define LCD_SID_1                P25 = 1
  34. #define LCD_SID_0                P25 = 0



  35. static void write(char cmd, unsigned char dat) //写指令或数据  数据cmd=1:0xfa 命令cmd=0:0xf8
  36. {        unsigned char i,j,Temp;
  37.        
  38.         LCD_CS_1;
  39.         LCD_CLK_0;
  40.        
  41.         for(j=0;j<3;j++){             
  42.                          if (j==0){ Temp =( cmd? 0xfa:0xf8);}
  43.                 else if (j==1){ Temp =((dat<<0) & 0xf0);}
  44.                 else if (j==2){ Temp =((dat<<4) & 0xf0);}
  45.                 for(i=0;i<8;i++){  
  46.                         (Temp&0x80)?(LCD_SID_1):(LCD_SID_0);  Temp<<=1; delay_us(1); //左移
  47.                         LCD_CLK_1; //delay_us(1);   //_nop_();_nop_();//移入  
  48.                         LCD_CLK_0; //delay_us(1);   //_nop_();_nop_();_nop_(); //读出
  49.                 }
  50.         }
  51.         LCD_CS_0;
  52. }       

  53. unsigned char SetWdat[64];//反白显示缓存
  54. unsigned char SetWdat_bak[64];//反白显示缓存

  55. //设置反白区域
  56. void LCD_SetBG(unsigned char x,unsigned char y,unsigned char w,unsigned char bg)
  57. {
  58.         unsigned char i;
  59.         if(x>15||y>3||w==0) return; //超出范围
  60.         if(w+x>16) w = 16-x;
  61.         for(i=0;i<w;i++){
  62.                 SetWdat[(y<<4)+x+i] = bg;
  63.         }
  64. }

  65. //反白显示2字节
  66. void LCD_ShowBG2Byte(unsigned char n)
  67. {
  68.         unsigned char Ax[] = {0x80,0x80,0x88,0x88};
  69.         unsigned char Ay[] = {0x80,0x90,0x80,0x90};
  70.         unsigned char j;
  71.         unsigned char x = ((n&0x0f)>>1);
  72.         unsigned char y = (n>>4);
  73.        
  74.         write(0,0x34); write(0,0x36); //打开GGRAM
  75.         for(j=0;j<16;j++){
  76.                 write(0,Ay[y]+j); //y
  77.                 write(0,Ax[y]+x); //x
  78.                 write(1,SetWdat[n]);
  79.                 write(1,SetWdat[n+1]);
  80.         }
  81.         write(0,0x30); //关闭GGRAM
  82. }

  83. void LCD_BGProcess(void) //反白显示
  84. {
  85.         unsigned char i;
  86.         for(i=0;i<64;i+=2){
  87.                 if((SetWdat_bak[i]!=SetWdat[i])||(SetWdat_bak[i+1]!=SetWdat[i+1])){ SetWdat_bak[i] = SetWdat[i]; SetWdat_bak[i+1] = SetWdat[i+1];
  88.                         LCD_ShowBG2Byte(i);
  89.                 }
  90.         }
  91. }


  92. unsigned char LCDdat[64];//显示缓存
  93. unsigned char LCDdat_bak[64];//显示缓存备份

  94. void LCD_Process(void) //模拟刷屏12864
  95. {       
  96.         unsigned char Addr[] = {0x80,0x90,0x88,0x98};
  97.         unsigned char i;
  98.        
  99.         for(i=0;i<64;i+=2){
  100.                 if((LCDdat_bak[i]!=LCDdat[i])||(LCDdat_bak[i+1]!=LCDdat[i+1])){LCDdat_bak[i] = LCDdat[i];LCDdat_bak[i+1] = LCDdat[i+1];
  101.                         write(0,Addr[i>>4]+((i&0x0f)>>1)); //写地址 控制光标
  102.                         write(1,LCDdat[i]);   //数据一次要连写两个
  103.                         write(1,LCDdat[i+1]); //数据一次要连写两个
  104.                 }
  105.         }
  106.         LCD_BGProcess();
  107. }

  108. //void LCD_RefreshALL(void) //模拟刷屏12864
  109. //{       
  110. //        unsigned char Addr[] = {0x80,0x90,0x88,0x98};
  111. //        unsigned char i,j;
  112. //       
  113. //        for(i=0;i<4;i++){ //送四行汉字 //一次送一个汉字 (两个字节)
  114. //                write(0,Addr[i]); //先送地址后送16个字符
  115. //                for(j=0;j<16;j++){write(1,LCDdat[(i*16)+j]);}
  116. //        }
  117. //}




  118. void LCD_ClearGM(void)
  119. {
  120.         unsigned char i,j;
  121.         write(0,0x34);
  122.         write(0,0x36);
  123.         for(j=0;j<32;j++)
  124.         {
  125.                 write(0,0x80+j);
  126.                 write(0,0x80);
  127.                 for(i=0;i<16;i++)
  128.                 {
  129.                         write(1,0x00);
  130.                 }
  131.         }
  132.         for(j=0;j<32;j++)
  133.         {
  134.                 write(0,0x80+j);
  135.                 write(0,0x88);
  136.                 for(i=0;i<16;i++)
  137.                 {
  138.                         write(1,0x00);
  139.                 }
  140.         }
  141.         write(0,0x30);
  142. }

  143. //******************** 显示字符串 ***********************//
  144. //**  x:横坐标(0~15)  y:纵坐标(0~3)  显示中文时注意从x坐标偶数写,否则乱码
  145. unsigned char LCD_ShowString(unsigned char x,unsigned char y,const char *pStr)
  146. {
  147.         unsigned char i;
  148.         unsigned int strLen = strlen(pStr);        //字符串长度用 strlen(); 类型长度 sizeof();
  149.         if(strLen<=0||x>15||y>3) return 0; //超出范围
  150.        
  151.         if(strLen+x>16) strLen = 16-x;
  152.         for(i=0;i<strLen;i++){ //只在一行显示,超出部分丢弃
  153.                 LCDdat[16*y+x+i] = pStr[i];
  154.         }
  155.         return strLen;
  156. }

  157. void LCD_ClearAll(void)
  158. {
  159.         memset(LCDdat,' ',sizeof(LCDdat));
  160.         memset(SetWdat,0x00,sizeof(SetWdat));
  161. }


  162. //******************** 显示数字 ***********************//
  163. //**  x:横坐标(0~15)  y:纵坐标(0~3)  
  164. //**  param:
  165. //**  (bit(7) 0:十进制显示 1:十六进制显示)
  166. //**  (bit(6~5) 00:右对齐 x为右边坐标,字符向左扩展 01:左对齐 x为左点坐标,字符向右扩展 10:中间对齐 x为中点坐标,字符向两边扩展)
  167. //**  (bit(4~0)显示的长度0~31 0:显示全部)
  168. //**  fill: 空白处填充的字符,注意转义字符
  169. unsigned char LCD_ShowNumber(unsigned char x,unsigned char y,long num,unsigned char param,char fill)
  170. {
  171.         unsigned char i;
  172.         char strBuff[32];        //一行字符缓存
  173.         char disBuff[32];        //一行字符缓存用于显示
  174.         int strLen = 0;
  175.         unsigned char disLen = (param&DISP_MASK);
  176.        
  177.         if((x>15)||(y>3)) return 0; //超出范围
  178.        
  179.         if(param&FORMAT_MASK){ //十六进制显示
  180.                 strLen = sprintf(strBuff,"%lX",num);
  181.         }
  182.         else{ //十进制显示
  183.                 strLen = sprintf(strBuff,"%ld",num);
  184.         }
  185.        
  186.         if(strLen<=0) return 0; //错误
  187.        
  188.         if(disLen==DISP_ALL) disLen = strLen; //数据长度为0则全部显示
  189.        
  190.         if((param&ALIGN_MASK)==ALIGN_R){//右对齐
  191.                 if(x+1<disLen) disLen = x+1;
  192.                 for(i=0;i<disLen;i++){
  193.                         if(i<strLen) disBuff[disLen-1-i] = strBuff[strLen-1-i];
  194.                         else disBuff[disLen-1-i] = fill;
  195.                 }
  196.                 x = x+1-disLen;
  197.         }
  198.         else if((param&ALIGN_MASK)==ALIGN_L){//左对齐
  199.                 for(i=0;i<disLen;i++){
  200.                         if(i<strLen) disBuff[i] = strBuff[i];
  201.                         else disBuff[i] = fill;
  202.                 }
  203.         }
  204.         else if((param&ALIGN_MASK)==ALIGN_M){//中间对齐
  205.                 uint8_t disM = (disLen>>1); //显示窗口的中间位置
  206.                 uint8_t strM = (strLen>>1); //数据的中间位置
  207.                 for(i=0;i<disM;i++){ //前半部分  右对齐
  208.                         if(i<strM) disBuff[disM-1-i] = strBuff[strM-1-i];
  209.                         else disBuff[disM-1-i] = fill;
  210.                 }
  211.                 for(i=disM;i<disLen;i++){ //后半部分 左对齐
  212.                         if(strM+i-disM<strLen) disBuff[i] = strBuff[strM+i-disM];
  213.                         else disBuff[i] = fill;
  214.                 }
  215.         }
  216.         disBuff[disLen] = '\0'; //末尾加结束符
  217.         return (LCD_ShowString(x,y,disBuff));
  218. }

  219. /**********************************
  220.           LCD初始化
  221. **********************************/

  222. void LCD_Init(void)
  223. {
  224.         memset(LCDdat,' ',sizeof(LCDdat));
  225.         memset(LCDdat_bak,0x00,sizeof(LCDdat_bak));
  226.         memset(SetWdat,0x00,sizeof(SetWdat));       
  227.         memset(SetWdat_bak,0x00,sizeof(SetWdat_bak));
  228.        
  229.         LCD_RST_0;         delay_ms(100);
  230.         LCD_RST_1;         //delay_ms(100);//复位
  231.         write(0,0x30);  //8 位介面,基本指令集
  232.         write(0,0x0c);  //显示打开,光标关,反白关
  233.         write(0,0x01);  //清屏,将DDRAM的地址计数器归零
  234. //        delay_ms(100);
  235.         LCD_ClearGM();
  236.        
  237. //        LCD_SetBG(3,1,5,1);
  238. }

复制代码


菜单层:
  1. //以下为头文件
  2. #ifndef __HAL_MENU_H__
  3. #define __HAL_MENU_H__

  4. #ifdef __cplusplus  
  5. extern "C" {  
  6. #endif  

  7. #include "main.h"

  8. #ifdef __cplusplus
  9. }
  10. #endif


  11. #define UBOUND(__ARR)    (sizeof(__ARR)/sizeof(__ARR[0]))
  12.        
  13. //菜单项类型
  14. #define        STRUCT_MASK        0x80        //结构掩码
  15. #define        STRUCT_UD        0x80        //上下结构
  16. #define        STRUCT_LR        0x00        //左右结构

  17. #define        TYPE_MASK        0x70        //类型掩码
  18. #define        label                0x00        //只显标题
  19. #define        edit                0x10        //label + num
  20. #define        text                0x20        //label + str
  21. #define        editL                0x30        //label + long num 数字可一位一位改变

  22. #define        X_MASK        0x0f                //x轴坐标掩码

  23. typedef struct __item                 item_t;         //菜单项(item_t)
  24. typedef struct __page                 page_t;         //页面(page_t)
  25. typedef struct __engine         engine_t;         //引擎(engine_t)

  26. //菜单项(item_t)
  27. typedef int8_t item_handler_t(item_t *);         //菜单项执行函数
  28. struct __item {
  29.         uint8_t                                type;                 //菜单项类型 + 低4位为x轴偏移
  30.         const char                        *title;                //标题  null:无标题
  31.         const void                        *mem;                //变量指针
  32.         page_t                                *child;                //子页面
  33.         item_handler_t                 *fnHandle;                //菜单项执行函数
  34. };

  35. //页面(page_t)
  36. struct __page {
  37.         char                        *title;        //标题  null:无标题
  38.         item_t                        *items;        //!< page item list //菜单项数组
  39.         uint8_t                        count;        //!< page item count //菜单项个数
  40.         page_t                        *parent;        //!< parent page;   //父页面
  41. };

  42. //引擎(engine_t)
  43. struct __engine {
  44.     const page_t    *curPage;
  45.         uint8_t                        curItemIndex;
  46.         uint8_t                        param;
  47. };


  48. void Menu_Process(void);

  49. //**********************************************************************************//









  50. #endif


  51. //以下为C文件
  52. #include "main.h"


  53. static engine_t engine = { pageMain,0,0 };

  54. //void LCD_SetBG(unsigned char x,unsigned char y,unsigned char w,unsigned char bg)
  55. void Menu_ShowItem(engine_t* ptEngine)
  56. {
  57.         uint8_t i;
  58.         uint8_t lineIndex = 0;
  59.         uint8_t cursorX = 0,cursorY = 0,cursorL = 16;
  60.         page_t *ptPage = ptEngine->curPage;
  61.        
  62.         LCD_ClearAll();
  63.        
  64.         if(ptPage->title){
  65.                 LCD_ShowString(0,lineIndex++,ptPage->title);
  66.                 cursorY = 1;
  67.         }
  68.        
  69.         for(i=engine.curItemIndex;i<ptPage->count;i++){
  70.                 item_t *pItem = ptPage->items + i;
  71.                 uint8_t type = pItem->type&TYPE_MASK;
  72.                 uint8_t x = pItem->type&X_MASK;
  73.                
  74.                 switch(type){
  75.                         case label:{
  76.                                 LCD_ShowString(x,lineIndex,pItem->title);
  77.                                 lineIndex++;
  78.                                 break;}
  79.                         case edit:{
  80.                                 uint8_t len = LCD_ShowString(x,lineIndex,pItem->title);
  81.                                 len = LCD_ShowNumber(15,lineIndex,*((const uint8_t*)(pItem->mem)),0,' ');
  82.                                 if((lineIndex==cursorY) && (ptEngine->param&0x80)){
  83.                                         cursorL = len; cursorX = 16-cursorL;
  84.                                 }
  85.                                 lineIndex++;
  86.                                 break;}
  87.                         case text:{
  88.                                 uint8_t len = LCD_ShowString(x,lineIndex,pItem->title);
  89.                                 len = LCD_ShowString(16-strlen((const char*)(pItem->mem)),lineIndex,(const char*)(pItem->mem));
  90.                                 lineIndex++;
  91.                                 break;}
  92.                         default:break;
  93.                         case editL:{
  94.                                
  95.                                 break;}
  96.                 }
  97.                 if(lineIndex>3) break;
  98.         }
  99.        
  100.         //光标
  101.         LCD_SetBG(cursorX,cursorY,cursorL,0xff);
  102. }

  103. void Menu_Process(void)
  104. {
  105.         static uint8_t state=0;
  106.         static uint32_t tick = 0;
  107.        
  108.         static uint8_t keyU,keyD,keyE,keyC;
  109.        
  110.         static uint8_t parentIndex[100]; //几层页面
  111.         static uint8_t dex=0;
  112.        
  113.         switch(state){
  114.                 enum {
  115.                         START = 0,
  116.                         KEY_PROCESS,
  117.                         RUN_ITEM_HANDLER
  118.                 };
  119.                 case START: state++;
  120.                 case KEY_PROCESS:{
  121.                         if(keyU!=SL_GetEvent(idSL_UP)){ keyU = SL_GetEvent(idSL_UP);
  122.                                 if(keyU==SL_PRESS_DOWN){
  123.                                         if(engine.curItemIndex>0) engine.curItemIndex--;
  124.                                         else engine.curItemIndex = 7;
  125.                                 }
  126.                         }else if(keyD!=SL_GetEvent(idSL_DOWN)){ keyD = SL_GetEvent(idSL_DOWN);
  127.                                 if(keyD==SL_PRESS_DOWN){
  128.                                         if(++engine.curItemIndex>7) engine.curItemIndex = 0;
  129.                                 }
  130.                         }else if(keyE!=SL_GetEvent(idSL_ENTER)){ keyE = SL_GetEvent(idSL_ENTER);
  131.                                 if(keyE==SL_PRESS_DOWN){
  132.                                         item_t *pItem = &(engine.curPage->items[engine.curItemIndex]);
  133.                                         if(pItem->fnHandle){
  134.                                                 engine.param = 0x80;
  135.                                                 state = RUN_ITEM_HANDLER;
  136.                                         }else if(pItem->child){
  137.                                                 engine.curPage = pItem->child;
  138.                                                 parentIndex[dex++] = engine.curItemIndex;
  139.                                                 engine.curItemIndex = 0;
  140.                                         }
  141.                                 }
  142.                         }else if(keyC!=SL_GetEvent(idSL_ESC)){ keyC = SL_GetEvent(idSL_ESC);
  143.                                 if(keyC==SL_PRESS_DOWN){
  144.                                         page_t *ptPage = engine.curPage;
  145.                                         if(ptPage->parent){
  146.                                                 engine.curPage = ptPage->parent;
  147.                                                 engine.curItemIndex = parentIndex[--dex];
  148.                                         }
  149.                                 }
  150.                         }
  151.                         break;}
  152.                 case RUN_ITEM_HANDLER:{
  153.                         item_t *pItem = &(engine.curPage->items[engine.curItemIndex]);
  154.                         int8_t ret = pItem->fnHandle(pItem);
  155.                         if(ret>0){
  156.                                 engine.param = 0x00;
  157.                                 state = START;
  158.                         }
  159.                         break;}
  160.         }
  161.        
  162.         if(Sys_GetTick()-tick>=_LCD12864_CYCLE){ tick = Sys_GetTick();
  163.                 Menu_ShowItem(&engine);
  164.                 LCD_Process();
  165.         }
  166. }

复制代码


app使用
  1. //以下为头文件
  2. #ifndef __APP_MENU_H__
  3. #define __APP_MENU_H__

  4. #ifdef __cplusplus  
  5. extern "C" {  
  6. #endif  

  7. #include "main.h"

  8. #ifdef __cplusplus
  9. }
  10. #endif

  11. extern const page_t pageMain[];

  12. #endif



  13. //以下为C文件
  14. /*============================ INCLUDES ======================================*/
  15. #include "main.h"

  16. uint8_t num = 123;


  17. const char str[2][3] = {
  18.         "否",
  19.         "是",
  20.         };
  21. uint8_t strSlect = 0;
  22. char pStr[3] = "否";


  23.        
  24. int8_t cb_ChangeNum(item_t* pItem)
  25. {
  26.         static uint8_t keyU=0,keyD=0,keyE=0,keyC=0;
  27.        
  28.         if(keyU!=SL_GetEvent(idSL_UP)){ keyU = SL_GetEvent(idSL_UP);
  29.                 if(keyU==SL_PRESS_DOWN){
  30.                         num++;
  31.                 }
  32.         }else if(keyD!=SL_GetEvent(idSL_DOWN)){ keyD = SL_GetEvent(idSL_DOWN);
  33.                 if(keyD==SL_PRESS_DOWN){
  34.                         num--;
  35.                 }
  36.         }else if(keyE!=SL_GetEvent(idSL_ENTER)){ keyE = SL_GetEvent(idSL_ENTER);
  37.                 if(keyE==SL_PRESS_DOWN){
  38.                         return 1;
  39.                 }
  40.         }else if(keyC!=SL_GetEvent(idSL_ESC)){ keyC = SL_GetEvent(idSL_ESC);
  41.                 if(keyC==SL_PRESS_DOWN){
  42.                         return 1;
  43.                 }
  44.         }
  45.         return 0;
  46. }
  47. int8_t cb_ChangeCheck(item_t* pItem)
  48. {
  49. //        static uint8_t keyU,keyD,keyE,keyC;
  50.         if(++strSlect>=2) strSlect = 0;
  51.         memcpy(pStr,str[strSlect],strlen(pStr));
  52.         return 1;
  53. }

  54. //********************* 菜单 ***********************//
  55. const page_t page2[];
  56. const page_t page3[];

  57. //********************* 菜单项 ***********************//
  58. const item_t itemMain[] = {
  59.         label,"菜单01",0,page2,0,
  60.         label,"菜单02",0,page2,0,
  61.         label,"菜单03",0,page2,0,
  62.         label,"菜单04",0,page2,0,
  63.         label,"菜单05",0,page2,0,
  64.         label,"菜单06",0,page2,0,
  65.         edit ,"菜单07",(uint8_t*)&num,0,cb_ChangeNum,
  66.         text ,"菜单08",(const char*)pStr,page2,cb_ChangeCheck,
  67. };

  68. const item_t item2[] = {
  69.         label,"子菜单01",0,page3,0,
  70.         label,"子菜单02",0,page3,0,
  71.         label,"子菜单03",0,page3,0,
  72.         label,"子菜单04",0,page3,0,
  73.         label,"子菜单05",0,page3,0,
  74.         label,"子菜单06",0,page3,0,
  75.         edit ,"子菜单07",(uint8_t*)&num,0,cb_ChangeNum,
  76.         text ,"子菜单08",(const char*)pStr,0,cb_ChangeCheck,
  77. };

  78. const item_t item3[] = {
  79.         label,"子子菜单01",0,0,0,
  80.         label,"子子菜单02",0,0,0,
  81.         label,"子子菜单03",0,0,0,
  82.         label,"子子菜单04",0,0,0,
  83.         label,"子子菜单05",0,0,0,
  84.         label,"子子菜单06",0,0,0,
  85.         edit ,"子子菜单07",(uint8_t*)&num,0,cb_ChangeNum,
  86.         text ,"子子菜单08",(const char*)pStr,0,cb_ChangeCheck,
  87. };

  88. //********************* 页面 ***********************//
  89. const page_t pageMain[] = {
  90.         "===== 页面1 ====",itemMain,UBOUND(itemMain),0,
  91. };

  92. const page_t page2[] = {
  93.         "===== 页面2 ====",item2,UBOUND(item2),pageMain,
  94. };

  95. const page_t page3[] = {
  96.         0,item3,UBOUND(item3),page2,
  97. };

复制代码


几张效果图,请忽略渣渣的拍照技术。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入12汤圆

发表于 2020-4-27 18:32:59 | 显示全部楼层
虽然用不到,围观学习,感谢楼主分享。

出590入992汤圆

发表于 2020-4-27 19:32:42 | 显示全部楼层
最近正在研究,收藏收藏。

出0入170汤圆

发表于 2020-4-27 21:49:40 | 显示全部楼层
mark一下。以后可能会使用到。

出0入0汤圆

发表于 2020-4-27 22:02:47 来自手机 | 显示全部楼层
mark一下。以后可能会使用到。

出5入8汤圆

发表于 2020-4-28 09:44:32 | 显示全部楼层
围观学习

出0入0汤圆

发表于 2020-4-28 10:39:04 | 显示全部楼层
mark一下。以后可能会使用到。

出210入8汤圆

发表于 2020-4-28 10:46:44 | 显示全部楼层
留个爪印,以后肯定用的到,谢谢。

出0入55汤圆

 楼主| 发表于 2020-4-28 11:00:23 | 显示全部楼层
改良了一下,主要是查询按键改得用得更舒服一点,看下面的帖子
[分享]用坛子里各位大侠的按键程序,改成了一个自己想要的,放上来给各位参考和拍砖
https://www.amobbs.com/thread-5732778-1-1.html
(出处: amobbs.com 阿莫电子论坛)

出0入0汤圆

发表于 2020-4-28 14:49:23 | 显示全部楼层
学习一下           

出0入0汤圆

发表于 2020-4-28 16:37:36 | 显示全部楼层
LCD菜单,标记。谢谢分享

出0入0汤圆

发表于 2020-4-28 16:48:55 | 显示全部楼层
LCD菜单,标记下,手里还有19264的屏。谢谢分享

出0入0汤圆

发表于 2020-4-28 16:49:58 | 显示全部楼层
围观学习!!!

出0入4汤圆

发表于 2020-4-28 17:36:47 | 显示全部楼层
不错,去年我也写了一个类似树型结构+回调函数的菜单

出0入0汤圆

发表于 2020-4-28 18:39:21 来自手机 | 显示全部楼层
标记一下

出0入0汤圆

发表于 2020-4-28 22:19:34 | 显示全部楼层
菜单很通用,非常适用嵌入式系统

出0入76汤圆

发表于 2020-4-28 23:26:12 | 显示全部楼层
感谢分享,就喜欢这种简洁简单明了的的东西, 很多时候不想把一些简单的东西越搞越复杂

出50入4汤圆

发表于 2020-4-28 23:34:56 来自手机 | 显示全部楼层
本帖最后由 zhuyi25762 于 2020-4-28 23:36 编辑

记好,现在还没看明白,慢慢消化。。可否来个上面测试的工程。。测试一下

出0入55汤圆

 楼主| 发表于 2020-4-29 12:23:23 | 显示全部楼层
zhuyi25762 发表于 2020-4-28 23:34
记好,现在还没看明白,慢慢消化。。可否来个上面测试的工程。。测试一下 ...

当然可以。
楼主位的程序有点问题:
1、edit在显示数据的时候,被定义成uint8_t*了,造成显示的时候只显示了低8位。
2、text显示时还要给它一个字符串缓存,每次改变还要自己填充缓存,不顺眼,要的是自动
解决方法之一:
1、显示数据只能在type里加上识别,代表是什么类型的数据。
2、显示test时,增加了一个const char* ,根据上面的数据作索引显示字符串,比如 "是"“否”“打开”“关闭”等等,当然,现在这些字符串长度要一样。。。
目的:
        就是不想再去参与界面的东西,只要操作数据,逻辑与界面完全脱钩,下面是最新的程序,编译好的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入55汤圆

 楼主| 发表于 2020-4-29 13:24:58 | 显示全部楼层
在19楼的版本中,增加启动页面的回调函数,用来初始化页面或者干其他事情。当然,要用的时候先注册一下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 04:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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