单片机按键连接方法总结

发布者:legend9最新更新时间:2015-10-13 来源: eefocus关键字:单片机  按键连接 手机看文章 扫描二维码
随时随地手机看文章
单片机在各种领域运用相当广泛,而作为人机交流的按键设计也有很多种。不同的设计方法,有着不同的优缺点。而又由于单片机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。[page]

然后再让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;
}

关键字:单片机  按键连接 引用地址:单片机按键连接方法总结

上一篇:学单片机该怎样入门
下一篇:单片机的选择

推荐阅读最新更新时间:2024-03-16 14:35

单片机小白学习之路(七)---数码管的动态显示
上篇讲到了用74LS138来控制数码管的位选,那是怎么选的呢?我们先来看看这个译码器的说明书 74LS138 /Y0--/Y7是数据输出 A0--A2是数据输入 /E1,/E2,E3是使能控制,/E1和/E2是低电平有效,E3是高电平有效 VDD是接电源;GND接地 最重要的是真值表了,来解释其运行方式 /E1和/E2是低电平有效,E3是高电平有效,只要其中一个不满足条件则/Y0--/Y7全部输出高电平,我们是共阴式数码管那么不会亮 从第四行开始都满足了,这时候就可以看看A0--A2了,顺序是A2- A1-A0,其从上往下依次是000,001,010,011,100,101,110,111.这样看出
[单片机]
瑞萨电子推出超35款全新MCU产品 拓展电机控制嵌入式处理产品阵容
两大产品家族三大系列MCU全新产品为业界带来更广泛的电机控制解决方案 2023 年 5 月 30 日,中国北京讯 - 全球半导体解决方案供应商瑞萨电子今日宣布面向电机控制应用领域发布三个全新MCU产品群,其中超过35种来自于RX和RA家族的新产品。 这些新款MCU扩充了瑞萨包括多种MCU与MPU、模拟和电源解决方案、传感器、通信设备、信号调节器等的卓越电机控制产品组合。 瑞萨推出两款基于Arm® Cortex®-M的RA家族的全新MCU产品群。其中,RA4T1产品群可提供100 MHz性能,以及高达256KB的闪存和40KB的SRAM;全新RA6T3产品群工作频率为200MHz,同时提供256KB的闪存和40KB的S
[嵌入式]
瑞萨电子推出超35款全新<font color='red'>MCU</font>产品 拓展电机控制嵌入式处理产品阵容
pic关于头文件的进一步理解(基于PIC单片机 C18编译器)
一:关于处理器的寄存器定义 针对处理器的寄存器定义文件是一个汇编文件,包含特定器件上所有特殊功能寄存器的定义。编译时,针对处理器的寄存器定义文件将被编译成需要链接到应用程序的目标文件 。 例如,在 PIC18C452 针对处理器的寄存器定义文件中, PORTA 定义为: SFR_UNBANKED0 UDATA_ACS H'f80' PORTA PORTAbits RES 1 ; 0xf80 第一行指定 PORTA 所在的数据寄存器存储区和这个存储区的起始地址。 PORTA 有两个标号, PORTAbits 和 PORTA,都指向同一个地址 (本例中是 0xf80)。 二:关于头文件声明
[单片机]
兆易创新•合肥工业大学GD32 MCU联合实验室成立
2019年4月12日,兆易创新•合肥工业大学GD32 MCU联合实验室揭牌仪式于合肥工业大学仪器科学与光电工程学院科技楼报告厅隆重举行。 领导致辞 参加此次揭牌仪式的有兆易创新MCU事业部总经理邓禹、兆易创新MCU事业部产品市场总监金光一、兆易创新公共关系处资深顾问陈友稼、兆易创新公共关系处合肥总经理李勤、合肥工业大学教务处处长陈翌庆、合肥工业大学就业办主任丁兆罡、合肥工业大学仪器学院党委书记钟军、合肥工业大学仪器学院副院长夏豪杰、合肥工业大学仪器学院党委副书记、副院长黄飞、Arm中国教育计划专员王梦馨、国家芯火计划计划上海基地部长沈国荣、国家芯火计划上海基地资深工程师韩芳、国家级合肥经济技术开发区管理委员会科
[嵌入式]
兆易创新•合肥工业大学GD32 <font color='red'>MCU</font>联合实验室成立
基于MSP430单片机的温度测量实验设计
随着时代的发展,科学技术也不断进步,新的科学技术在各个领域里广泛应用。高等教育是培养高水平人才的重要途径,但目前某些教学内容还比较落后,并没有跟上现代科技的发展。在高等教育的课程中引入更多的现代技术,有利于对人才的培养。本文介绍一种应用MSP4 30单片机测量温度的方法,来代替传统教学中相对落后的热敏电阻结合电流表的实验方法。 1 温度测量部分 用于测量温度的温度敏感元件有很多种,比如热电偶、热敏电阻、集成温度传感器、数字温度传感器等等。本系统采用的是热敏电阻。热敏电阻由对温度非常敏感的半导体陶瓷质工作体构成。与一般常用的金属电阻相比,它有较大的电阻温度系数,可以获得较高的温度分辨率。不同材料制成的热敏电阻适用的测温范围
[单片机]
基于MSP430<font color='red'>单片机</font>的温度测量实验设计
单片机编程时关于int
在进行单片机编程时,我们经常用Int定义变量。以前学C语言时,我知道int它表示的位数跟具体的硬件结构有关。不过看了一本书中 慎用int 这节后,我对int又有了更一步的认识。 原来C语言并没有进一步明确不同硬件平台下int位宽由硬件平台决定这一点,从而导致了对int不同的理解。实际上int并没有具体的位宽限制,是由所用硬件平台(MCU)和编译器共同决定位宽为多少,通常情况下编译器会将int的位宽定为与所用MCU的位宽一致。 文中也举了两个例子说明因为对int理解的不够深入而犯的错误。一个是因为将int误理解为32位,而编译器和MCU为16位宽。一个产品需要显示开机后的时间,显示精度为秒。如果按照int为32位的话,定义secon
[单片机]
Microchip PIC MCU全系列通用平台演示板资料大全
PIC MCU全系列通用平台演示板,是在一块开发板中同时支持Microchip的8/16/32位PIC单片机,集成LCD、LED以及电容触控板,此外,包含了一个专门的实时时钟电路,并且仅需要一颗AAA 5号电池。 而这种通用的开发板,目前只提供给参加技术培训研讨会的工程师,当然购买了此款开发板,便可免去技术研讨会的100元报名费。 该演示板附带PICkit 3 开发工具。 演示板还包括:USB接口、扬声器、音频输出接口、麦克风输入、蜂鸣器、多输入开关、电位计以及加速度计。 PIC MCU全系列通用平台演示板的详细资料: 3个PIC MCU控制器: PIC16LF1939-I/PT PIC24FJ256GA106-I
[单片机]
Microchip PIC <font color='red'>MCU</font>全系列通用平台演示板资料大全
如何升级STM32单片机的代码
bootloader设置: static void check_boot_mode(void) { uint32_t JumpAddress; void(*Jump_To_Application)(void); if (((*((__IO uint32_t*)(APP_SEGA_START_ADDRESS+8))) & 0x2FFE0000 ) == 0x20000000) { JumpAddress = *(__IO uint32_t*) (APP_SEGA_START_ADDRESS + 12); Jump_To_Application = (void *)JumpAddress; __set_MSP(*((__IO ui
[单片机]
如何升级STM32<font color='red'>单片机</font>的代码
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved