找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6167|回复: 20
收起左侧

为什么这个单片机程序独立按键长按才起作用

  [复制链接]
ID:272459 发表于 2018-5-16 14:17 | 显示全部楼层 |阅读模式
程序是我这里复制的,按键程序是我自己写的,求大神帮看下,为什么按键要长按下 才有反应;
  1. while (1)
  2.     {
  3.            if (flag1s)  //每秒更新一次温度
  4.           {
  5.                   LcdShowStr(0, 1, "WD:");        //显示到液晶屏上
  6.               LcdShowStr(6, 1, "SD:");        //显示到液晶屏上
  7.               LcdShowStr(0, 0, "F:");
  8.            DHT_Start();
  9.                         tmp1=DHT_ByteRead(&DHT);
  10.                    if(tmp1==1)
  11.                    {
  12.                    str[0] = (DHT[0]/10)%10 + '0';  //十位转为ASCII码
  13.            str[1] = (DHT[0]%10) + '0';  //个位转为ASCII
  14.                str[2] = '\0';
  15.                    LcdShowStr(9, 1, str);

  16.                    str[0] = (DHT[2]/10)%10 + '0';  //十位转为ASCII码
  17.            str[1] = (DHT[2]%10) + '0';  //个位转为ASCII
  18.            str[2] = '\0';
  19.                LcdShowStr(3,1, str);

  20.                    WD= DHT[2];
  21.                    SD=DHT[0];
  22.                   temp2=adc0832(voc);
  23.                   if(temp2==1)
  24.                    {str[0] =  voc/1000 + '0';  
  25.            str[1] = (voc%1000)/100 + '0';
  26.                    str[2] = ((voc%1000)%100)/10 + '0';
  27.                    str[3] = ('.')  ;
  28.                    str[4] = ((voc%1000)%100)%10 + '0';
  29.                    str[5] = '\0';   
  30.                LcdShowStr(2, 0, str);
  31.                   
  32.                   }
  33.                           
  34.                    }
  35.                   
  36.          
  37.                 key();
  38.         }
  39.          
  40.                
  41.                
  42.                  
  43.          

  44.                  
  45. }                 
  46.          
  47. }


  48. void key (void)
  49. {                 unsigned char str[12];
  50.                
  51. if(Key1==0)
  52.                 {  
  53.                  set++;
  54.                   delay();
  55.                   if(set==1)
  56.                     LcdShowStr(7, 0, "STH:");        
  57.                   if(set==2)
  58.                     LcdShowStr(7, 0, "STL:");         
  59.                   if(set==3)
  60.                     LcdShowStr(7, 0, "SRH:");        
  61.                   if(set==4)
  62.                     LcdShowStr(7, 0, "SRL:");
  63.                   if(set==5)
  64.                     LcdShowStr(7, 0, "VOC:");                 
  65.                 if(set>=6)
  66.                 set=0;
  67.         while(!Key1);                                                   
  68.                 }
  69.                 if(Key2==0)
  70.                 {

  71.                 if(set==1)
  72.                 {
  73.                  STH++;
  74.                    str[0] = (STH/10)%10 + '0';  
  75.            str[1] = (STH%10) + '0';  
  76.            str[2] = '\0';
  77.                LcdShowStr(11, 0, str);
  78.                 }
  79.                 if(set==2)
  80.                 {
  81.                  STL++;
  82.                    str[0] = (STL/10)%10 + '0';
  83.            str[1] = (STL%10) + '0';  
  84.            str[2] = '\0';
  85.                LcdShowStr(11,0, str);
  86.                 }
  87.                 if(set==3)
  88.                 {
  89.                  SRH++;
  90.                    str[0] = (SRH/10)%10 + '0';
  91.            str[1] = (SRH%10) + '0';  
  92.            str[2] = '\0';
  93.                LcdShowStr(11, 0, str);

  94.                 }
  95.                                 if(set==4)
  96.                 {
  97.                   SRL++;
  98.                    str[0] = (SRL/10)%10 + '0';
  99.            str[1] = (SRL%10) + '0';  
  100.            str[2] = '\0';
  101.                LcdShowStr(11, 0, str);
  102.                 }
  103.                         if(set==5)
  104.                 {
  105.                   VOC++;
  106.                    str[0] = (VOC/10)%10 + '0';
  107.            str[1] = (VOC%10) + '0';  
  108.            str[2] = '\0';
  109.                LcdShowStr(11, 0, str);
  110.                 }

  111.                   delay();
  112.                 }

  113.                 if(Key3==0)
  114.                 {
  115.                                  if(set==1)
  116.                 {
  117.                  STH--;
  118.                  str[0] = (STH/10)%10 + '0';  
  119.            str[1] = (STH%10) + '0';  
  120.            str[2] = '\0';
  121.                LcdShowStr(11, 0, str);
  122.                 }
  123.                                 if(set==2)
  124.                 {
  125.                   STL--;
  126.                   str[0] = (STL/10)%10 + '0';  
  127.            str[1] = (STL%10) + '0';  
  128.            str[2] = '\0';
  129.                LcdShowStr(11, 0, str);
  130.                 }
  131.                                 if(set==3)
  132.                 {
  133.                  SRH--;
  134.                  str[0] = (SRH/10)%10 + '0';  
  135.            str[1] = (SRH%10) + '0';  
  136.            str[2] = '\0';
  137.                LcdShowStr(11, 0, str);
  138.                 }
  139.                                 if(set==4)
  140.                 {
  141.                  SRL--;
  142.                  str[0] = (SRL/10)%10 + '0';  
  143.            str[1] = (SRL%10) + '0';  
  144.            str[2] = '\0';
  145.                LcdShowStr(11, 0, str);
  146.                 }
  147.                 if(set==5)
  148.                 {
  149.                  VOC--;
  150.                  str[0] = (VOC/10)%10 + '0';  
  151.            str[1] = (VOC%10) + '0';  
  152.            str[2] = '\0';
  153.                LcdShowStr(11, 0, str);
  154.                 }
  155.                   delay();
  156.                 }
  157.         if(Key4==0)
  158.                 {

  159.                   delay();
  160.                   set=0;
  161.                   InitLcd1602();
  162.                    //初始化液晶
  163.                 }
  164.                
  165. }
  166.          





  167. void ConfigTimer0(unsigned int ms)
  168. {
  169.     unsigned long tmp;  //临时变量

  170.     tmp = 11059200 / 12;      //定时器计数频率
  171.     tmp = (tmp * ms) / 1000;  //计算所需的计数值
  172.     tmp = 65536 - tmp;        //计算定时器重载值
  173.     tmp = tmp + 12;           //补偿中断响应延时造成的误差
  174.     T0RH = (unsigned char)(tmp>>8);  //定时器重载值拆分为高低字节
  175.     T0RL = (unsigned char)tmp;
  176.     TMOD &= 0xF0;   //清零T0的控制位
  177.     TMOD |= 0x01;   //配置T0为模式1
  178.     TH0 = T0RH;     //加载T0重载值
  179.     TL0 = T0RL;
  180.     ET0 = 1;        //使能T0中断
  181.     TR0 = 1;        //启动T0
  182. }
  183. /* T0中断服务函数,完成1秒定时 */
  184. void InterruptTimer0() interrupt 1
  185. {         
  186.     static unsigned char tmr1s = 0;

  187.     TH0 = T0RH;  //重新加载重载值
  188.     TL0 = T0RL;
  189.     tmr1s++;
  190.     if (tmr1s >= 100)  //定时1s
  191.     {
  192.         tmr1s = 0;
  193.         flag1s = 1;
  194.       
  195.         }


  196. }
