打印

按键按下声音有变长的意外的情况出现,请大师指点下

[复制链接]
1739|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
KloppGuo|  楼主 | 2019-11-18 13:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我写了时钟芯片程序显示时间,按下按键声音短促,但是按键按着按着会出现声音变长的情况,我自己觉得display函数运行时间太长的原因,我把这个display函数给屏蔽后蜂鸣器声音就不会出现声音加长的情况!
请问遇到这种情况我该怎么处理?

key_scanf函数是写在主函数里面,按键是机械按键,蜂鸣器是无源的

使用特权

评论回复

相关帖子

沙发
ayb_ice| | 2019-11-18 13:40 | 只看该作者
主循环不要调用长延时的函数,改状态机方式

使用特权

评论回复
板凳
KloppGuo|  楼主 | 2019-11-18 13:44 | 只看该作者
ayb_ice 发表于 2019-11-18 13:40
主循环不要调用长延时的函数,改状态机方式

按键扫描没有用延时函数,是使用定时器延时

使用特权

评论回复
地板
ayb_ice| | 2019-11-18 14:20 | 只看该作者
KloppGuo 发表于 2019-11-18 13:44
按键扫描没有用延时函数,是使用定时器延时

说了,是主循环不要调用

使用特权

评论回复
5
ayb_ice| | 2019-11-18 14:22 | 只看该作者
显示函数改状态机

使用特权

评论回复
6
KloppGuo|  楼主 | 2019-11-18 15:56 | 只看该作者
ayb_ice 发表于 2019-11-18 14:22
显示函数改状态机

key_scanf 函数放在中断函数里面?显示函数改状态机是啥意思?不明白

使用特权

评论回复
7
ayb_ice| | 2019-11-18 16:25 | 只看该作者
KloppGuo 发表于 2019-11-18 15:56
key_scanf 函数放在中断函数里面?显示函数改状态机是啥意思?不明白

一个显示函数为什么会消耗那么长时间呢,不就是定时发个(更新)数据吗

使用特权

评论回复
8
cainiao518| | 2019-11-18 18:38 | 只看该作者
display函数不要用长延时函数

使用特权

评论回复
9
KloppGuo|  楼主 | 2019-11-19 09:39 | 只看该作者
ayb_ice 发表于 2019-11-18 16:25
一个显示函数为什么会消耗那么长时间呢,不就是定时发个(更新)数据吗 ...

显示是使用TFT160128点阵屏来显示时钟芯片读出来的时间,时间我都是分段显示的,要不然一下子显示出来就会出现检测不到按键的情况

使用特权

评论回复
10
KloppGuo|  楼主 | 2019-11-19 09:40 | 只看该作者
ayb_ice 发表于 2019-11-18 16:25
一个显示函数为什么会消耗那么长时间呢,不就是定时发个(更新)数据吗 ...

显示是使用TFT160128点阵屏来显示时钟芯片读出来的时间,时间我都是分段显示的,要不然一下子显示出来就会出现检测不到按键的情况

使用特权

评论回复
11
KloppGuo|  楼主 | 2019-11-19 09:41 | 只看该作者
cainiao518 发表于 2019-11-18 18:38
display函数不要用长延时函数

没有调用长延时函数

使用特权

评论回复
12
ayb_ice| | 2019-11-19 09:49 | 只看该作者
本帖最后由 ayb_ice 于 2019-11-19 09:50 编辑
KloppGuo 发表于 2019-11-19 09:39
显示是使用TFT160128点阵屏来显示时钟芯片读出来的时间,时间我都是分段显示的,要不然一下子显示出来就 ...

你的驱动不行吧,刷新一全屏也花不了多少时间吧,10~50MS足够了,除非你MCU很弱
你BEEP一般响多少时间,如果不行可以在定时中断控制BEEP关

使用特权

评论回复
13
KloppGuo|  楼主 | 2019-11-19 11:15 | 只看该作者
ayb_ice 发表于 2019-11-19 09:49
你的驱动不行吧,刷新一全屏也花不了多少时间吧,10~50MS足够了,除非你MCU很弱
你BEEP一般响多少时间,如 ...

