滚印车间
您当前的位置:贴片加工 > 行业资讯

在线咨询单片机按键扫描程序

时间:2021-05-03 06:51:08  来源:  浏览量:
p2.0,p2.1,p2.2,p2.3分别是设置,加,减,开始4个独立按键功能是:按设置键一次后后,显示设置界面,再按设置键后,光标在35,上限处闪烁,此时,加减键功能可用,可调节上限值。再按设置键后,光标置于25,下限处闪烁,此时加减键功能可用,可调节下限值,再按设置键时,完成设置,光标退出。此时再按开始键,程序开始采集实时压力。
想法:在设置时,可以按开始键开始采集,在采集过程中,如果想修改压力上下限,也可以按设置键进入设置界面进行设置。
我的程序如下,不知道有没有问题?效果总是不如意
void keyscan()  //按键扫描
{

   uchar i;
   uint volt,p;


/* 以下是设置键按下功能*/
if(key_set==0) //设置键按下
{
   delay(10); //消抖
   if(key_set==0) //设置键确认按下
   {


            flag++; //记录设置键次数
            break1=1;//设置键按下,break1置1
            if(break1==1)
            {
                    
                if(flag==1)//第一次按下功能键进入设置界面
                    {
                        
               
                        lcd_wcmd(0x01);      //清除LCD的显示内容
                                delay(10);
        
                                    lcd_pos(0,1);            
                                    i = 0;
                                    while(dis5 != '')
                                    {
                                          lcd_wdat(dis5);      //显示设置压力范围
                                          i++;
                                    }
        
                        lcd_pos(1,2);            
                                    i = 0;
                                    while(tab1 != '')
                                    {
                                          lcd_wdat(tab1);      //显示高阈值初始值
                                          i++;
                                    }
                       
                        lcd_pos(2,2);            
                                    i = 0;
                                    while(tab2 != '')
                                    {
                                          lcd_wdat(tab2);      //显示低阈值初始值
                                          i++;
                                    }
                                       
                                
                     }
        
                     if(flag==2) //第二次按下设置键,低阈值位闪烁
                     {
        
                     
        
                                 lcd_pos(3,2);            
                                      i = 0;
                                      while(dis11 != '')
                                      {
                                       lcd_wdat(dis11);      //显示设置完成
                                       i++;
                                      }
                     lcd_wcmd (0x93); //光标定位低阈值35位置
                     lcd_wcmd (0x0f); //光标开始闪烁
        
                                 }
        
        
                     if(flag==3) //第三次按下设置键,高阈值位闪烁
                     {
                     
                                 lcd_pos(3,2);            
                                      i = 0;
                                      while(dis11 != '')
                                      {
                                       lcd_wdat(dis11);      //显示设置完成
                                       i++;
                                      }
                                       
                                 lcd_wcmd (0x8b); //光标定位高阈值25位置
                     lcd_wcmd (0x0f); //光标开始闪烁
                                          
                        
                     }
                     if(flag==4) //第四次按下设置键,不闪烁,标记位置1
                     {
                          lcd_wcmd(0x0c); //取消光标闪烁
                          flag=1;//记录变成1
                                          lcd_pos(3,2);            
                                      i = 0;
                                      while(dis10 != '')
                                      {
                                       lcd_wdat(dis10);      //显示设置完成
                                       i++;
                                      }

                                          //if(key_start=0)
                                         // {break1=-1;}
                     }
             }//与if break1!=-1对应
                          //while(key_set!=0); //释放按键
                          while(!key_set); //释放按键
                          delay(20);
              while(!key_set); //释放按键
   }
}

/* 以下是增加键按下功能*/

if(flag!=0)
{        
    if(key_up==0) //只有设置键按下后,增大和减少键才有效
    {
        delay(10);
        if(key_up==0) //确认增加按键按下
        {
                //while(key_up!=0); //释放按键

                if(flag==2) //设置键第2次按下调节
                {

                     
                       phigh++;
                       if (phigh==51)
                       {
                                      phigh=05;
                                   }
                       
                          tab1[2]=phigh/10+0x30;
                   tab1[3]=phigh%10+0x30;
                                 
                          
                  
                           lcd_pos(1,2);             //显示阈值高位
                           i = 0;
                               while(tab1 != '')
                               {
                                       lcd_wdat(tab1);      //显示字符
                                       i++;
                                   }


                    lcd_wcmd (0x93); //光标定位高阈值35位置
                    lcd_wcmd (0x0f); //光标开始闪烁

                 }


               if(flag==3) //设置键第3次按下调节
                {

                       
                        plow++;
                        if (plow==51)
                        {
                                       plow=05;
                        }

                                        tab2[2]=plow/10+0x30;
                    tab2[3]=plow%10+0x30;
         
                          
                           

                                lcd_pos(2,2);             //显示阈值高位
                                i = 0;
                                while(tab2 != '')
                                {
                                          lcd_wdat(tab2);      //显示字符
                                  i++;
                                }
                      lcd_wcmd (0x8b); //光标定位高阈值35位置
                      lcd_wcmd (0x0f); //光标开始闪烁

                  }

//以上设置键第3次按下调节
                     while(!key_up); //释放按键
                 delay(10);
                        while(!key_up); //释放按键


         }
    }
}


/* 以下是减小键按下功能*/
if(flag!=0)
{   
if(key_down==0)
{
     delay(10);
     if(key_down==0) //确认减少键被按下
     {
         //while(key_down!=0); //按键释放



                if(flag==2) //设置键第2次按下调节
                {


                           phigh--;
                    if (phigh==04)
                    {
                                          phigh=50;
                    }           
                        tab1[2]=phigh/10+0x30;
                    tab1[3]=phigh%10+0x30;

                                
                  
                                
                                lcd_pos(1,2);             //显示阈值高位
                                        i = 0;
                                        while(tab1 != '')
                                        {
                                           lcd_wdat(tab1);      //显示字符
                                           i++;
                                        }
                        lcd_wcmd (0x93); //光标定位低阈值25位置
                        lcd_wcmd (0x0f); //光标开始闪烁

                  }
                 if(flag==3) //设置键第3次按下调节
                 {
                    plow--;
                    if (plow==04)
                    {
                                       plow=50;
                    }               
                    tab2[2]=plow/10+0x30;
                    tab2[3]=plow%10+0x30;        
                                       

                                        lcd_pos(2,2);             //显示阈值高位
                                        i = 0;
                                        while(tab2 != '')
                                        {
                                            lcd_wdat(tab2);      //显示字符
                                            i++;
                                        }
                                    lcd_wcmd (0x8b); //光标定位高阈值35位置
                    lcd_wcmd (0x0f); //光标开始闪烁
                  }
                                                  

                    while(!key_down); //释放按键
                                     delay(10);
                                while(!key_down); //释放按键


      }            
    }

}

/* 以下是确定键按下功能*/

if(key_start==0) //确认调节
{   
          delay(5);
              if(key_start==0)
              {
                while(key_start!=0); //释放按键
                flag=0; //设置键按键次数清零
               // lcd_wcmd(0x0c); //取消光标闪烁
               
        
                           lcd_wcmd(0x01);      //清除LCD的显示内容
                   break1=-1;//开始键按下,break1置-1
                  
                           flag=0;
                  
               }


}
        


}//按键扫描函数的括号

