在单片机按键控制led灯里面有没有方法可以不用按键释放实现按下按键直接加一,不需要等待释放后再加一。

01:41 提问
问一下大神们,51单片机按键控制音乐播放c语言
问一下,单片机按键控制音乐播放,上一首,下一首,重复播放,暂停,这四个引脚用P3.0到P3.3口可以吗?具体怎么实现呢,搞了好久,大神有没有类似的程序,有点心塞,不知道哪里出问题,真心跪求!这个按键控制需不需要用到中断,还是纯粹的控制,谢了
按赞数排序
这里有一篇文件,你去看看,可以参考一下。
希望能帮到你。
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐请教高手是否有不用单片机也可以按一个按键实现三个档位控制的
按时间排序
CD4017十进制计数译码电路,输入端接按键,低电平有效,按1次Q1转高电平,按2次Q2为高,Q1为低,按3次Q3为高,Q1/Q2低,将Q4接清零端时,按4次全部为0复位。
有一种按键可以实现你的这个要求
简单的逻辑电路就行 你的输出是什么
感谢您为社区的和谐贡献力量请选择举报类型
经过核实后将会做出处理感谢您为社区和谐做出贡献
确定要取消此次报名,退出该活动?
请输入私信内容:您当前的位置:&>&&>&&>&
单片机按键去抖原理
由上图可以看出理想波形与实际波形之间是有区别的,实际波形在按下和释放的瞬间都有抖动的现象,抖动时间的长短和按键的机械特性有关,一般为5~10ms。通常我们手动按键然后释放,这个动作中稳定闭合的时间超过了20ms。因此单片机在检测键盘是否按下时都要加上去抖动操作,有专用的去抖动电路,也有专门的去抖动芯片,但通常我们采用软件延时的方法就可以解决抖动问题。
/* 软件去抖 */
if (0 == K1 )
//如果有键按下
delay_ms(8); //延时一段时间去抖
if (0 == K1)
//如果真的有键按下,检测到得是稳定闭合状态
... //按键以后需要做的事情
while(!K1); //松手检测,如果按住不放则一直在循环里后使用快捷导航没有帐号?
请完成以下验证码
查看: 21683|回复: 46
如何设计2个按键同时按的键盘扫描C程序
在线时间376 小时
威望4355分
芯币3362枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 4355, 距离下一级还需 1645 积分
五彩晶圆(中级), 积分 4355, 距离下一级还需 1645 积分
4*4键盘扫描C程序,每次只能扫到一个按键,如果要两个按键同时按,是不是先按下去的按键是进入中断
有奖直播:TI MSP430TM集成可配置信号链模块在传感测量领域的应用
要把目标订的实现起来辛苦一点!
在线时间3231 小时
威望13809分
芯币12219枚
E金币320枚
TA的帖子TA的资源
裸片初长成(初级), 积分 13809, 距离下一级还需 6191 积分
裸片初长成(初级), 积分 13809, 距离下一级还需 6191 积分
 键盘扫描程序未必只读一个键呀,可以写成每次全都读一遍,但先按下者被先读到是有可能的。
在线时间2575 小时
威望10371分
芯币1842枚
E金币448枚
TA的帖子TA的资源
这个按键时,去一下抖动,判断出哪个就是哪个,若两一起按,你可选一个为按下键,若就想两个一起按,可选按信一个再按下另一个
http://shop.taobao.com/
在线时间376 小时
威望4355分
芯币3362枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 4355, 距离下一级还需 1645 积分
五彩晶圆(中级), 积分 4355, 距离下一级还需 1645 积分
先谢谢LS2位
主程序是一直扫描按键的,我现在用的4*4,还剩4个按键没用到,我想增加一个记忆的功能,就是分别按S+A,S+B能分别记忆2种状态,以后再分别按A,B就能直接实现记忆的状态。这些状态是主程序里的CASE下分别调整的,先按S再按A,我想请教的是,是不是按S后要进入中断呀?
& && &P2=0x0f;
& && && & P1=0x00;
& && &P0_0=0;
& && &P0_1=1;
& && &delay(10);
& && &temp=P2;
& && &temp=temp & 0x0f;
& && &if (temp!=0x0f)
& && && & delay(100);
& && && & temp=P2;
& && && & temp=temp & 0x0f;
& && && & if (temp!=0x0f)
& && && && &{
& && && && &&&temp=P2;
& && && && &&&temp=temp & 0x0f;& && && && &&&
& && && && &&&switch(temp)
& && && && && & {
& && && && && && &case 0x0e:&&P1_6=1;//
& && && && && && &case 0x0d:&&P1_5=1;//
& && && && && && &case 0x0b:&&P1_4=1;//
& && && && && && &case 0x07:&&P1_3=1;//
& && && && && & }
& && && && &&&temp=P2;
& && && && &&&temp=temp & 0x0f;& && && && &&&
& && && && &&&while(temp!=0x0f)
& && && && && & {
& && && && && && &temp=P2;
& && && && && && &temp=temp & 0x0f;& && && && &&&
& && && && && & }
& && && && &}
[ 本帖最后由 simonprince 于
11:00 编辑 ]
要把目标订的实现起来辛苦一点!
在线时间3231 小时
威望13809分
芯币12219枚
E金币320枚
TA的帖子TA的资源
裸片初长成(初级), 积分 13809, 距离下一级还需 6191 积分
裸片初长成(初级), 积分 13809, 距离下一级还需 6191 积分
 4楼这样的读键写法不好,建议改写成定时中断+状态机,避免用延迟等待程序。想要在嵌入式业界里玩,一定要过这一关。