我是使用东软的HR7P275 ,工作频率是16mhz ,刷全屏时间大约1.2秒,看门狗都溢出了,我都在里面刷屏里面加清狗指令了! 我把key_scanf和key_pp放到中断函数里面,显示函数display 100ms刷新显示一次都可以检测到按键;要是把key_scanf和key_pp放到main函数里面,显示函数display 100ms刷新显示一次按键有检测不到的情况出现,蜂鸣器声音加长!

beep 用的是无源 4KHZ  ,一般响100ms;要是把key_scanf和key_pp放到main函数里面中响的时间大于100ms

使用特权

评论回复
14
ayb_ice| | 2019-11-19 11:57 | 只看该作者
KloppGuo 发表于 2019-11-19 11:15
我是使用东软的HR7P275 ,工作频率是16mhz ,刷全屏时间大约1.2秒,看门狗都溢出了,我都在里面刷屏里面 ...

你这MCU太慢了,没有有办法

只能把响BEEP时间控制也放在中断里了(比如定时10ms中断)

使用特权

评论回复
15
lihui567| | 2019-11-19 12:42 | 只看该作者
东软的这颗MCU,主频有点低但是,驱动蜂鸣器正常发声还是绰绰有余的

使用特权

评论回复
16
KloppGuo|  楼主 | 2019-11-19 14:55 | 只看该作者
ayb_ice 发表于 2019-11-19 11:57
你这MCU太慢了,没有有办法

只能把响BEEP时间控制也放在中断里了(比如定时10ms中断) ...

是的,把beep放在中断里面就不会出现蜂鸣声音变长的情况!但是我一直觉得中断函数要少执行指令,快速出栈的,现在真有点毁三观了!颠覆了我传统的思想

使用特权

评论回复
评论
datouyuan 2019-11-30 11:43 回复TA
和你的三观没冲突。不是把beep延时放中断中,而是只把beep执行放中断中。 
17
KloppGuo|  楼主 | 2019-11-19 14:56 | 只看该作者
lihui567 发表于 2019-11-19 12:42
东软的这颗MCU,主频有点低但是,驱动蜂鸣器正常发声还是绰绰有余的

发声是可以,beep放在main函数里面,按键按下的时候偶尔会出现蜂鸣声音加长的情况

使用特权

评论回复
评论
lihui567 2019-11-28 10:49 回复TA
调试仿真一下看看, 
18
ayb_ice| | 2019-11-19 15:11 | 只看该作者
本帖最后由 ayb_ice 于 2019-11-19 15:16 编辑
KloppGuo 发表于 2019-11-19 14:55
是的,把beep放在中断里面就不会出现蜂鸣声音变长的情况!但是我一直觉得中断函数要少执行指令,快速出栈 ...

这有什么问题呢,每次中断简单处理下时间到了没有而已(几条指令而已),又没让你在中断里等待BEEP响完才退出


u8 ucBeepTime;

void ISR_10ms(void)
{
        if (ucBeepTime)
        {
                if (--ucBeepTime == 0)
                {
                        BEEP_OFF();
                }
        }
}

void TestBeep(void)
{
        if (KEY1)
        {
                BEEP_ON();
                ucBeepTime = 100;
        }
}

使用特权

评论回复
19
hwpga| | 2019-11-19 15:17 | 只看该作者
东软这颗2t时钟周期速度可不慢
1/16*2=0.125US
用OTP那种4T的MCU都不会出现这情况
你自己水平问题,跟单片机真没关系

使用特权

评论回复
20
KloppGuo|  楼主 | 2019-11-19 16:27 | 只看该作者
hwpga 发表于 2019-11-19 15:17
东软这颗2t时钟周期速度可不慢
1/16*2=0.125US
用OTP那种4T的MCU都不会出现这情况

你用过这款单片机吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

30

帖子

0

粉丝