OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3603|回复: 15

求问:我把按键例程改了两句后按键就不灵敏了

[复制链接]

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2016-12-28
在线时间
8 小时
发表于 2017-2-28 09:42:54 | 显示全部楼层 |阅读模式
5金钱
  下面是原代码和我改了两句的代码,除了main函数不一样其他地方如KEY_Scan(u8 mode)都没改,但下载后无论是按哪个按键都时好时坏,按下去几下或者十几下可能才会有反应(体现在lcd屏上数值的变化),这是什么情况?
  谢谢。

这是例程的代码:
        while(1)
        {
                key=KEY_Scan(0);
                   if(key)
                {                                                  
                        switch(key)
                        {                                 
                                case WKUP_PRES:
                                        BEEP=!BEEP;
                                        break;
                                case KEY1_PRES:
                                        LED1=!LED1;
                                        break;
                                case KEY0_PRES:
                                        LED0=!LED0;
                                        LED1=!LED1;
                                        break;
                        }
                }else delay_ms(10);
        }         

这是我改写的代码:
while(1)
{
   key=KEY_Scan(0);
   if(key)
   {                                                  
      switch(key)
     {                                 
        case KEY1_PRES:                 
          count=count+1;
        break;
        case KEY0_PRES:       
          count=count+10;
        break;
       }
        LCD_ShowNum(50,60,count,8,24);
               
        }else delay_ms(10);                
}

最佳答案

