搜索
bottom↓
回复: 12

有没有基于LED数码管及I/O按键类的轻量型GUI

[复制链接]

出0入0汤圆

发表于 2019-8-22 15:20:35 | 显示全部楼层 |阅读模式
  每次写这类的显示设定操作都很痛苦,自己写的可移植性太低

出0入0汤圆

发表于 2019-8-22 15:39:23 | 显示全部楼层
同问,LZ找到共享一下:)

出0入93汤圆

发表于 2019-8-22 16:02:27 | 显示全部楼层
搭车问有没有基于LED指示灯及I/O按键的超轻量型GUI

出0入0汤圆

发表于 2019-8-22 16:06:45 来自手机 | 显示全部楼层
关注一下

出10入0汤圆

发表于 2019-8-22 16:23:45 | 显示全部楼层
不管是现成的GUI还是啥,其实最终都不会轻松。点几下就OK的只是界面。工作还是要做的!

出0入0汤圆

 楼主| 发表于 2019-8-22 16:31:58 | 显示全部楼层
uchar KeyFuncIndex=0;
//uchar KeyFuncIndexNew=0;

void (*KeyFuncPtr)(); //按键功能指针

typedef struct
{
uchar KeyStateIndex; //当前状态索引号
uchar KeyDnState; //按下"向下"键时转向的状态索引号
uchar KeyUpState; //按下"向上"键时转向的状态索引号
uchar KeyCrState; //按下"回车"键时转向的状态索引号
void (*CurrentOperate)(); //当前状态应该执行的功能操作
} KbdTabStruct;

KbdTabStruct code KeyTab[SIZE_OF_KEYBD_MENU]=
{
{ 0, 0, 0, 1,(*DummyJob)},//顶层

{ 1, 2, 0, 3,(*DspUserInfo)},//第二层
{ 2, 1, 1, 9,(*DspServiceInfo)}, //第二层

{ 3, 0, 0, 1,(*DspVoltInfo)},//第三层>>DspUserInfo的展开
{ 4, 0, 0, 1,(*DspCurrInfo)},//第三层>>DspUserInfo的展开
{ 5, 0, 0, 1,(*DspFreqInfo)},//第三层>>DspUserInfo的展开
{ 6, 0, 0, 1,(*DspCableInfo)},//第三层>>DspUserInfo的展开
...........
{ 9, 0, 0, 1,(*DspSetVoltLevel)}//第三层>>DspServiceInfo的展

..........
};

void GetKeyInput(void)
{
uchar KeyValue;
KeyValue=P1&0x07; //去掉高5bit
delay(50000);
switch(KeyValue)
{
case 1: //回车键,找出新的菜单状态编号
{
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyCrState;
break;
}
case 2: //向上键,找出新的菜单状态编号
{
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState;
break;
}
case 4: //向下键,找出新的菜单状态编号
{
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyDnState;
break;
}
default: //按键错误的处理
......
break;
}
KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate;
(*KeyFuncPtr)();//执行当前按键的操作
}
————————————————
一直都是用这个,但感觉这么多年过去了,应该有更好的了吧

出0入0汤圆

发表于 2019-8-22 17:25:34 来自手机 | 显示全部楼层
搭车问一下,有同样需求

出110入8汤圆

发表于 2019-8-22 17:42:48 | 显示全部楼层
坛子里面有一个哥们弄了一个类似的,https://www.amobbs.com/forum.php ... =%E8%8F%9C%E5%8D%95

出0入59汤圆

发表于 2019-8-22 17:59:04 | 显示全部楼层
李贝 发表于 2019-8-22 16:31
uchar KeyFuncIndex=0;
//uchar KeyFuncIndexNew=0;

我以前用个这个结构; 使用中发现很难读懂和维护程序的菜单关系层次(特别是别人写的程序); 那个结构体一堆的 0,呀,1呀 2呀,看一会儿就犯晕;

出0入20汤圆

发表于 2019-8-22 21:52:21 | 显示全部楼层
polarbear 发表于 2019-8-22 17:59
我以前用个这个结构; 使用中发现很难读懂和维护程序的菜单关系层次(特别是别人写的程序); 那个结构体 ...

写宏定义包起来啊,所有给人看的常量最后到CPU那里都是0和1,所以程序主要还是写给人看的~

