找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1555|回复: 3
收起左侧

求一个按键设置程序 就是像变频器设置面板那种 设置 移位 增加

[复制链接]
ID:582844 发表于 2022-4-12 08:06 | 显示全部楼层 |阅读模式
就是像变频器设置面板那种,3个按键,一个设置,一个移位,一个增加的按键程序
回复

使用道具 举报

ID:752974 发表于 2022-4-13 11:16 | 显示全部楼层
给你一段代码参考,我这是4个按键的。
//===============================================================================
// 键盘处理
//-------------------------------- OK --------------------------------------------
void key_pro(void)
{
  u8  i,k,keytemp,dat[4];       
  u8  flag_exit,flag_ok,temp;
  u16 temp1;
       
        i=2;
        k=0;
        led_buf[0] = '-';
        led_buf[1] = '-';
        led_buf[2] = '-';
        led_buf[3] = '-';
//        led_buf[4] = '-';

//        get_segm(led_buf,LED_LEN);       //查段码
//        led_buf_segm[i]|=0x80;           //第三位加小数点

       
   
       
        flag_exit = 1;  //进入手动设置数据
        flag_ok = 0;

        do{
//             dog=1;          //CLR WDT
             get_segm(led_buf,LED_LEN);       //查段码  
             led_buf_segm[i]|=0x80;           //加点
             disp_ta6932(COM_1_SET,COM_2_ADDR,LED_LEN,led_buf_segm,COM_3_DISP); //显示
             keytemp = get_key();                   //读键值
         switch(keytemp)
                   {
            //  case _EXIT  :
                        //             flag_exit=0;//退出                                                                                 
                        //                 break;
                          case _OK    : if(flag_ok !=1)   //
                                                      flag_ok=1;    //设置数据有效
                            flag_exit=0;//退出
                                                        break;
                          case _MODE:      //设置温度值
                                                switch(k)      //设置项目选择
                                                        {   
                                                                case 0 : led_buf[0] = '1';//1
                                                                                 led_buf[1] = 's';
                                                                                 temp = temperature.temper_st;    //1号位置上限温度
                                                                                 led_buf[2] = temp/10 + 0x30;  //十位数
                                                                                 led_buf[3] = temp%10 + 0x30;  //个位数
                                      //   led_buf[4] = 0x30;            //小数不设置
                                                                                break;
                                                                case 1 : led_buf[0] = '1';//1
                                                                                 led_buf[1] = 'x';
                                                                                 temp = temperature.temper_xt;    //1号位置下限温度
                                                                                 led_buf[2] = temp/10 + 0x30;  //十位数
                                                                                 led_buf[3] = temp%10 + 0x30;  //个位数
                                      //   led_buf[4] = 0x30;            //小数不设置
                                                                                break;
//                                case 2 : led_buf[0] = '2';//1
//                                                                                 led_buf[1] = '-';
//                                                                                 temp = temperature.count;    //开关窗时铁管转动圈数
//                                                                                 led_buf[2] = temp/10 + 0x30;  //十位数
//                                                                                 led_buf[3] = temp%10 + 0x30;  //个位数
//                                      //   led_buf[4] = 0x30;            //小数不设置
//                                                                                break;
                                                        }
                                                k++;
                                                if(k>1)
                                                  k = 0;
                                                get_segm(led_buf,LED_LEN);//查段码
                                                led_buf_segm[i]|=0x80;    //加点
                                                break;
                         case _RL :   //处理指示位置的点
                                       
                                            get_segm(led_buf,LED_LEN);//查对应段码
                                                i++;                      //移动点
                                            if(i>3)                   //如果点的位置超界
                                                 {
                                                   led_buf_segm[i-1]&=0x7f;//清除末位点
                                                   i=2;                    //恢复点的原位置
                                                 }
                                            led_buf_segm[i]|=0x80;     //设置当前位置的点
                                            if(i!=2)                   //如果点的位置移动
                                              led_buf_segm[i-1]&=0x7f;   //去掉前一位的点
                                                break;
                         case _SET :   //设置数据
                                            led_buf[i] = led_buf[i] + 1;
                                                if(led_buf[i] > '9')
                                                  led_buf[i] = '0';          //0~9之间的数据
                                                get_segm(led_buf,LED_LEN);   //查段码
                                                led_buf_segm[i]|=0x80;       //加点
                                           break;
                  }
             disp_ta6932(COM_1_SET,COM_2_ADDR,LED_LEN,led_buf_segm,COM_3_DISP);     //送显
                //以下将字符转换成数据               
                 if((led_buf[0]=='1')&&(led_buf[1]=='s')) //1号位上限数据        
                  {
                    memcpy(dat,led_buf+2,2);
                        temperature.temper_st = a_to_int(dat);
                  }
                 if((led_buf[0]=='1')&&(led_buf[1]=='x')) //1下限数据                  
                  {
                        memcpy(dat,led_buf+2,2);
                        temperature.temper_xt = a_to_int(dat);
                  }
//                if((led_buf[0]=='2')&&(led_buf[1]=='-')) //转动圈数              
//                  {
//                        memcpy(dat,led_buf+2,2);
//                        temperature.count = a_to_int(dat);
//                  }
             //保存上限温度,下限温度,转动圈数        
        
        if(flag_ok)     //添加存储设置的数据->EEPROM,显示当前温度,
                 {
           flag_ok = 0;
           eeprom_sector_erase(ISP_START_ADDR);
           eeprom_byte_write(ISP_START_ADDR,temperature.temper_st);
           eeprom_byte_write(ISP_START_ADDR+1,temperature.temper_xt);
      
           temp1 = temperature.temper_p;  //当前实时温度
           led_buf[0]='*';  //关显示
           led_buf[1]=temp1/100+0x30;
                 led_buf[2]=temp1%100/10+0x30;//十位
               led_buf[3]=temp1%100%10+0x30;//个位
                   get_segm(led_buf,LED_LEN);        //查段码
                   led_buf_segm[2]|=0x80;            //
                   disp_ta6932(COM_1_SET,COM_2_ADDR,LED_LEN,led_buf_segm,COM_3_DISP);     //送显
                 }
                                 
        }while(flag_exit);               
}
回复

使用道具 举报

ID:582844 发表于 2022-4-16 09:37 | 显示全部楼层
munuc_w 发表于 2022-4-13 11:16
给你一段代码参考,我这是4个按键的。
//============================================================= ...

谢谢 我看下
回复

使用道具 举报

ID:230742 发表于 2022-4-18 00:44 | 显示全部楼层
留个记号,以后好找。谢谢。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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