查看完整内容[请看2#楼]

最后的问题时还是因为我的代码问题,我在KEY_Init()中没有初始化WK_UP(则默认为0),但是在KEY_Scan()中我是用的例程里一模一样的写法 u8 KEY_Scan(u8 mode) { static u8 key_up=1; if(mode)key_up=1; if(key_up&&(KEY0==0||KEY1==0||WK_UP==1)) { delay_ms(10); key_up=0; if(KEY0==0)return KEY0_PRES; else if(KEY1==0)return KEY1_PRES; else if(WK_UP==1)return WKUP_PRES; }else if(KEY0= ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2016-12-28
在线时间
8 小时
 楼主| 发表于 2017-2-28 09:42:55 | 显示全部楼层
最后的问题时还是因为我的代码问题,我在KEY_Init()中没有初始化WK_UP(则默认为0),但是在KEY_Scan()中我是用的例程里一模一样的写法
u8 KEY_Scan(u8 mode)
{         
        static u8 key_up=1;
        if(mode)key_up=1;                   
        if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
        {
                delay_ms(10);
                key_up=0;
                if(KEY0==0)return KEY0_PRES;
                else if(KEY1==0)return KEY1_PRES;
                else if(WK_UP==1)return WKUP_PRES;
        }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1; //问题在这我改成if(KEY0==1&&KEY1==1&&WK_UP==1)key_up=1;     
        return 0;
}

谢谢各位的帮助
回复

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2017-2-28 09:50:51 | 显示全部楼层
因为你加了个LCD显示。按键是轮询的,在处理LCD_ShowNum(50,60,count,8,24);这个的时候,你按键就不灵了。
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2016-12-28
在线时间
8 小时
 楼主| 发表于 2017-2-28 09:52:43 | 显示全部楼层
BMN李 发表于 2017-2-28 09:50
因为你加了个LCD显示。按键是轮询的,在处理LCD_ShowNum(50,60,count,8,24);这个的时候,你按键就不灵了。

那该怎么写?
回复

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2017-2-28 09:54:13 | 显示全部楼层

用中断扫描按键咯。
回复

使用道具 举报

10

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1479
金钱
1479
注册时间
2016-1-25
在线时间
260 小时
发表于 2017-2-28 09:56:55 | 显示全部楼层
你试下把LCD_ShowNum(50,60,count,8,24);放到count=count+1;后面试下  估计就可以了
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2016-12-28
在线时间
8 小时
 楼主| 发表于 2017-2-28 09:57:32 | 显示全部楼层
BMN李 发表于 2017-2-28 09:54
用中断扫描按键咯。

我按你说的 LCD那个思路写成这样了
if(key)
                {                                                  
                        switch(key)
                        {       
                                case WKUP_PRES:       
                                        LED1=!LED1;
                                        break;                                
                                case KEY1_PRES:                 
                                        count=count+1;
                                LCD_ShowNum(50,60,count,8,24);
                                        break;
                                case KEY0_PRES:       
                                        count=count+10;
                                LCD_ShowNum(50,60,count,8,24);
                                        break;
                        }
但是那个亮灯的按键依旧不灵敏,这又是为啥?
回复

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2017-2-28 09:58:10 | 显示全部楼层
本帖最后由 BMN李 于 2017-2-28 09:59 编辑

简单的话,你就这样。

while (1)
{
    key = KEY_Scan(0);
    if (key)
    {
        switch (key)
        {
        case KEY1_PRES:
            count = count + 1;
            LCD_ShowNum(50, 60, count, 8, 24);
            break;
        case KEY0_PRES:
            count = count + 10;
            LCD_ShowNum(50, 60, count, 8, 24);
            break;
        default:
            break;
        }
    }
    else
    {
        delay_ms(10);
    }
}
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2016-12-28
在线时间
8 小时
 楼主| 发表于 2017-2-28 10:04:38 | 显示全部楼层
sodermalm 发表于 2017-2-28 09:56
你试下把LCD_ShowNum(50,60,count,8,24);放到count=count+1;后面试下  估计就可以了

if(key)
                {                                                  
                        switch(key)
                        {       
                                case WKUP_PRES:       
                                        LED1=!LED1;
                                        break;                                
                                case KEY1_PRES:                 
                                        count=count+1;
                                LCD_ShowNum(50,60,count,8,24);
                                        break;
                                case KEY0_PRES:       
                                        count=count+10;
                                LCD_ShowNum(50,60,count,8,24);
                                        break;
                        }
写了,还是不行
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2016-12-28
在线时间
8 小时
 楼主| 发表于 2017-2-28 10:04:57 | 显示全部楼层
BMN李 发表于 2017-2-28 09:58
简单的话,你就这样。

while (1)

试了还是不行
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2017-2-28 12:55:30 | 显示全部楼层
仿真器看一下key的值
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4036
金钱
4036
注册时间
2015-11-14
在线时间
545 小时
发表于 2017-2-28 13:09:47 | 显示全部楼层
LCD_ShowNum(50,60,count,8,24);这句话什么意思,显示一个数值?,显示有效位数多少,是不是这个占用了大量时间
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2016-12-28
在线时间
8 小时
 楼主| 发表于 2017-3-1 10:10:01 | 显示全部楼层
Electronic 发表于 2017-2-28 13:09
LCD_ShowNum(50,60,count,8,24);这句话什么意思,显示一个数值?,显示有效位数多少,是不是这个占用了大量 ...

u8 count = 20;
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4036
金钱
4036
注册时间
2015-11-14
在线时间
545 小时
发表于 2017-3-1 10:23:12 | 显示全部楼层
你的按键扫描,当没有按键按下的时候是返回什么值,如果返回的不是0,那么你就一直在写LCD,这样占用了好长的时间
回复

使用道具 举报

2

主题

65

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2016-5-21
在线时间
238 小时
发表于 2017-3-1 11:03:29 | 显示全部楼层
按键和屏幕的组合用UCOS嵌入式系统最好了,否则就会来不及处理。
回复

使用道具 举报

2

主题

65

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2016-5-21
在线时间
238 小时
发表于 2017-3-1 11:05:16 | 显示全部楼层
按键和屏幕的组合用UCOS嵌入式系统最好了,否则就会来不及处理。还有,PA0是高电平有效,你把WK_UP==1,就改变了整个系统的运行方式了。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-12 22:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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