出0入0汤圆

 楼主| 发表于 2019-8-23 13:57:55 | 显示全部楼层
angler12 发表于 2019-8-22 17:42
坛子里面有一个哥们弄了一个类似的,https://www.amobbs.com/forum.php?mod=viewthread&tid=5577786&highli ...

用proteus 仿真了一下,好像是一层菜单.不过代码写的真好,高手!

出0入0汤圆

发表于 2019-8-24 12:07:36 | 显示全部楼层
数据结构+程序
数据结构:菜单固定项结构数组(放在flash中):首位指针,位数,标志,上限值,下限值
              菜单可变项数组(放在eeprom中):可变参数值
             按键处理结构(在RAM中):菜单状态,菜单指针,首位指针,位数,标志,上限,下限,参数值,按键值,按键定时
程序:检查按键值,处理按键值。有键按下后,将菜单数据调入按键结构,然后按菜单状态及按键值进行处理,比如:选择菜单,+-参数值,保存参数值,最后退出菜单。

出0入10汤圆

发表于 2019-8-24 21:50:28 | 显示全部楼层
我用的这个,12864的
//按键处理函数
void KEY_Scan(void)
{          u8 zb[11]={0x54,0x54,0x54,0x54,0x54,0x55,0x54,0x54,0x54,0x54,0x54};         //上划线,空格
                    if(KEY_ZJ==0)  //自检按下
                  {delay_ms(10);//去抖动
                        while(KEY_DOWN == 0);         //提起释放
                           zj_flag=1;
                  }

                 if(KEY_UP==1 && KEY_DOWN == 0 && KEY_ENTER == 1 && KEY_ESC == 1)           //DOWN键按下 又选择
                {
                     delay_ms(10);//去抖动
                        while(KEY_DOWN == 0);         //提起释放

                          if(menu_page==2&&menu_next==1) //在子菜单2下 ,     DOWN按下右移一次
                             menu_next=2;                 //跳至子菜单2 地址设置框
                         else if(menu_page==2&&menu_next==2) //在子菜单2下 ,DOWN按下右移一次
                             menu_next=3;                 //跳至子菜单2 阈值设置框
                         else if(menu_page==2&&menu_next==3) //在子菜单2下 ,DOWN按下右移一次
                             menu_next=4;                 //跳至子菜单2 数据查询框
                         else if(menu_page==2&&menu_next==4) //在子菜单2下 ,DOWN按下右移一次
                             menu_next=1;                 //跳至子菜单2 参数查询框
                       //数值 减1
                        else if(menu_next_next==1&&menu_page==3)//如果在参数设置界面 当前位置 减1
                               {          switch (add){
                                                case 1: if(L_gm_yz[0]>0)L_gm_yz[0]--;else L_gm_yz[0]=9;break;          //修正因子 减1
                                            case 2: if(L_gm_yz[2]>0)L_gm_yz[2]--;else L_gm_yz[2]=9;break;
                                                case 3: if(L_gm_yz[3]>0)L_gm_yz[3]--;else L_gm_yz[3]=9;break;
                                                case 4: if(L_gm_yz[4]>0)L_gm_yz[4]--;else L_gm_yz[4]=9;break;}
                                     }
                        else if(menu_next_next==2&&menu_page==3)//如果在地址设置界面
                               {          
                                          ////////////////////时间设置//////////////
                                                          
                                   switch (add){
                                                case 1:                if(address>0)         address=address--;         else  address=0; time_flash=0;break;          //当前位置减1
                                                case 2:           if(date_set[1]>0) date_set[1]--;else if (date_set[0]>0){date_set[0]--; date_set[1]=9;}           //年
                                                            else{date_set[0]=9; date_set[1]=9;}time_flash=1;
                                                                        break;
                                                  case 3:           if(date_set[3]>0) date_set[3]--;else if (date_set[2]>0){date_set[2]=0; date_set[3]=9;}           //月
                                                            else if(date_set[2]==0&&date_set[3]==0){date_set[2]=1; date_set[3]=2;}time_flash=1;
                                                                        break;
                                            case 4:           if(date_set[5]>0) date_set[5]--;else if (date_set[4]>0){date_set[4]--; date_set[5]=9;}           //日
                                                            else if(date_set[4]==0&&date_set[5]==0) {date_set[4]=3; date_set[5]=1;} time_flash=1;
                                                                        break;
                                                case 5:                if(time_set[1]>0) time_set[1]--;else if (time_set[0]>0){time_set[0]--; time_set[1]=9;}           //时
                                                            else{time_set[0]=2; time_set[1]=3;} time_flash=1;
                                                                        break;
                                                case 6:                if(time_set[3]>0) time_set[3]--;else if (time_set[2]>0){time_set[2]--; time_set[3]=9;}           //分
                                                            else{time_set[2]=5; time_set[3]=9;} time_flash=1;
                                                                        break;
                                                case 7:                if(time_set[5]>0) time_set[5]--;else if (time_set[4]>0){time_set[4]--; time_set[5]=9;}           //秒
                                                            else{time_set[4]=5; time_set[5]=9;} time_flash=1;
                                                                        break;

                                          }
                                        }
                   else if(menu_next_next==3&&menu_page==3)//如果在阈值设置界面 当前位置 减1
                               {          switch (add) {
                                                  case 1: if(alm_dat[0]>0)alm_dat[0]--;else alm_dat[0]=9;break;          //阈值  减1
                                            case 2: if(alm_dat[1]>0)alm_dat[1]--;else alm_dat[1]=9;break;
                                                case 3: if(alm_dat[2]>0)alm_dat[2]--;else alm_dat[2]=9;break;
                                                case 4: if(alm_dat[3]>0)alm_dat[3]--;else alm_dat[3]=9;break;
                                                case 5: if(alm_dat[5]>0)alm_dat[5]--;else alm_dat[5]=9;break;
                                                }
                                     }

                }
               
                 if(KEY_UP==0 && KEY_DOWN == 1 && KEY_ENTER == 1 && KEY_ESC == 1)           //up键按下 左选择
                {
                     delay_ms(10);//去抖动
                        while(KEY_UP == 0);         //提起释放
                         if(menu_page==2&&menu_next==1) //在子菜单2下 ,up按下左移一次
                             menu_next=4;                 //跳至子菜单2 数据查询框
                         else if(menu_page==2&&menu_next==4) //在子菜单2下 ,up按下左移一次
                             menu_next=3;                 //跳至子菜单2 参数查询框
                         else if(menu_page==2&&menu_next==3) //在子菜单2下 ,up按下左移一次
                             menu_next=2;                 //跳至子菜单2 地址设置框
                         else if(menu_page==2&&menu_next==2) //在子菜单2下 ,up按下左移一次
                             menu_next=1;                 //跳至子菜单2  阈值设置框
                                //数值加
                        else if(menu_next_next==1&&menu_page==3)//如果在参数设置界面 当前位置加1
                               {          switch (add){
                                                case 1: L_gm_yz[0]++;if(L_gm_yz[0]>9) L_gm_yz[0]=0;break;          //修正因子 加1
                                            case 2: L_gm_yz[2]++;if(L_gm_yz[2]>9) L_gm_yz[2]=0;break;
                                                case 3: L_gm_yz[3]++;if(L_gm_yz[3]>9) L_gm_yz[3]=0;break;
                                                case 4: L_gm_yz[4]++;if(L_gm_yz[4]>9) L_gm_yz[4]=0;break;}
                                     }
                        else if(menu_next_next==2&&menu_page==3)//如果在地址设置界面 当前位置加1
                               {
                                               
                                                           ////////////////////时间设置//////////////
                                                         
                                             switch (add){
                                                case 1:address=address++;        if(address==100) address=0;break;
                                               
                                                case 2: date_set[1]++;if(date_set[1]>9){date_set[1]=date_set[1]-10;date_set[0]++;}  //年
                                                                                          else if(date_set[0]==9&&date_set[1]==9){date_set[0]=0;date_set[1]=0;}        time_flash=1;
                                                                break;
                                                case 3: date_set[3]++;  if(date_set[2]==1&&date_set[3]==3){date_set[2]=0;date_set[3]=1;}//月
                                                                                          else         if(date_set[3]>9){date_set[3]=date_set[3]-10;date_set[2]++;} time_flash=1;
                                                                break;
                                                case 4: date_set[5]++;if(date_set[4]==3&&date_set[5]==2){date_set[4]=0;date_set[5]=1;}//日
                                                                                          else if(date_set[5]>9){date_set[5]=date_set[5]-10;date_set[4]++;} time_flash=1;
                                                                break;
                                                 case 5: time_set[1]++;if(time_set[0]>1&&time_set[1]>3){time_set[0]=0;time_set[1]=0;} //时
                                                                                          else if(time_set[1]>9){time_set[1]=time_set[1]-10;time_set[0]++;} time_flash=1;
                                                                break;
                                                case 6: time_set[3]++; if(time_set[2]>5){time_set[2]=0;time_set[3]=0;}//分
                                                                                          else         if(time_set[3]>9){time_set[3]=time_set[3]-10;time_set[2]++;}time_flash=1;
                                                                break;
                                                case 7: time_set[5]++;if(time_set[4]>5){time_set[4]=0;time_set[5]=0;}  //秒
                                                                                          else if(time_set[5]>9){time_set[5]=time_set[5]-10;time_set[4]++;}time_flash=1;
                                                                break;
                                                }          
                                     }
                   else if(menu_next_next==3&&menu_page==3)//如果在阈值设置界面 当前位置加1
                               {          switch (add) {
                                                  case 1: alm_dat[0]++;if(alm_dat[0]>9) alm_dat[0]=0;break;          //阈值 加1
                                            case 2: alm_dat[1]++;if(alm_dat[1]>9) alm_dat[1]=0;break;
                                                case 3: alm_dat[2]++;if(alm_dat[2]>9) alm_dat[2]=0;break;
                                                case 4: alm_dat[3]++;if(alm_dat[3]>9) alm_dat[3]=0;break;
                                                case 5: alm_dat[5]++;if(alm_dat[5]>9) alm_dat[5]=0;break;
                                                }
                                     }
                  }
           if(KEY_UP==1 && KEY_DOWN == 1 && KEY_ENTER == 0 && KEY_ESC == 1)           //enter键按下 确定
                       {
                                delay_ms(10);//去抖动
                           while(KEY_ENTER == 0);         //提起释放
                          if(menu_page==1)                         //如果在主菜单1,则进入子菜单2
                                 {
                                 menu_page=2;menu_next=1;menu_next_next=0; clear_flag=1;
                                 }
                        else  if(menu_page==2&&menu_next==1) //在子菜单2下 ,enter键按下 确定
                            { menu_next_next=1;menu_page=3;menu_next=0;clear_flag=1;add=0;         }         //跳至子菜单2 参数设置界面         光标回到首位
                        else  if(menu_page==2&&menu_next==2) //在子菜单2下 ,enter键按下 确定
                            {  menu_next_next=2; menu_page=3;menu_next=0;clear_flag=1;add=0;}                 //跳至子菜单2 地址设置框界面
                        else  if(menu_page==2&&menu_next==3) //在子菜单2下 ,enter键按下 确定
                            {  menu_next_next=3;menu_page=3;menu_next=0; clear_flag=1;add=0;}                 //跳至子菜单2  阈值设置框界面
                        else  if(menu_page==2&&menu_next==4) //在子菜单2下 ,enter键按下 确定
                            {  menu_next_next=4;menu_page=3; menu_next=0;clear_flag=1;add=0;}                 //跳至子菜单2  数据查询界面
                       //获取位置
                        else if(menu_next_next==1&&menu_page==3)//如果在参数设置界面 获取位置
                                           {   add=add+1; if(add==5)         add=1;
                                                  if(add>1)
                                                 ShowLine(32,12+add*2+2,zb,11);//显示下划线 跳过小数点
                                                  else
                                                   ShowLine(32,12+add*2,zb,11);//显示下划线
                                                     
                                           }
                         else if(menu_next_next==3&&menu_page==3)//如果在阈值设置界面 获取位置
                                           {
                                             add=add+1;
                                                 if(add==6)         add=1;       
                                                 if(add==5)
                                                 ShowLine(32,12+add*2+2,zb,11);//显示下划线 跳过小数点
                                                  else
                                                   ShowLine(32,12+add*2,zb,11);//显示下划线
                                           }
                          else if(menu_next_next==2&&menu_page==3)//如果在地址设置界面 获取位置
                                           { add=add+1;
                                              if(add==2)
                                              {time_read();// 读出时间
                                                  
                                                  }
                                             
                                                 if(add==8)         add=1;
                                                 if(add==1)
                                                 {zb[0]=0x55;zb[1]=0x55;
                                                  ShowLine(24,24,zb,2);//显示地址下划线
                                                 }else
                                                 {zb[0]=0x54;zb[1]=0x54;
                                                  ShowLine(24,24,zb,2);//显示地址空格
                                                 }
                                                 if(add==2)                                                         //年
                                                 {zb[0]=0x55;zb[1]=0x55;
                                                  ShowLine(58,24,zb,2);//显示地址下划线
                                                 }else
                                                 {zb[0]=0x54;zb[1]=0x54;
                                                  ShowLine(58,24,zb,2);//显示地址空格
                                                 }  
                                                  if(add==3)                                                         //月
                                                 {zb[0]=0x55;zb[1]=0x55;
                                                  ShowLine(58,24+6,zb,2);//显示地址下划线
                                                 }else
                                                 {zb[0]=0x54;zb[1]=0x54;
                                                  ShowLine(58,24+6,zb,2);//显示地址空格
                                                 }        
                                                    if(add==4)                                                         //日
                                                 {zb[0]=0x55;zb[1]=0x55;
                                                  ShowLine(58,24+12,zb,2);//显示地址下划线
                                                 }else
                                                 {zb[0]=0x54;zb[1]=0x54;
                                                  ShowLine(58,24+12,zb,2);//显示地址空格
                                                 }
                                                   if(add==5)                                                         //时
                                                 {zb[0]=0x55;zb[1]=0x55;
                                                  ShowLine(58,24+20,zb,2);//显示地址下划线
                                                 }else
                                                 {zb[0]=0x54;zb[1]=0x54;
                                                  ShowLine(58,24+20,zb,2);//显示地址空格
                                                 }
                                                   if(add==6)                                                         //分
                                                 {zb[0]=0x55;zb[1]=0x55;
                                                  ShowLine(58,24+26,zb,2);//显示地址下划线
                                                 }else
                                                 {zb[0]=0x54;zb[1]=0x54;
                                                  ShowLine(58,24+26,zb,2);//显示地址空格
                                                 }
                                                   if(add==7)                                                         //秒
                                                 {zb[0]=0x55;zb[1]=0x55;
                                                  ShowLine(58,24+32,zb,2);//显示地址下划线
                                                 }else
                                                 {zb[0]=0x54;zb[1]=0x54;
                                                  ShowLine(58,24+32,zb,2);//显示地址空格
                                                 }
                                           }
                        }               
            if(KEY_UP==1 && KEY_DOWN == 1 && KEY_ENTER == 1 && KEY_ESC == 0)           //ESC键按下 返回
                       {
                                delay_ms(10);//去抖动
                           while(KEY_ESC == 0);         //提起释放
                                  if(menu_page==2)          //如果进入子菜单2  回主菜单1
                                        { menu_page=1;menu_next=0;menu_next_next=0;clear_flag=1;        }
                                 else   if(menu_page==3)          //如果进入子菜单3  回主菜单2        第一项         同时保存数据
                                            {                             data_save[0] = 0x01;
                                                        data_save[1] = L_gm_yz[0];                //低量程γ因子0.950
                                                        data_save[2] = 0x0d;        //.
                                                        data_save[3] = L_gm_yz[2];
                                                        data_save[4] = L_gm_yz[3];
                                                        data_save[5] = L_gm_yz[4];

                                                        data_save[6] = alm_dat[0];                 //监测报警值0002.0uSv/h
                                                        data_save[7] = alm_dat[1];
                                                        data_save[8] = alm_dat[2];         
                                                        data_save[9] = alm_dat[3];         
                                                        data_save[10] = 0x0d;
                                                        data_save[11] = alm_dat[5];
                                                        data_save[12] = address/10;
                                                        data_save[13] =        address%10;
                                                    menu_page=2;
                                                        menu_next=1;
                                                        menu_next_next=0;
                                                        clear_flag=1;
                                                        if(add>0)
                                                           {
                                                            flash_flag=1;
                                                            add=0;       
                                                           }
                                                             
                                                        }
                         }

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

本版积分规则

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

GMT+8, 2024-4-19 22:21

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

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