下面是界面显示,供各位大神直观感受。


感谢各位大神留言指导,小弟万分感谢





兄弟,哪里不如意,你得把这个重点说出来。我看了图片,觉得挺好,嘿嘿。


最好把程序结构改改,按键扫描程序应该只判断是否有按键按下,以及按下的是什么按键。
你的要求已经算是菜单了,最好是把各个功能部分写成子程序,然后在菜单部分里调用,比如显示内容,数字调节等,而且这里还涉及按键重用的功能,比如按设置是进入调节状态,然后按设置又是选择上下限,象现在的程序结构,这个设置键的处理就会比较麻烦,而且所有的功能都揉在了按键扫描程序里,想修改也会很困难。
建议更改程序结构,再找些菜单的例程可以参考参考。


人中狼 发表于 2017-8-2 22:56
最好把程序结构改改,按键扫描程序应该只判断是否有按键按下,以及按下的是什么按键。
你的要求已经算是菜单了,最好是把各个功能部分写成子程序,然后在菜单部分里调用,比如显示内容,数字调节等,而且这里还涉及按键重用的功能,比如按设置是进入调节状态,然后按设置又是选择上下限,象现在的程序结构,这个设置键的处 ...

      对,程序架构是关键~~~~~
      首先把各个模块程序写好,在主程序里调用。特别是按键扫描模块,最好不要在里面写其他不必要的判断功能,只要判断对应开关是否按下或双击等等即可。让主程序来决定开关的工作状态。


houjue 发表于 2017-8-3 09:59
对,程序架构是关键~~~~~
      首先把各个模块程序写好,在主程序里调用。特别是按键扫描模块,最好不要在里面写其他不必要的判断功能,只要判断对应开关是否按下或双击等等即可。让主程序来决定开关的工作状态。 ...

框架可以如下,
一,unsigned char key_scan(void),按键扫描,返回是否有按键按下,并返回按键值,比如返回0xff为无按键按下,0x01为设置键等等。
二,manual_0(),第一个菜单函数,如设置上限值。
三,manual_1(),第二个菜单函数,如设置下限值。
四,manual_2(),第三个菜单函数,如开始采样。
五,设置一个菜单编号,主程序根据菜单编号调用相应的菜单函数。
在每个菜单函数里调用按键扫描函数,并根据返回值进行对应的操作。


人中狼 发表于 2017-8-3 12:47
框架可以如下,
一,unsigned char key_scan(void),按键扫描,返回是否有按键按下,并返回按键值,比如返回0xff为无按键按下,0x01为设置键等等。
二,manual_0(),第一个菜单函数,如设置上限值。

人中狼 发表于 2017-8-3 12:47
框架可以如下,
一,unsigned char key_scan(void),按键扫描,返回是否有按键按下,并返回按键值,比如返回0xff为无按键按下,0x01为设置键等等。
二,manual_0(),第一个菜单函数,如设置上限值。

单片机、ARM、嵌入式相关问题加群羊交流201030910


创客学院kafei 发表于 2017-8-3 17:03
单片机、ARM、嵌入式相关问题加群羊交流201030910
  • UltraISO,在PC上制作的英语学习.iso文件,无法播放如 下图一,小孩的 剑桥少儿英语 光盘;因为碟机坏了,笔记本没有光驱,所以,想 在笔记本上 让小孩观看。如 下图二,使用UltraISO,将光盘 制作到电脑上后,使用UltraISO却无法打开观看。

  • 推荐资讯
    相关文章
    栏目更新
    栏目热门
    关于我们
    电脑周边
    家用电器
    通讯
    地区
    新闻中心
    深圳贴片加工厂
     
    • ☆电源板
    • ☆U盘
    • ☆网卡
    • ☆显卡
    • ☆监控摄像头
    • ☆电脑主板
    • ☆平板电脑主板
    • ☆DVD主板
    • 解码板
    • 伺服板
    • 高频头板
    • 复读机板
    • 音响主板
    • ☆手机主板
    • ☆手机按键板
    • ☆无线电话机
    • ☆对讲机主板
    • ☆深圳
    • 东莞
    • 广州
    • 龙岗
    • 宝安
    • 龙华
    • 坂田