用一个IO口控制几个按键的方法

合集下载

用最少的IO口扫最多的按键

用最少的IO口扫最多的按键

用最少的IO口扫最多的按键竟然可以这样在做项目(工程)的时候,我们经常要用到比较多的按键,而且IO资源紧张,于是我们就想方设法地在别的模块中节省IO口,好不容易挤出一两个IO口,却发现仍然不够用,实在没办法了就添加一个IC来扫键。

一个IC虽然价格不高,但对于大批量生产而且产品利润低的厂家来说,这是一笔不菲的开支!那,我们能不能想到比较好的扫键方法:用最少的IO口,扫最多的键?可以吗?举个例:给出5个IO口,能扫多少键?有人说是2*3=6个,如图一:图一对,大部分技术参考书都这么做,我们也经常这样做:用3个IO口作行扫描,2个IO作列检测(为方便描述,我们约定:设置某一IO口输出为“0”――称其为“扫某IO口”)。

用行线输出扫键码,列线检测是否有按键的查询方法进行扫键。

扫键流程:在行线依次输出011,101,110扫键值,行线每输出一个扫键值,列线检测一次。

当列线检测到有按键时,结合输出的扫键值可以判断相应的按键。

但是,5个IO真的只能扫6个键吗?有人说可以扫9个,很聪明!利用行IO与地衍生3个键(要注意上拉电阻),如图二:图二扫键流程:先检测3个行IO口,对K1’,K2’,K3’进行扫键,之后如上述2*3扫键流程。

5个IO口能扫9个键,够厉害吧,足足比6个键多了1/2!动动脑,还能不能再多扫几个?就几个?一个也行!好,再想一下,硬是被逼出来了!如图三:图三不多不少,正好10个键!这种扫键方式比较少见吧!漂亮!扫键流程:设IO1输出为“0”,检测IO2…IO5,若判断有相应健按下,则可知有健;若无键,则继续扫键:设IO2输出为“0”,检测IO3,IO4,IO5,判断有无键按下,如此类推。

这里应注意:当扫某一IO口(输出为“0”)时,不要去检测已经扫过的IO口。

如:此时设置IO2输出为“0”,依次检测IO3,IO4,IO5,但不要去检测IO1,否则会出错(为什么,请思考)。

感觉怎么样?不错吧!让我们再看看图三,好有成就感!看着,看着……又看到了什么?快!见图四:图四真强!被您看出20个键!多了一个对称的三角形。

用AVR单片机的ADC功能实现1个IO口连接4个按键 附件

用AVR单片机的ADC功能实现1个IO口连接4个按键 附件

用AVR单片机的ADC功能实现1个I/O口连接4个按键最近用AVR的M48作一个东西,这一个口那一个口突然发现IO口不够用了。

用扩展芯片是没问题,但是感觉太浪费了,恰巧AVR有ADC功能,我看到好多人用ADC功能做按键一个IO口实现24按键,我就4个按键做起来应该不是很难。