复制代码



回复

使用道具 举报

ID:225135 发表于 2018-5-16 14:44 | 显示全部楼层
因为你的程序还没走到按键感应吧,不建议用delay写程序。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:330198 发表于 2018-5-16 15:19 | 显示全部楼层
第一你按键没有做消抖处理,第二你while(!Key1)这句位置应该紧跟着if(Key1==0)的后面。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:331281 发表于 2018-5-16 15:21 | 显示全部楼层
初步判断是你的按键1s轮询时间过长,可以按键单独出来,然后新定一个标志,30ms扫描一次按键,主要就很快了,
1s对按键来说的确太长了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:331365 发表于 2018-5-16 16:08 | 显示全部楼层
不建议用delay写程序

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:315386 发表于 2018-5-16 16:12 | 显示全部楼层
消抖的原因吧

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:304161 发表于 2018-5-16 17:40 来自手机 | 显示全部楼层
去抖动,采集按键值需要一定的周期才能采集到信号

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:272459 发表于 2018-5-16 19:39 | 显示全部楼层
zhanghyg 发表于 2018-5-16 15:19
第一你按键没有做消抖处理,第二你while(!Key1)这句位置应该紧跟着if(Key1==0)的后面。

消抖 还是一样,反应时间长,

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:272459 发表于 2018-5-16 19:41 | 显示全部楼层
liu281469315 发表于 2018-5-16 15:21
初步判断是你的按键1s轮询时间过长,可以按键单独出来,然后新定一个标志,30ms扫描一次按键,主要就很快了,
1 ...

