打印
[MCU]

小白请教关于按键声音提示

[复制链接]
3245|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Imakey|  楼主 | 2014-10-27 13:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在公司实习看到基本有按键的产品都会有按键提示,就是按一下 滴 的响一声;
请教下这个 让蜂鸣器发声的函数放哪里才不影响整个系统??? (无源蜂鸣器)
还有就是 我感觉我现在的按键检测效率太低,
if(按下)
{
     延时;
if(按下)
{
  松手检测;
  蜂鸣器发声;(使用 普通IO 翻转电平)
  按键标志置位;
}
}

按键有十个,这样处理效率有点低;另用的是PIC单片机 16F系列的
我有一个想法在中断里面检测按键,然后发声提示就不知道怎么弄~~~
请教各位大大~~

相关帖子

沙发
ayb_ice| | 2014-10-27 13:50 | 只看该作者
分片处理就可以了

比如响200MS,那么每隔10MS处理一下即可

实际设一计数器,响200MS其实就是20次,每次减一,直到0。。。

使用特权

评论回复
板凳
ningling_21| | 2014-10-27 13:59 | 只看该作者
把按键检测放在定时器中断中就 不需要延时程序,可以提高效率

使用特权

评论回复
地板
dirtwillfly| | 2014-10-27 20:59 | 只看该作者
最占用时间的是延时函数,采用定时器来延时就好了

使用特权

评论回复
5
coody| | 2014-10-27 22:37 | 只看该作者
我程序基本都是分两层,底层驱动,跟具体的MCU硬件有关,上层为应用层,跟MCU无关。
底层只管是否发声(BeepEnable是否允许)。

应用层提供一个设置函数:
void  BeepSet(u8 BeepTime,u8 PauseTime, u8 repeat)
参数分别是响时间,停顿(间隔)时间,重复次数,时间以10ms为基准。

应用层对于任意的8位、16位、32位MCU,程序都不需要修改。

使用特权

评论回复
6
FAQ| | 2014-10-27 22:56 | 只看该作者
楼主新手,鉴定完毕,提醒楼主,赶快改程序结构。

使用特权

评论回复
7
Imakey|  楼主 | 2014-10-28 09:10 | 只看该作者
dirtwillfly 发表于 2014-10-27 20:59
最占用时间的是延时函数,采用定时器来延时就好了

做产品的都是采用这种结构吗???PIC只有一个中断入口,多个中断源,我试试

使用特权

评论回复
8
Imakey|  楼主 | 2014-10-28 09:12 | 只看该作者
coody 发表于 2014-10-27 22:37
我程序基本都是分两层,底层驱动,跟具体的MCU硬件有关,上层为应用层,跟MCU无关。
底层只管是否发声(Beep ...

你的BeepSet是采用定时器中断来完成的不??定时器中断对IO进行翻转并计时

使用特权

评论回复
9
Imakey|  楼主 | 2014-10-28 09:13 | 只看该作者
FAQ 发表于 2014-10-27 22:56
楼主新手,鉴定完毕,提醒楼主,赶快改程序结构。

能不能不这么直接~~~小白刚刚接触实际产品

使用特权

评论回复
10
Imakey|  楼主 | 2014-10-28 09:15 | 只看该作者
ningling_21 发表于 2014-10-27 13:59
把按键检测放在定时器中断中就 不需要延时程序,可以提高效率

为了解决程序把一次按键触发当成 两次触发,按键有效标志是在按键松开后置位不???

使用特权

评论回复
11
wuxing1106| | 2014-10-28 09:21 | 只看该作者
放到时基里就可以啊

使用特权

评论回复
12
Imakey|  楼主 | 2014-10-28 09:23 | 只看该作者
ayb_ice 发表于 2014-10-27 13:50
分片处理就可以了

比如响200MS,那么每隔10MS处理一下即可

受教了,

使用特权

评论回复
13
ningling_21| | 2014-10-28 09:56 | 只看该作者
Imakey 发表于 2014-10-28 09:15
为了解决程序把一次按键触发当成 两次触发,按键有效标志是在按键松开后置位不??? ...

不一定,如果按键一直不松开岂不是按键一直无效?

可以在消抖后按键还没松开就执行按键的动作,再等待按键释放...

使用特权

评论回复
14
ayb_ice| | 2014-10-28 10:29 | 只看该作者
合理的键盘事件包括按下事件,释放事件,这些事件都有合适的用处,

另外增加连续按压时间,释放时机,几乎可以组合任意需要的按键处理,

比如,长按,短按,连续按,长释放,短释放,连续释放,按下多久,多长时间内释放,指定时间内按压次数,指定时间内按指定顺序按压指定键。。。

做成支持多键同时按下就像电脑键盘那样,威力更大了

我的键盘驱动很早就是这样了

使用特权

评论回复
15
dirtwillfly| | 2014-10-28 10:58 | 只看该作者
Imakey 发表于 2014-10-28 09:10
做产品的都是采用这种结构吗???PIC只有一个中断入口,多个中断源,我试试 ...

做产品很少用delay

使用特权

评论回复
16
ch2014813| | 2014-10-28 11:46 | 只看该作者
写一个函数值,放中断-1。

使用特权

评论回复
17
dianzilc| | 2014-10-28 12:35 | 只看该作者
按下延时是教科书里的写法,在实际产品大多是用定时器。

使用特权

评论回复
18
xiaox314| | 2014-10-31 16:39 | 只看该作者
用定时器~

使用特权

评论回复
19
qq4988| | 2014-10-31 17:10 | 只看该作者
3楼正解

使用特权

评论回复
20
wyq165| | 2014-10-31 17:56 | 只看该作者
void Beep(uchar ch)
{
        uc_beepNum = ch*2-1;
        TIME3_OPEN();
}

void TIM3_IRQHandler(void)
{                                                                   
        if(TIM3->SR&0X0001)//溢出中断
        {
       
                if(uc_beepNum)
                {
                        SWITCH_BEEP = ((uc_beepNum%2)==0)?0:1;
                        uc_beepNum -- ;
                }else
                {
                        SWITCH_BEEP = 0;
                        TIME3_CLOSE();
                }
        }                                  
        TIM3->SR&=~(1<<0);//清除中断标志位             
}
这是我平时实现的,可能也不怎么好用。 定时器100ms中断1次。
平时调用Beep,ch为响的次数,希望对你有用。

使用特权

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

本版积分规则

个人签名:联系邮箱 997494013@qq.com

76

主题

779

帖子

4

粉丝