硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3475|回复: 10
收起左侧

[技术讨论] 按键驱动问题

[复制链接]

3

主题

36

回帖

45

积分

新手上路

积分
45
发表于 2019-11-7 10:03:47 | 显示全部楼层 |阅读模式
本帖最后由 TK.Minh 于 2019-11-7 10:04 编辑

为什么添加了按键驱动  实时性这么不好 ,要长按才有  而且会有出现连续的两个值

void SysTick_Handler(void)
{        

        nTicks++;


        if ((nTicks %30) ==0 )
         {
                bsp_KeyScan(); //每5ms扫键一次
                nTicks=0;
//                if ( nTicks % (TICKS_INTERVAL*12) == 0 )
//                         GetAndSaveKey();//每60ms分析一次键值
         }
        
        if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
    {
        xPortSysTickHandler();        
    }
        else
        {
                sysTickCnt++;        /*调度开启之前计数*/
        }
}


int main(void)
{
        bsp_Init();
        
        LCD_WriteCom(0x80);
        LCD_Printf("Welcome To Use!");

    delay_xms(300);
        LCD_WriteCom(0x01);
        
        while(1)
        {

                GetKeyValue();
        
        }
        
        
        
}

void GetKeyValue(void)
{
        //bsp_KeyScan();
        KeyValue=bsp_GetKey();

        switch(KeyValue)
    {
                case KEY_DOWN_K2:
                        lcd_number=keytab[lcd_number].sb_q;
                break;
               
                case KEY_LONG_K2:
                        lcd_number=keytab[lcd_number].sb_c;
                break;
               
                case KEY_DOWN_K3:
                        lcd_number=keytab[lcd_number].sb_x;
                break;
               
                case KEY_LONG_K3:
                        lcd_number=keytab[lcd_number].sb_e;
                break;
               

                 default : break;
        }
        
                        keyfun=keytab[lcd_number].xianshi;
                        Menu1();
                        (*keyfun)();
               
        printf("按键 %d 按下\r\n",KeyValue);
}



QQ截图20191107095941.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2019-11-7 10:09:15 | 显示全部楼层
如果你要移植的话,应该这样移植,先添加原版的bsp_key.C和bsp_timer.C文件,调试好用了,修改成成自己的,这样效率高些。
回复

使用道具 举报

3

主题

36

回帖

45

积分

新手上路

积分
45
 楼主| 发表于 2019-11-7 10:18:41 | 显示全部楼层
eric2013 发表于 2019-11-7 10:09
如果你要移植的话,应该这样移植,先添加原版的bsp_key.C和bsp_timer.C文件,调试好用了,修改成成自己的, ...

就是SysTick 中断这边,想用到FreeRTOS上
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2019-11-7 10:20:01 | 显示全部楼层
TK.Minh 发表于 2019-11-7 10:18
就是SysTick 中断这边,想用到FreeRTOS上

FreeRTOS下更简单,直接将 bsp_KeyScan();放在一个任务里面,10ms跑一次就好了。
回复

使用道具 举报

3

主题

36

回帖

45

积分

新手上路

积分
45
 楼主| 发表于 2019-11-7 10:22:27 | 显示全部楼层
eric2013 发表于 2019-11-7 10:20
FreeRTOS下更简单,直接将 bsp_KeyScan();放在一个任务里面,10ms跑一次就好了。

不用经过SysTick 中断么
回复

使用道具 举报

12

主题

104

回帖

140

积分

初级会员

积分
140
发表于 2019-11-7 10:53:26 | 显示全部楼层
用我这个试试看吧。。不过我放中断一样刷新太快。。检测的时候按下是检测到。。但主程序还没来得及处理就检测下一个进入了。。。然后不好用。。我就放主循环的。。。 keyboard.rar (3.5 KB, 下载次数: 1)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2019-11-7 10:55:55 | 显示全部楼层
TK.Minh 发表于 2019-11-7 10:22
不用经过SysTick 中断么

不用啊,这里任意下载个例子,里面基本都有调用按键
http://www.armbbs.cn/forum.php?mod=viewthread&tid=17658&extra=page%3D1


回复

使用道具 举报

3

主题

36

回帖

45

积分

新手上路

积分
45
 楼主| 发表于 2019-11-8 08:19:02 | 显示全部楼层
cz123123 发表于 2019-11-7 10:53
用我这个试试看吧。。不过我放中断一样刷新太快。。检测的时候按下是检测到。。但主程序还没来得及处理就检 ...

谢啦
回复

使用道具 举报

3

主题

36

回帖

45

积分

新手上路

积分
45
 楼主| 发表于 2019-11-8 08:19:22 | 显示全部楼层
eric2013 发表于 2019-11-7 10:55
不用啊,这里任意下载个例子,里面基本都有调用按键
http://www.armbbs.cn/forum.php?mod=viewthread&ti ...

谢啦
回复

使用道具 举报

3

主题

36

回帖

45

积分

新手上路

积分
45
 楼主| 发表于 2019-11-8 09:20:29 | 显示全部楼层
eric2013 发表于 2019-11-7 10:55
不用啊,这里任意下载个例子,里面基本都有调用按键
http://www.armbbs.cn/forum.php?mod=viewthread&ti ...

还是老样子的  按键需要长按 才有打印信息  而且长按短按一起的 V7的是HAl库的 我的是用V4标准库的,  有区别么
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2019-11-8 09:25:31 | 显示全部楼层
TK.Minh 发表于 2019-11-8 09:20
还是老样子的  按键需要长按 才有打印信息  而且长按短按一起的 V7的是HAl库的 我的是用V4标准库的,  有 ...


给你的链接是不是都没有看,就直接回复了,那个链接里面是F103,F407和F429的,都是标准库。。。。

其实这是一个比较简单的问题,尝试自己解决下,实在搞不定就不推荐移植了,还用自己的老方案吧。

保证两点即可:
1、函数bsp_KeyScan();每10ms调用一次,务必确保是10ms一次。你按下很长时间才时间,最大概率就是时间没有保证。

2、然后就是看下你的bsp_key.h你设置的抖动时间是多少。

这个问题就交流这么多吧,剩下自己研究下。

回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 18:36 , Processed in 0.340440 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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