在线时间376 小时
威望4355分
芯币3362枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 4355, 距离下一级还需 1645 积分
五彩晶圆(中级), 积分 4355, 距离下一级还需 1645 积分
回复 5楼 仙猫 的帖子
恩,谢谢,您是说用,定时中断,比如说每10ms,查看键盘状态我正在改呢
可我还想知道我4楼所说的2个按键的方法怎么处理,希望您指导下思路
[ 本帖最后由 simonprince 于
11:51 编辑 ]
<p id="rate_17" onmouseover="showTip(this)" tip="多说点,多争论,我便好“坐收渔翁之利”, ...&威望 + 5 分
" class="mtn mbn">
要把目标订的实现起来辛苦一点!
在线时间3231 小时
威望13809分
芯币12219枚
E金币320枚
TA的帖子TA的资源
裸片初长成(初级), 积分 13809, 距离下一级还需 6191 积分
裸片初长成(初级), 积分 13809, 距离下一级还需 6191 积分
其实检测多键和一键并没什么区别
 比如每隔10ms读一次键,输出可以设一个16位的字,每位代表一个键,1/0分别代表On/Off。
 读键程序自己持有一个16位的静态变量作为本次读到的键值,保存给下次读键用。每次执行定时中断读键时,把本次读得的结果跟上次比较,如果相同就输出,不同就仅保存到静态变量里去作下次备用。这样输出的16个键的状态至少是经过10ms延迟过算“稳定”的,别的程序看这个值就知道有几个键被按下,位置在哪里。
 读键也能玩出很多花招来,上面说的只是用了尽量简单、不太消费资源的做法。
在线时间376 小时
威望4355分
芯币3362枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 4355, 距离下一级还需 1645 积分
五彩晶圆(中级), 积分 4355, 距离下一级还需 1645 积分
比如说我按下的是A键,中断读到的结果0X07,结果保存到静态变量K,10ms后再读。如果还是0X07就输出,如果不是(假如是B键0X0B)就保存0X0B到K,10ms后再读............
别的程序看到0X07这个值就知道是A键被按下了
那如果按S+D,就是先按S,按住不松手,马上再按D,我想让这个按键组合干别的事?
那程序会读出什么值才能满足这个按键组合
[ 本帖最后由 simonprince 于
13:44 编辑 ]
要把目标订的实现起来辛苦一点!
在线时间3231 小时
威望13809分
芯币12219枚
E金币320枚
TA的帖子TA的资源
裸片初长成(初级), 积分 13809, 距离下一级还需 6191 积分
裸片初长成(初级), 积分 13809, 距离下一级还需 6191 积分
 使每个键的On/Off信息只占用一位二进制,各键的bit位置不同。比如定义单独按A键为0x0001,按B键为0x0002,按C键为0x0004,这样若在输出看到0x0005的键值时就知道是A和C的组合了。
在线时间376 小时
威望4355分
芯币3362枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 4355, 距离下一级还需 1645 积分
五彩晶圆(中级), 积分 4355, 距离下一级还需 1645 积分
哦,O(∩_∩)O谢谢你的指点
要把目标订的实现起来辛苦一点!
在线时间379 小时
威望4761分
芯币5691枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 4761, 距离下一级还需 1239 积分
五彩晶圆(中级), 积分 4761, 距离下一级还需 1239 积分
需要电路配合。不是随便就可以的
在线时间299 小时
威望10062分
芯币3690枚
TA的帖子TA的资源
裸片初长成(初级), 积分 10062, 距离下一级还需 9938 积分
裸片初长成(初级), 积分 10062, 距离下一级还需 9938 积分
原帖由 simonprince 于
10:45 发表
先谢谢LS2位
主程序是一直扫描按键的,我现在用的4*4,还剩4个按键没用到,我想增加一个记忆的功能,就是分别按S+A,S+B能分别记忆2种状态,以后再分别按A,B就能直接实现记忆的状态。这些状态是主程序里的CASE下分别 ...
笨笨磕磕地,但是很仔细地阅读了这个循环,学到了很多东西,谢谢!
有几个问题:
1、键值处理主要在case段实现的,这里只有四个case (7,b,d,e),这样是不是说只处理单个键的按下;
2、P0_0和P0_1的初始赋值,是否表示P0_1-1虽然有硬连线,但是并不参与键扫描;
3、还有,这里只处理了P2的低四个bit(temp & 0x0f),是否意味着,只处理这四个键的扫描。
4、在case中的分号后面,表示或许要补充转移或者启动中断子程,那么返回点如何处理,是否仍然需要继续后续的按键释放判断(指第三个while段)。
5、两个不同延时的处理的优点是什么?我的理解是外环10mS快扫,是加速;后者(100mS)主要完成消抖;
问题很低级,多打扰了。
为什么总用3/4号仿宋? 答:大点清楚‘,仿宋是工程图的标准字体。
在线时间308 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 49, 距离下一级还需 151 积分
一粒金砂(中级), 积分 49, 距离下一级还需 151 积分
需要电路配合。不是随便就可以的
需要电路配合。不是随便就可以的
在线时间379 小时
威望4761分
芯币5691枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 4761, 距离下一级还需 1239 积分
五彩晶圆(中级), 积分 4761, 距离下一级还需 1239 积分
如果电路不支持两键同时按下。那么会发生误判
在线时间299 小时
威望10062分
芯币3690枚
TA的帖子TA的资源
裸片初长成(初级), 积分 10062, 距离下一级还需 9938 积分
裸片初长成(初级), 积分 10062, 距离下一级还需 9938 积分
具体问题,具体分析
& &需要电路配合。不是随便就可以的.非常重要的提示。
& &编程和硬件层的相关程度是嵌入/单片机与PC的C编程的主要差异。即便是初学者也会注意到的。要真正学点东西或者搞清楚些什么,往往需要软硬结合的。例如看到一张电路图(硬件)时,最好主动去联想它的软件联系;同样阅读一段程序,也总是要估计(包括揣摩)一下硬件结构,否则可能无法真正理解这段程序。
& &问题总是具体的,这里是跟随4楼 Mr.simonprince的帖子进行讨论的。具体到这段程序,为了读懂这段程序,也反推了它的硬件结构,还好不是太难,如图。
EEW11p.JPG (16.29 KB, 下载次数: 0)
12:47 上传
& &其中,属于没把握反推的主要有两处(左):
1、P0_1。利用P0的0和1的赋值可以方便地把按键(或开关)分成两组,分别进行扫描,这里就认为P0_1(=1)暂时不进入扫描范围,举个例子,有些便携式设备往往需要加锁(封锁)某些键来避免误操作;
2、认为P2输入的检测是八位的(P2_0:7);
& &即使排除以上的揣测(这些命题为假),那P0_0=0;和P2_0:3组合作为键扫描(右)就不是揣测,而是真的了,其实这是个典型的键扫硬件结构。
& &综上,通过读取的经过延时(消抖)后的P2_0:3的值,就已经全面地反映了键组的状态。
& &那么,怎样处理双键同时的问题呢?其实只要:
&&a,&&多加几个case,或者干脆,
&&b,&&把这个P2状态作为一个键服务子程函数的参数,就完全可以处理这四个键任意(扣除0,最多十五个)组合。至于如何处理这个键服务子程函数,那是具体应用设计的问题。不消说两个键,就是三个、四个都可以(不过很少这么用的,也许,电子琴和弦弹奏时就会用到)。
& &如果把变量temp改个名字,例如叫scan_value、key_status等,也许对初学者方便些……这叫提高可读性?(初学者就是事多,又提出一个问题!)
[ 本帖最后由 xiaoxif 于
12:58 编辑 ]
为什么总用3/4号仿宋? 答:大点清楚‘,仿宋是工程图的标准字体。
在线时间339 小时
威望2466分
芯币2099枚
TA的帖子TA的资源
五彩晶圆(初级), 积分 2466, 距离下一级还需 1034 积分
五彩晶圆(初级), 积分 2466, 距离下一级还需 1034 积分
回复 楼主 simonprince 的帖子
矩阵键盘的组合键检测,有一个较有效的方法可以参考。
作两遍扫描,第一遍行发检测脉冲,列读按键状态;第二遍列发检测脉冲,行读到键盘状态。
两遍扫描的方法,可以检测所有的单键和两个组合键的按键输入,对于三键的组合键不能完全检测到。
<p id="rate_036" onmouseover="showTip(this)" tip="&威望 + 5 分
" class="mtn mbn">
电子工程师技术交流QQ群:,专注于自动控制、数字电源等
在线时间299 小时
威望10062分
芯币3690枚
TA的帖子TA的资源
裸片初长成(初级), 积分 10062, 距离下一级还需 9938 积分
裸片初长成(初级), 积分 10062, 距离下一级还需 9938 积分
原帖由 simonprince 于
10:45 发表
先谢谢LS2位
主程序是一直扫描按键的,我现在用的4*4,还剩4个按键没用到,我想增加一个记忆的功能,就是分别按S+A,S+B能分别记忆2种状态,以后再分别按A,B就能直接实现记忆的状态。这些状态是主程序里的CASE下分别 ...
对先生这段程序的学习笔记--做为一份作业(一张框图),麻烦给看看,望多指点,谢谢。
程序阅读1p.jpg (27.66 KB, 下载次数: 1)
13:15 上传
为什么总用3/4号仿宋? 答:大点清楚‘,仿宋是工程图的标准字体。
在线时间3231 小时
威望13809分
芯币12219枚
E金币320枚
TA的帖子TA的资源
裸片初长成(初级), 积分 13809, 距离下一级还需 6191 积分
裸片初长成(初级), 积分 13809, 距离下一级还需 6191 积分
4楼的程序估计并非完成品,但意图是大致清楚的(楼主如能出示一下电路图就更清晰了):
①.P0是输出口,P2是输入口。
②.每次P0输出1位(估计是b3~b0),激活4×4键盘的1行(列)。
③.输出P0后等delay(10)是留置了充电时间,为了让读回的值更稳定。
④.对于每1行(列),从P2的b3~b0读回1列(行)的键通/断信息,从而定位被按下的键(case)。
⑤.如未发现有键被按下则立即离开,否则稍等后再看键值(delay(100),防抖)。
⑥.P1是读键结果的输出。
⑦.读到一个按键后循环等待它释放之后再行下一次检测,周而复始。
另:delay的参数不一定是ms,不能做定量分析。
这个程序无法正常测出复合键,一是因为case里没有对多键同时按下的处理,而更重要的是手按键总会有先后,等待释放才做下一次检测就永远读不到后按下的那个键了,应作改动如下:
&&temp = P2;
&&temp = temp & 0x0f;& && && && &&&
&&while (temp != 0x0f)
& && &temp=P2;
& && &temp=temp & 0x0f;
&&while ((P2 & 0x0f) != temp);
[ 本帖最后由 仙猫 于
15:57 编辑 ]
<p id="rate_17" onmouseover="showTip(this)" tip="又学到东西了,请诸位尽量多说点,好吗?&威望 + 5 分
" class="mtn mbn">
在线时间266 小时
芯币5908枚
TA的帖子TA的资源
纯净的硅(初级), 积分 735, 距离下一级还需 65 积分
纯净的硅(初级), 积分 735, 距离下一级还需 65 积分
学习了,谢谢........................
不断地学习,才会有创新!
淘宝小店:手机、qq点卡、游戏点卡自动充值 http://shop.taobao.com/
在线时间3231 小时
威望13809分
芯币12219枚
E金币320枚
TA的帖子TA的资源
裸片初长成(初级), 积分 13809, 距离下一级还需 6191 积分
裸片初长成(初级), 积分 13809, 距离下一级还需 6191 积分
 俺在18楼提出了检测复合键的改动方案,仔细了下,是错的,因为在这个循环里,由P0激活的那一行(列)被固定了,被按的两个键如果不在同一行(列)里还是检测不出来。
 这会田里的农活正忙,稍后写个中断+状态机的代码试试,应该也是很短的。
荣誉会员勋章
曾经的版主且威望大于2000,或对EEWORLD论坛有突出贡献的坛友
EEWORLD 官方微信
Powered by微信公众平台

我要回帖

更多关于 单片机一个按键多功能汇编实现 的文章

 

随机推荐