A. 51单片机4*4矩阵键盘如何同时实现单击+双击的功能
一般地,我们的键盘检测都有一个按键码存储字节,一般情况下,只要检测到有效按键,那么这个存储字节的按历宴键码就有效,也就是单击。何为双击呢?双击就是在监测到该按键后在该按键要有作用(这个作用就是单击)之前又检测到该按键,然后就当作了双击。那怎么实现这一判断呢?我们只要加一个软计数器,当检测到有效按键后,该计数器开始向下计数,如果计数器自然减到了0那么就是单击生效;如伏烂桥果在该计数器值没有减到0之前又检测到该按键,那么就是双击立马有效同时计数器归零。这个计数器肯定是ms级的,也就是要在定时器里工作,只要它不为0,那么定时器中断服务就对它减1操作,因此计数器本身同时就是一个开关量,而触发它的是检测缺猛到有效按键。
B. 单片机按键怎么实现长按和短按和组合键功能
是在实物开发板上实现吗?
长按和短按很好实现,当检测到有按键按下了,就开始计时,用定时器,检测到按键松开了,停止计时,然后根据计时的时间长短,确定是长按还是短按,比如,时间小于0.5秒为短按,超过3秒为长按,其余时间为无效,不够长按时间,就为无效按键,也不算是短按的。这样可以排除是随意按键的可能。
组合键就好办了,检测到同时按两个,三个,就为组合键,至于是什么功能,那由你自己定义了。
C. 单片机控制系统中,按键应如何连接不同连接方式,配置gpio工作模式时应如何
在单片机控制系统中,按键通常使用GPIO引脚连接,以便单片机能够读取按键的状态并作出相应的响应。按键连接的方式通常有两种:短接方式和上拉/下拉电阻方式。
短接方式
短接方式是将按键连接到单片机的两个相邻的GPIO引脚上,当按键被按下时,两个引脚就会短接在一起,形成一个电路,单片机可以通过检测引脚之间的电平变化来检测按键的状态。这种连接方式需要使用输入模式的GPIO引脚,具体的配置操作如下:
(1)选择相邻的两个GPIO引脚,一个用于连接按键的一端,另一个用于连接按键的另一端。
(2)将这两个GPIO引脚的工作模式设置为输入模式。
(3)为这两个GPIO引脚配置上拉电阻或下拉电阻,以确保在按键未被按下时,GPIO引脚处于稳定状态。
上拉/下拉电阻方式
上拉/下拉电阻方式是将按键连接到单片机的一个GPIO引脚上,并在按键与单片机之间添加一个上拉或下拉电阻。当按键未被按下时,上拉/下拉电阻会使GPIO引脚处于稳定状态,当按键被按下时,GPIO引脚裤樱手的电平会发生变化,单片机可以检测到按键的状态。这种连接方式需要使用输入模式的GPIO引脚,具体的配置操作如下:
(1)选择一个GPIO引脚用于连接按键。
(2)将这个GPIO引脚的工作模式设置为输入模式。
(3)为这个GPIO引脚配置上拉电阻或下拉电阻,以确保在按键未被按下时,GPIO引脚处于稳定状态。
需要注意的是,配置GPIO工作模式时,应该根据按键连颂空接方式选择适当的工作模式和上拉/下拉电阻配置,以确保按键的正常工作。胡嫌同时,也应该注意防止按键产生抖动等问题,可以通过软件消抖或硬件滤波等方法来解决。
D. 如何用单片机判断按键是单击还是双击
假设有键按下时 key = 0 。
if(key == 0) { //发现按下按键
Delay(10) //延时约10ms
if(key == 0) { //确认第一次按下
while(!key); //等待释放
//-------------------以上是常规的按键判别步骤
Delay(100) //多延时一会,约100ms
if(key == 0) {//确认第二次按下
//执行双击程序
}
else {
//执行单击程序
}
}
}
E. 单片机button是什么
单片机button是按键开关。buttonn对话框中的一种图形元素。当激活它时,能执行指定的功能。用户可以采用以下方法来激活按钮,用鼠标在其上单击,或者当按钮获得聚焦时按下Return或Enter键。
鼠标上的一个活动片,用于激活一些功能。旧式的鼠标模型只有一个按钮,新式一般有两个或更多个按钮。
单片机功能
单片机SingleChipMicrocomputer是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种IO口和中断系统、定时器。
计数器等功能可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、AD转换器等电路集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。
F. 如何用单片机实现单击 + 双击 + 长按
这是三种键有效方法,可按下面思路设计供你参考;
1、单击有效,可以采用弹起有效。如选择上升沿有效。
2、双击有效,要采用在一定的定时时间内两次计数的方法,也就是先设定一个有效时间,在第一次键有效后在这个有效时间内键再次有效就可以认定最终有效,否则无效。
3、长按有效,也要采用计时的方法。也就是键有效后在一定的时间内连续检测有效性,如检测时间内连续保持有效可以认定最终有效,否则无效。
后两种方法要求设计一个专门的判断程序才能完成。
G. 单片机按键有几种方式_单片机按键连接方法
单片机按键连接方法总结(五种按键扩展方案详细介绍)
单片机在各种领域运用相当广泛,而作为人机交流的按键设计也有很多种。不同的设计方法,有着不同的优缺点。而又由于单片机I/O资源有限,如何用最少的I/O口扩展更多的按键是我所研究的问题。接下来我给大家展示几种自己觉得比较好的按键扩展方案,大家可以在以后的单片机电路设计中灵活运用。
1)、第一种是最为常见的,也就是一个I/O口对应一个按钮开关。
这种方案是一对一的,一个I/O口对应一个按键。这里P00到P04,都外接了一个上拉电阻,在没有开关按下的时候,是高电平,一旦有按键按下,就被拉成低电平。这种方案优点是电路简单可靠,程序设计也很简单。缺点是占用I/O资源多。如果单片机资源够多,不紧缺,推荐使用这种方案携启。
2)、第二种方案也比较常见,但是比第一种的资源利用率要高,硬件电路也不复杂。
这是一种矩阵式键盘,用8个I/O控制了16个按钮开关,优点显而易见。当然这种电路的程序设计相对也还是很简单的。由P00到P03循环输出低电平,然后检测P04到P07的状态。比方说这里P00到P03口输出1000,然后检测P04到P07,如果P04为1则说明按下的键为s1,如果P05为1则说明按下的是s2等等。为了电路的可靠,也可以和第一种方案一样加上上拉电阻。
3)、第三种是我自己搞的一种方案,可以使用4个I/O控制8个按键,电路多了一些二极管,稍微复杂了一点。
这个电路的原理很简单,就是利用二极管的单向导电性。也是和上面的方案一样,程序需要采用轮训的方法。比方说,先置P00到P03都为低电平,然后把P00置为高电平,接着查询P02和P03的状态,如果P02为高则说明按下的是s5,若P03为高则说明按下的是s6,然后再让P00为低,P01为高,同样检测P02和P03的状态。接下来分别让P02和P03为高,其他为低,分别检测P00和P01的状态,然后再做判断。这种方案的程序其实也不难。
4)这是我在一本书上看到的,感觉设计的非常巧妙,同样它也用到了二极管,不过比我的上一种方案的I/O利用率更高,他用4个I/O口控制了12个按盯正键。我相信你了解了之后也会惊奇的。
首先好好品味一下这个方案吧,想想怎么来识别按键呢!
首先,我们让P00到P03全输出高电平。如果这个时候从P00到P03的任意一个端口检测到低电平,很容易知道是按下了那个键,肯定是s13到s16的其中一个。如果没有检测到信号,就进行下一次的检测,让P01到P03为高电平,P00为低电平,然后检测P01到P03的状态。如凯隐悔果P01为低,则按下的是s1,;P02为低,则按下的是s2;P03为低,则按下的是s3。
然后再让P00,P02,P03为高电平,P01为低电平。同理用上面的方法可以检测出按下的那个按键。(部分程序源代码会在后面贴出来,阅读代码可以更好理解电路)
5)、接下来这种方案则更为强大。不过需要用到一个A/D转换器(有的单片机集成有A/D转换器,则更为方便)。如果A/D转化器的分辨率为n位,理论上是可以扩展2^n(2的n次方)个按键。
这是一种接AD转化器的方案,有两种:第一种是并联式;第二种是串联式。在功能上也有些不同。第一种的话各个电阻值各不相同,当按下不同按键时,进入AD的模拟量是不一样的,通过AD转换,就可以得到按下的是哪个按键。方式一还可以同时识别多个按键,即可以设置组合键,只要电阻取得合适。
方式二各个电阻可以取一样的,方便计算,但是不能有组合按键。因为当按下上面的按键后,下面所有按键都会被短路。(在实际运用中,还需要接地,这里没有画出) 。前面说理论上可以扩展2^n个按键,这只是理论,因为这里电阻的精度有限,所以实际是不可能的,两个模拟量之间要有足够大的差值,程序才可能准确的分辨。
上面就是我介绍的五种按键扩展方案,后面几种比较另类,不过也有他们的优点。以上电路我都仿真过,可以实现。
附方案4键盘扫描源代码:
sbit line_1=P0.1;
sbit line_2=P0.2;
sbit line_3=P0.3;
sbit line_4=P0.4
char key=0;
void key_scan()
{
line_1=line_2=line_3=line_4=1;
if(~(line_1&&line_2&&line_3&&line_4)) {
if(line_1==0) {key=13;return;} if(line_2==0) {key=14; return;} if(line_3==0) {key=15;return;} if(line_4==0) {key=16; return;} }
line_2=line_3=line_4=1;
line_1=0;
if(~(line_2&&line_3&&line_4)) {
delay();
if(line_2==0) {key=1;return;} if(line_3==0) {key=2;return;} if(line_4==0) {key=3;return;} }
line_1=line_3=line_4=1;
line_2=0;
if(~(line_1&&line_3&&line_4)) {
delay();
if(line_3==0) {key=5;return;} if(line_4==0) {key=6;return;} }
line_1=line_2=line_4=1;
line_3=0;
if(~(line_2&&line_1&&line_4)) {
delay();
if(line_4==0) {key=9;return;} }
line_4=0;
line_1=line_2=line_3=1;
if(~(line_2&&line_3&&line_1)) {
delay();
if(line_1==0) {key=10;return;} if(line_2==0) {key=11;return;} if(line_3==0) {key=12;return;} }
line_3=0;
line_1=line_2=line_4=1;
if(~(line_2&&line_3&&line_4)) {
delay();
if(line_1==0) {key=7;return; } if(line_2==0) {key=8;return; } }
line_2=0;
line_1=line_3=line_4=1;
if(~(line_2&&line_3&&line_4)) {
delay();
if(line_1==0) {key=4;return; } }
return;
}