按键子程序 独立出来不在FLAG1S里面吗?
回复

使用道具 举报

ID:272459 发表于 2018-5-16 19:42 | 显示全部楼层
12345yj 发表于 2018-5-16 17:40
去抖动,采集按键值需要一定的周期才能采集到信号

已经去抖动了,但是还是按键按下后还是要很长时间才能反应
回复

使用道具 举报

ID:272459 发表于 2018-5-16 20:42 | 显示全部楼层
12345yj 发表于 2018-5-16 17:40
去抖动,采集按键值需要一定的周期才能采集到信号

我按下按键 5S-6S才会有反应,应该没有这么长周期吧
回复

使用道具 举报

ID:272459 发表于 2018-5-16 21:17 | 显示全部楼层
感谢大家,我已经找出原因了。。
回复

使用道具 举报

ID:1 发表于 2018-5-17 01:29 | 显示全部楼层
abcarry 发表于 2018-5-16 21:17
感谢大家,我已经找出原因了。。

原因是什么 能分享下吗?
回复

使用道具 举报

ID:194257 发表于 2018-5-17 09:07 | 显示全部楼层
1s才读一次按键肯定要长按啊
回复

使用道具 举报

ID:320371 发表于 2018-5-17 09:22 | 显示全部楼层
需要加入防抖才能正常使用,就是判断两次按键电平,并加入一个延时。例如:
if(key==0)
{
delay(10);
if(key==0)
{//你需要进行的操作
}
};
回复

使用道具 举报

ID:331894 发表于 2018-5-17 09:54 | 显示全部楼层
按键  没做处理   也就是   每次按下按键   需要延时
回复

使用道具 举报

ID:272459 发表于 2018-5-17 09:54 | 显示全部楼层
admin 发表于 2018-5-17 01:29
原因是什么 能分享下吗?

delay()函数延时长  并且 多次成倍调用delay()函数
回复

使用道具 举报

ID:223416 发表于 2018-5-17 11:14 | 显示全部楼层
对io口查询的频率不够高
回复

使用道具 举报

ID:399179 发表于 2020-3-4 18:00 来自手机 | 显示全部楼层
我的也是这问题,楼主怎么解决的?
回复

使用道具 举报

ID:755110 发表于 2020-5-20 09:04 | 显示全部楼层
abcarry 发表于 2018-5-17 09:54
delay()函数延时长  并且 多次成倍调用delay()函数

请问您是怎么解决的呢,我也遇到了按键得长按才能起作用的问题。
回复

使用道具 举报

ID:601478 发表于 2020-5-20 14:21 | 显示全部楼层
5楼说的有道理,刚开始学习写程序用DELAY能方便地理解程序运行过程,但是往后的话还是养成写程序尽量不用delay的习惯为好
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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