看完datasheet的ADC和参考网上资料,程序写完以后运行效果还不错,下面是电路图和源程序:/********************************************************************** *****名称: unsigned int GetADCValue(unsigned char uchADCChannel) * *功能: 获取按键ADC值 **参数: 无 **返回: 按键ADC值 ********************************************************************** *****/unsigned int GetADCValue(unsigned char uchADCChannel){unsigned char i;unsigned int uiADCValue = 0;ADMUX = _BV(REFS0)|uchADCChannel; // 参考电压AVCC选择for (i=0; i<4; i++) // 连续转换4次{ADCSRA |= (1< ADCSRA |= (1< loop_until_bit_is_set(ADCSRA, ADIF); // 等待ADC转换结束ADCSRA |= (1 << ADIF); // 写1清除标志位uiADCValue =uiADCValue + ADC;}uiADCValue /= 4; // 取平均值return uiADCValue;}/********************************************************************** *****名称: unsigned char GetKeyValue(void) **功能: 获取按键值 **参数: 无 **返回: 按键值 ********************************************************************** *****/unsigned char GetKeyValue(void){// 5.24V下按键与对应ADC值如下// KEY NO KEY0 KEY1 KEY2 KEY3// ADC 1023 0012 390 565 669unsigned char uchKeyValue = NOKEY; // 按键码unsigned int uiKeyADC = 0; // 按键ADC值uiKeyADC = GetADCValue(ADC_CHANNEL);if(uiKeyADC<1000) // 如果有键按下{DelayNms(10); // 延时10ms消抖uiKeyADC = GetADCValue(ADC_CHANNEL);if(uiKeyADC < 32) // KEY0{uchKeyValue = KEY0;}else if(uiKeyADC < 410) // KEY1{uchKeyValue = KEY1;}else if(uiKeyADC < 585) // KEY2{uchKeyValue = KEY2;}else if(uiKeyADC < 689) // KEY3 {uchKeyValue = KEY3;}}return uchKeyValue;}。

这是我在网上论坛上看到的用少量的IO口实现多个按键的电路

这是我在网上论坛上看到的用少量的IO口实现多个按键的电路
当读到其它状态时(10,11,01)再对P1口输入01
如果读到00时隐时现认为是K4按下。子程序返回4
#include<reg52.h>
#define uchar unsigned char
void delay(unsigned int i);
uchar getkey(void);
uchar keyvol;
case 4:{P2=0x10;}break;
default:break;
}
}
}
uchar getkey(void)
{
uchar x;
P1=P1|0x03;
x=P1&0x03;
if(x<3)
{
delay(7000);//延时
P1=P1|0x03;
x=P1&0x03;
}//直接返回K0,K1,K2键号0,1,2
程序如下,基本思想是先对P1.1和P1.0口输入11.然后读取P1口的状态,
当读到00时就认为是K0按下,子程序返回0
当读到01时认为是K1键按下,子程序返回1
当读到10时认为是K2键按下。子程序返回2
当读到11时。认为K0,K1,K2键都没有按下。则再对P1口输入10。
如果读到00时认为是K3按下。子程序返回3
}
void delay(unsigned int i)
{
while(i--);
}
x=x+3;//返回K3键号
}
if(x>3)
{
P1=P1|0x03;
P1=P1&0xfd; //01
x=P1&0x03;
x=x+4; //返回K4键号

用一条IO口实现两个按键功能

用一条IO口实现两个按键功能

用一条IO口实现两个按键功能发布时间:2011-02-27 14:11:36 年前去到一个朋友那里,提到现在客户对成本要求非常之高,尤其是玩具行业,已经是一分一厘的去计算产品成本。

朋友感慨为了省成本,方案商是绞尽脑汁地去想各种实现方法,说遇到过为了节省成本,硬是用单片机一条IO实现了两个按键的功能,让他颇为诧异,好久都没想明白原理。

一条IO实现两个按键,听上去确实挺新奇,既然别人能够实现,我想我也应该可以做到,看来得找找实现的方法。

我有一个习惯,遇到某些问题的时候,会在睡觉前想解决方法,想着想着就会睡着了,问题的答案有没有找到则不一定。

我知道有用一条IO实现多个按键的方法,这样的方法大多是选用的IO支持ADC功能,用电阻分压后通过读电压判断键值。

如果IO不支持ADC功能,也不是不行,可以用电容充放电的方法实现ADC,从而用普通IO间接进行测量。

(参见我之前关于键盘扫描的文章)这样用一条IO实现两个按键给我的第一感觉是可能需要利用到电容充放电原理,于是在半梦半醒之中找到了实现的方法。

先看上图左边部分,如果MCU_IO1为双向IO口,假设单片机程序按以下流程处理,看看会得到什么样的结果?1.MCU_IO1设定为输出,输出高电平一段时间,此时电容C1会充电,最后C1上的电压接近电源电压。

2.MCU_IO1设定为输入,如果J1、J2均不按下,此时MCU_IO1可以理解成一个阻值很大的电阻接地,电容C1上的电荷会通过这个电阻逐渐释放掉,这样C1上的电压会逐渐降低到零。

因为C1上的电压下降需要一个过程,当MCU_IO1设为输入后马上读一下MCU_IO1的状态,此时会读到什么结果?显然是高电平状态1。

3.再将MCU_IO1设定为输出,输出低电平一段时间,显然不管电容C1处于什么状态,只要MCU_IO1输出低电平时间足够长,最后C1上的电压应该接近零。

4.再将MCU_IO1设定为输入,如果J1、J2同样不按下,MCU_IO1读到的是低电平状态0。

用一条IO口实现两个按键功能

用一条IO口实现两个按键功能

用一条IO口实现两个按键功能年前去到一个朋友那里,提到现在客户对成本要求非常之高,尤其是玩具行业,已经是一分一厘的去计算产品成本。

朋友感慨为了省成本,方案商是绞尽脑汁地去想各种实现方法,说遇到过为了节省成本,硬是用单片机一条IO实现了两个按键的功能,让他颇为诧异,好久都没想明白原理。

一条IO实现两个按键,听上去确实挺新奇,既然别人能够实现,我想我也应该可以做到,看来得找找实现的方法。

我有一个习惯,遇到某些问题的时候,会在睡觉前想解决方法,想着想着就会睡着了,问题的答案有没有找到则不一定。

我知道有用一条IO实现多个按键的方法,这样的方法大多是选用的IO支持ADC功能,用电阻分压后通过读电压判断键值。

如果IO不支持ADC功能,也不是不行,可以用电容充放电的方法实现ADC,从而用普通IO间接进行测量。

(参见我之前关于键盘扫描的文章)这样用一条IO实现两个按键给我的第一感觉是可能需要利用到电容充放电原理,于是在半梦半醒之中找到了实现的方法。

先看上图左边部分,如果MCU_IO1为双向IO口,假设单片机程序按以下流程处理,看看会得到什么样的结果?1.MCU_IO1设定为输出,输出高电平一段时间,此时电容C1会充电,最后C1上的电压接近电源电压。

2.MCU_IO1设定为输入,如果J1、J2均不按下,此时MCU_IO1可以理解成一个阻值很大的电阻接地,电容C1上的电荷会通过这个电阻逐渐释放掉,这样C1上的电压会逐渐降低到零。

因为C1上的电压下降需要一个过程,当MCU_IO1设为输入后马上读一下MCU_IO1的状态,此时会读到什么结果?显然是高电平状态1。

3.再将MCU_IO1设定为输出,输出低电平一段时间,显然不管电容C1处于什么状态,只要MCU_IO1输出低电平时间足够长,最后C1上的电压应该接近零。

4.再将MCU_IO1设定为输入,如果J1、J2同样不按下,MCU_IO1读到的是低电平状态0。

如果J1按下,再来看看这四步,此时电容C1已经被强制接到电源上,MCU_IO1对其的充放电已经不起作用,在步骤2中MCU_IO1读到的状态依然是1,但在步骤4中MCU_IO1读到的状态就不再是0,而是变为1。

AT89S51单片机5个IO口控制95个按键

AT89S51单片机5个IO口控制95个按键

根据数学的组合思维,我们可以得出以下的集中连接方式方式:
一、①&①接法(如图1)。

图1
注:此种接法中从通一个I/O口发出的某按键左右电平相等,如图中红色箭头所指。

那么,该接法能实现5*4个按键的正常工作(这里暂不介绍二极管)。

二、①&②接法(如图2)
图2
实现5*4个按键的正常工作。

三、①&③接法(如图3)
图3
注:如图,若将绿色的两个二极管连接在一个I/O口上,则与①&②的某个键一样,若同时排列则按键失效。

实现5*6个按键的正常工作。

四、①&④接法(如图4)
图4
实现5*5个按键正常工作。

以上能总共实现5*4+5*4+5*6+5*5=95个按键。

其中,没有②&①、②&②、...、⑤&④等是因为当全部按键都在一起时
①&②和②&①中②在利用扫描法的时候会发生混淆。

这里仅仅实现了95个按键,据可靠消息,5个I/O口能实现100多个按键,望大家多多帮忙指导,不胜感激!。

2个IO?口检测6个按键

2个IO?口检测6个按键

2个IO?口检测6个按键2个I/O 口检测6个按键(2010-08-16 22:40:40)标签:51it分类:单片机学习笔记单片机按键今天看到了用2个I/O口来检测6个按键的方法,确实很霸道,特传上来和大家一起分享。

原理图如下:分析:首先:IO1,IO2输出高电平S1按下,IO2为低电平S2按下,IO1为低电平S3按下,IO1,IO2为0.7V(1N4148导通电压),还是低电平。

现在开始判别其他几个按键了:1、IO1输出低电平,读IO2电平①如果IO2为低电平,此时应该是S4或者S6按下(S6按下时,IO2为0.7V,依旧是低电平)。

②此时IO1输出高电平,IO2输出低电平,读IO1电平当S4按下时,IO1为低电平。

剩余的就只能是S6了。

2、IO1输出高电平,IO2输出低电平读IO1,S5按下时,IO1为低电平。

若IO1依旧为高电平,则是S6按下了。

按键扫描程序:unsigned char scan_key(void){unsigned char keyval = 0;//无键,有键1~6KEY_IO1 = 1;//释放总线KEY_IO2 = 1;//释放总线if (!KEY_IO1 && !KEY_IO2)keyval = 3;//S3else if (!KEY_IO1)keyval = 2;//S2else if (!KEY_IO2)keyval = 1;//S1else{//开始扫描,也要考虑小毛贼的问题~~~ KEY_IO1 = 0;//扫描if (!KEY_IO2){//这时不能立即判定S4/S6KEY_IO1 = 1;//释放总线KEY_IO2 = 0;//反向扫描if (!KEY_IO1)keyval = 4;//S4~~~elsekeyval = 6;//S6}else{//只能是S5了KEY_IO1 = 1;//释放总线KEY_IO2 = 0;//反向扫描if (!KEY_IO1)keyval = 5;//S5//else keyval = 6;//S6//上面已判出了S6,这句是废话}KEY_IO1 = 1;//释放总线//已经释放~~~KEY_IO2 = 1;//释放总线}return keyval;//返回键值0-无键,1~6-S1~S6键}程序流程图:。

占用较少的单片机IO口就能够实现较多的按键功能

占用较少的单片机IO口就能够实现较多的按键功能

本文介绍两种方法解决"如何占用较少的单片机I/O口就能够实现较多的按键功能?"
方法一:二进制编码法
这个方法我在好几个产品上都用过,适合需要的按键不是太多的情况下使用.如果单片机有n 个I/O口,那么在理论上就可以实现2n—1个按键, 下面的电路图是利用3个I/O口实现6个按键的功能,每个按键代表1个二进制编码,如[ENT]键的编码是[0 0 1],其他按键以此类推。

方法二:A/D值判断法
这个方法只占用单片机的1个A/D输入口,就可以实现较多的按键功能.通过采样A/D值的大小就可以判断是哪个按键被按下,缺点是当多个按键同时按下时,容易判断出错.
本文简单介绍“低边与高边电流检测”的主要区别。

图B低边电流检测方案简单而且便宜,一般的运放器都可以实现此功能。

但是很多应用无法接受检测电阻Rs引入的地线干扰问题,负载电流较大时更会加剧这个问题,因为系统中一部分电路的地电位由于低边检流电阻而产生偏移,而这部分电路可能与另一部分地电位没有改变的电路相互联系。

所以当需要大电流检测时,必须重视这个问题。

图A在负载的高端进行电流检测的简易电路,不仅消除了地线干扰,而且能够检测到短路故障,需要注意的是高边检测要求放大器能够处理接近电源电压的共模电压。

本文介绍无源滤波电路的频率计算公式
1. 常用的RC滤波电路
f 0 = 1/(2πRC)
例:R = 16K ,C =10nF
f 0 = 1/(2πRC) = 1/(2π×16×103×10×10-9 ) =1000Hz
2. LC滤波电路
下期介绍。

单片机控制多个按键的方法

单片机控制多个按键的方法

单片机控制多个按键的方法在很多嵌入式系统中,通常会用到按键进行输入。

单个按键的控制可能相对简单,但是如果需要控制多个按键,就需要用到一些特殊的控制方法。

常用的按键控制方法主要有以下几个方面:1、轮询法:采用逐个扫描的方式来检测按键状态。

2、中断法:接入外部中断口,当按键被按下时,会触发中断,系统会响应中断并执行相应的程序。

3、计时器法:通过计时器的方式来检测按键状态,利用定时器可以定时检测按键的状态。

如果需要控制多个按键,就需要采用一些特殊的控制方法:1、矩阵按键法:将多个按键以矩阵的方式进行排列,通过某种方法对行和列进行扫描,以检测按键的状态。

三、常用的按键检测程序以下是一个常用的按键检测程序,可以用于单片机控制多个按键:void key_scan(void){unsigned char read_date, key1, key2, key3, key4;// 初始化按键控制端口为输入模式P3M0 = 0x00;P3M1 = 0x00;// 所有按键端口均拉高,等待按键输入P3 = 0xff;// 等待按键输入Delay_ms(20);// 读取P3端口状态// 获得按键1状态key1 = read_date & 0x01;// 获得按键2状态key2 = read_date & 0x02;// 获得按键3状态key3 = read_date & 0x04;// 获得按键4状态key4 = read_date & 0x08;// 判断按键1是否被按下if (key1 == 0){// 按键1被按下,执行相应的操作 }// 判断按键2是否被按下if (key2 == 0){// 按键2被按下,执行相应的操作 }// 判断按键3是否被按下if (key3 == 0){// 按键3被按下,执行相应的操作 }// 判断按键4是否被按下{// 按键4被按下,执行相应的操作}}四、总结单片机控制多个按键的方法,需要采用特殊的控制方法,例如矩阵按键法和编码按键法等。

用一条IO口实现两个按键功能

用一条IO口实现两个按键功能

我知道有用一条IO实现多个按键的方法,这样的方法大多是选用的IO支持ADC功能,用电阻分压后通过读电压判断键值。

如果IO不支持ADC功能,也不是不行,可以用电容充放电的方法实现ADC,从而用普通IO间接进行测量。

这样用一条IO实现两个按键给我的第一感觉是可能需要利用到电容充放电原理,于是在半梦半醒之中找到了实现的方法。

先看上图左边部分,如果MCU_IO1为双向IO口,假设单片机程序按以下流程处理,看看会得到什么样的结果?1.MCU_IO1设定为输出,输出高电平一段时间,此时电容C1会充电,最后C1上的电压接近电源电压。

2.MCU_IO1设定为输入,如果J1、J2均不按下,此时MCU_IO1可以理解成一个阻值很大的电阻接地,电容C1上的电荷会通过这个电阻逐渐释放掉,这样C1上的电压会逐渐降低到零。

因为C1上的电压下降需要一个过程,当MCU_IO1设为输入后马上读一下MCU_IO1的状态,此时会读到什么结果?显然是高电平状态1。

3.再将MCU_IO1设定为输出,输出低电平一段时间,显然不管电容C1处于什么状态,只要MCU_IO1输出低电平时间足够长,最后C1上的电压应该接近零。

4.再将MCU_IO1设定为输入,如果J1、J2同样不按下,MCU_IO1读到的是低电平状态0。

如果J1按下,再来看看这四步,此时电容C1已经被强制接到电源上,MCU_IO1对其的充放电已经不起作用,在步骤2中MCU_IO1读到的状态依然是1,但在步骤4中MCU_IO1读到的状态就不再是0,而是变为1。

如果J2按下,同样看这四步,此时电容C1被强制接到地,MCU_IO1对其充放电也失去作用,在步骤2中MCU_IO1读到的状态变为0,但在步骤4中MCU_IO1读到的状态保持为0。

到这里我想大家应该已经明白了实现方法,根据此四步中读到的MCU_IO1状态,就可以判断出J1、J2是否按下。

既然已经找到方法,是不是就万事大吉了呢?不然,我们还得回过头去看看此方法是不是足够可靠。

单片机用一个IO口采集多个按键信号,如何实现?

单片机用一个IO口采集多个按键信号,如何实现?

单片机用一个IO口采集多个按键信号,如
何实现?
一个IO口检测多个按键肯定是可以实现的,下面简单举几个例子,为大家指点一下思路。

使用普通的I/O口检测多个按键通常我们使用按键检测的时候,一般都是一个I/O口检测一个按键,比如:
M×N阵矩阵式按键至少也需(M+N)个I/O口,比如4×4共16个按键的矩阵共需8个I/O口。

那么一个I/O口可不可以实现检测多个按键呢?其实
是可以的,硬件电路设计复杂,值不值得这么做。

比如通过检测占空比来区分不同的按键,每个按键后面做硬件防抖处理后再加555定时器组成的电路。

或者类似于串行通讯的方式,比如第一个按键按下输出1个脉冲,第二个按键按下输出两个脉冲,第三个按下输出3个脉冲等,这种按键后端电路处理更复杂。

使用单片机的一个ADC采样口检测多个按键使用ADC检测多个按键时,按键之间的电压间隔最好相近,而且范围较宽,这样设计误差会更小一些。

比如以5个按键为例,ADC检测电压范围为0~5V,那么在设计电路时各按键之间的电压间隔应大约为5V/5=1V。

上图为本人设计的电路图,S1按下电压为0V;S2按下电压约为0.97V;S3按下电压为2.03V;S4按下电压约为2.94V;S5按下电压约为3.99V。

软件处理时只要设置±0.1V 的检测范围宽度即可。

单片机。

51单片机io口的用法

51单片机io口的用法

51单片机io口的用法51单片机是一种经典的单片机系列,广泛应用于各种嵌入式系统中。

其IO口是单片机最基本的输入输出功能,可以用来连接外部设备和实现与外界的交互。

本文将介绍51单片机IO口的用法,并提供相关参考内容,帮助读者更好地理解和应用。

一、51单片机IO口简介51单片机的IO口是通过P0、P1、P2、P3四个寄存器来控制的。

其中P0口为8位双向I/O口,P1、P2、P3口为8位I/O 口,可以通过配置将其设置为输入(IN)或输出(OUT)模式。

在51单片机中,IO口的状态(高电平或低电平)决定了其在电路中的功能。

二、IO口的输入模式通过将IO口设置为输入模式,可以实现对外部信号的读取。

以下是51单片机IO口输入模式的几种常见应用:1. 按键输入:通过将IO口与按键连接,读取按键的状态(按下或松开)。

2. 传感器输入:通过将IO口与传感器连接,读取传感器的输出信号,如光线强度、温度等。

3. 外部信号输入:通过将IO口与其他设备连接,读取外部设备的状态或数据。

在使用IO口作为输入时,需要设置对应端口的引脚为输入模式,并读取相应寄存器的值进行判断。

三、IO口的输出模式通过将IO口设置为输出模式,可以实现对外部设备的控制。

以下是51单片机IO口输出模式的几种常见应用:1. LED显示:通过将IO口与LED连接,控制LED的闪烁、亮灭。

2. 电机驱动:通过将IO口与电机驱动芯片连接,控制电机的转动方向、速度。

3. 继电器控制:通过将IO口与继电器连接,控制继电器的开关状态。

在使用IO口作为输出时,需要设置对应端口的引脚为输出模式,并将相应寄存器的值设置为高电平或低电平。

四、IO口的控制方法有两种常见的方式可以控制51单片机的IO口:位操作和寄存器读写。

1. 位操作:通过对相应寄存器的位进行操作来控制IO口的状态。

例如,要将P1口的第0位设置为高电平,可以使用以下代码:P1_0 = 1;要将P1口的第1位设置为低电平,可以使用以下代码:P1_1 = 0;2. 寄存器读写:通过读写相应寄存器的值来控制IO口的状态。

16键带IO工业键盘使用说明

16键带IO工业键盘使用说明

背视图 24V+ 0V DIS
1 2 3
DIS接24V+时,键盘输入及 DI输入被禁止,保持当前值。
注意:在使用DO功能时,DP总 线连接器需订购180度或35度出线 方式,否则DP总线连接器会影响 DO端子接线。
DP 接 头
180度连接器订货号: 6GK1500-0EA02 35度连接器订货号: 6ES7972-0BA41-0XA0 DO01 DO02 DO03
PLC接口数据:输入6字节,输出6字节 IB0 / IB1:16个按键即时状态信号,按下为1,松开为0 IB2 / IB3:16个按键乒乓开关信号,按一下为1,再按一下为0 IB4 / IB5:16路DI输入,DC24V,与电源共地 QB0 / QB1:16个按键右上角指示灯控制,1=亮,0=灭 QB2 / QB3:16个按键左下角指示灯控制,1=亮,0=灭 QB4 / QB5:16路DO输出,每路容量DC24V/0.5A 正视图 24V电源指示灯,绿色 DP通讯指示灯,正常为绿色,故障为红色 I0.0 Q0.0 Q2.0 I0.4 Q0.4 Q2.4 I1.0 Q1.0 Q3.0 I1.4 Q1.4 Q3.4 I3.4 I1.5 Q1.5 Q3.5 I3.0 I1.1 Q1.1 Q3.1 I3.5 I1.6 Q1.6 Q3.6 I2.4 I0.5 Q0.5 Q2.5 I3.1 I1.2 Q1.2 Q3.2 I3.6 I1.7 Q1.7 Q3.7 I2.0 I0.1 Q0.1 Q2.1 I2.5 I0.6 Q0.6 Q2.6 I3.2 I1.3 Q1.3 Q3.3 I3.7 I2.1 I0.2 Q0.2 Q2.2 I2.6 I0.7 Q0.7 Q2.7 I3.3 I2.2 I0.3 Q0.3 Q2.3 I2.7 I2.3ຫໍສະໝຸດ DI01 DI02 DI03

(整理)单片机控制的矩阵键盘

(整理)单片机控制的矩阵键盘
INC B
INC B
INC B
JC NEXT5
NEXT6: MOV A,P1
ANL A,#0FH
CJNE A,#0FH,NEXT6
MOV R0,#0FFH
RET
键盘处理程序就作这么一个简单的介绍,实际上,键盘、显示处理是很复杂的,它往往占到一个应用程序的大部份代码,可见其重要性,但说到,这种复杂并不来自于单片机的本身,而是来自于操作者的习惯等等问题,因此,在编写键盘处理程序之前,最好先把它从逻辑上理清,然后用适当的算法表示出来,最后再去写代码,这样,才能快速有效地写好代码。
可见,键盘输出经双稳态电路之后,输出已变为规范的矩形方波。
软件上采取的措施是:在检测到有按键按下时,执行一个10ms左右(具体时间应视所使用的按键进行调整)的延时程序后,再确认该键电平是否仍保持闭合状态电平,若仍保持闭合状态电平,则确认该键处于闭合状态;同理,在检测到该键释放后,也应采用相同的步骤进行确认,从而可消除抖动的影响。
ANL A,#0FH
CJNE A,#0FH,KCODE;
MOV A,R1
SETB C
RLC A
JC NEXT2
NEXT3: MOV R0,#00H
RET
KCODE: MOV B,#0FBH
NEXT4: RRC A
INC B
JC NEXT4
MOV A,R1
SWAP A
NEXT5: RRC A
INC B
2.独立式按键的软件结构
独立式按键软件常采用查询式结构。先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。图7.4中的I/O口采用P1口,请读者自行编制相应的软件。

单片机按键扩展

单片机按键扩展

单片机按键扩展单片机在各种领域运用相当广泛,而作为人机交流的按键设计也有很多种。

不同的设计方法,有着不同的优缺点。

而又由于单片机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个按键。

单片机用一个IO口采集多个按键信号如何实现?

单片机用一个IO口采集多个按键信号如何实现?

单片机用一个IO口采集多个按键信号如何实现?一般按键信号都是高低电平,对于每一个按键信号单片机都需要一个IO口进行采集,这种按键采集方式比较简单,但是占用的单片机IO口比较多。

如果按键非常多,例如键盘,可以采用行列阵列方式进行信号采集。

这种方式仅需要少量IO口即可采集大量的按键信号。

例如7个IO 口可以最多采集3*4=12个按键信号。

但是这种采集方式的编程比较复杂,再加上按键防抖等考虑因素,程序更加复杂,初学者不容易掌握。

本文给大家分享一种按键信号的采集方法,可以用一个IO口采集多个按键信号,不仅电路简单,而且编程比较容易实现。

该方法只用一个IO可以采集多个按键,用的是IO口的AD功能。

当不同的按键按下时,单片机AD口采集到的电压值不一样,于是就能区分出来是哪个按键按下了。

即使是两个按键同时按下,也能根据电阻并联之后的电阻值算出输入到单片机的电压值,依据这个电压值也能识别出是哪两个按键按下。

是不是很简单呢?理论上这种方法用一个IO口可以采集几十几百个按键,但是考虑到电阻值的误差、上拉电源电压的误差、单片机AD采样的误差,在实际应用时,一个IO口采集的按键信号数量一般不会超过10个。

使用这个方法必须注意:(1)必须用恒定已知的上拉电源,例如板内的稳压5V。

(2)如果按键比较多,电路中所用电阻建议用1%高精度电阻。

(3)编程识别按键值时要用AD值区间范围来判定具体哪个按键按下了,不要用固定的AD值判定,原因就是前述提到的各种误差。

(4)如果单片机的IO口足够多,仍然建议用前述简单的一个IO 采集一个按键的方式。

对于这个按键采集方法,大家有什么想法没?欢迎大家留言,赞美、拍砖、求教、指教都可以的。

单片机单个I-O口实现多按键输入方法

单片机单个I-O口实现多按键输入方法

单个I/O口实现多按键输入
作者:admin文章来源:本站原创点击数:1039 更新时间:2006-1-1 在单片机应用中,经常要用到按键输入,在有较多按键输入的情况下,通常会使用矩阵式扫描方法来完成,例如对于16个按键输入的场合,会使用4×4矩阵键盘,这需要占用较多的I/O口(如8个),而对于单片机来说,其I/O口资源非常有限,当I/O口资源紧缺时,只好选用成本更高的具有更多I/O口的单片机来使用,本文介绍一种只用一个或两个I/O口实现多按键输入的方法。

对于使用一个I/O口来实现多按键输入,有个前提条件,就是这个I/O口具有A/D转换功能,只要使不同的键按下时,A/D转换输人端的电压不同,就可识别出所按的键,其电路如下图所示。

在无键按下时,I/O口端电压为电源电压Vcc,当S1键按下时,I/O口端电压最低,是电阻R1和R2的分压,当S2键按下时,I/O口端电压变高,是电阻R1和(R2+R3)的分压,同理,当S3、S4按下时,电压会更高,通过对该I/O口的A/D转换值的大小进行判断,就可以得知所按下的哪一个键。

图中只列出了4个按键的例子,在实际使用中,适当调整电阻值,可使按键数增加很多,在8位A/D转换中,按键数甚至达到上百个。

对于无A/D转换功能的单片机,可通过使用2个I/O口达到以上同样的功能
文章录入:admin 责任编辑:admin。

如何利用ADC的特点实现单片机用一个I-O采集多个按键信号?

如何利用ADC的特点实现单片机用一个I-O采集多个按键信号?

如何利用ADC的特点实现单片机用一个I/O采集多
个按键信号?
 如何实现单片机用一个I/O采集多个按键信号
 使用模数转换(ADC)的特点就可以实现单片机用一个I/O采集多个按键信号。

 一、单片机的I/O口检测按键简说
 我们知道,一般情况下单片机的一个I/O口作为普通I/O口的话,只能检测识别一个按键。

 日常设计中,如果碰到按键数量较多的话,会采用行列式键盘,例如最常见的4X4矩阵键盘,这样可以实现用8个I/O口检测16个按键。

 还有就是键盘接口,典型的是我们计算机上用的键盘,其采用PS/2接口,现在一般计算机上用的是USB接口的键盘。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用一个IO口引脚控制几个按键的方法
这个方法是利用电阻的分压和ADC的电压采集。

使用方法:
用ADC采集电压,根据电压分析哪个键被按下:
没按键按下:ADC = 0V
K1被按下:ADC = DVCC * R26 / (R26 + R29)
K2被按下:ADC = DVCC * R32 / (R32 + R29)
……
使用注意:
ADC测到的电压值只是大约的范围,例如假如上面K1算得1.0V,那么实际可能是在0.9V~1.1V之间波动;
电路中的电阻应合理计算,使各按键对应的电压值均匀分布在 0~DVCC之间;
矛盾是普遍存在的,节省IO口的同时会带来其它的付出:要进行AD转换占用CPU资源,电路上多了些电阻复杂点了。

这个方法在网上偶然发现想到的,分享一下
--------QinZhengye。

相关文档
最新文档