多按键设计电路

合集下载

矩阵键盘电路设计

矩阵键盘电路设计

矩阵键盘电路设计矩阵键盘是一种常见的输入设备,它通过矩阵布局的按键组成,可以方便地输入数字、字母和其他符号。

在电子设备中,矩阵键盘通常采用扫描电路进行输入和控制。

在本文中,将探讨矩阵键盘电路的设计。

首先,我们需要确定矩阵键盘的布局。

一般情况下,矩阵键盘采用4×4或者3×4的布局。

每个按键都是一个开关,当按下时闭合,松开时断开。

接下来,我们需要设计输入电路。

输入电路通过扫描矩阵键盘的每一行和每一列来检测按键的状态。

为了实现这个功能,我们可以使用两个二进制计数器来控制扫描的行和列。

每当计数器增加时,就对应地扫描一行或者一列。

我们可以通过多路复用器和反向器将计数器输出与矩阵键盘的行和列相连。

当计数器的输出与矩阵键盘的行和列相连后,我们可以通过逐行或逐列地扫描矩阵键盘并检测按键的状态。

如果有按键按下,我们可以将对应的按键编码为数字信号。

在设计输入电路时,我们还需要考虑按键去抖动的问题。

按键去抖动是指当按键被按下或松开时,会产生多次开关闭合的现象。

为了解决这个问题,我们可以使用一个滤波器电路来消除按键的抖动。

滤波器电路可以采用RC滤波器或者Schmitt触发器等。

设计好输入电路后,接下来需要设计控制电路。

控制电路负责扫描矩阵键盘的每一行和每一列,以及对按键的状态进行控制。

我们可以使用计时器和计数器来控制扫描的速度和顺序。

当检测到按键按下时,控制电路会将对应的按键编码为数字信号并传递给接收端。

此外,在设计控制电路时,我们还需要考虑矩阵键盘的多键同时按下的问题。

当多个按键同时按下时,我们需要使用矩阵解码器来对这些按键进行解码,并将解码结果传递给接收端。

在进行电路设计时,我们还需要考虑一些其他的因素,比如布线、电源供应和接收端的设计等。

布线是指将电路中的各个元件和连接线布置在PCB板上的过程。

在布线时,我们需要确保信号传输的可靠性和稳定性。

电源供应是指提供电路所需的电源电压和电流的过程。

接收端的设计是指接收和处理从矩阵键盘电路传递过来的数字信号的过程。

用2条IO脚接六个按键的电路设计及源程序

用2条IO脚接六个按键的电路设计及源程序
假设,式子中各种输入输出对应状态分别为定义为 1、2、3、4、5、6、7、8 那么可归纳如下 K1 1、6、7 K2 2、5、8 K3 3、6、8 K4 4、6、8 K5 4、5、8 K6 4、6、7
有此可知,K1、K2、K3 在一般情况可直接由第一种输出得出。K4、K5、K6 则需要较复 杂扫描步奏。 由上述逻辑可知,当 I/O1 接在中断中时,K1、K2、K3 是可以产生中断的按键,因此也 可以做中断唤醒用,但 K4、K5、K6 无中断唤醒功能。
else tempkey=2;
} else {
if (!IO2) tempkey=1;
else
{ IO1=0; if (!IO2) { IO1=1;IO2=0; if (!IO1) tempkey=4; else tempkey=6; } else { IO1=1;IO2=0; if (!IO1) tempkey=5; else tempkey=0; }
相应的,在 1 时,当按下 K1 时得到 01,当按下 K2 时得到 10,当按下 K3 时得到 00,当 按下 K4、K5、K6 时得到 11, 在 2 时,当按下 K2、K5 时得到 10,当按下 K1、K3、K4、K6 时得到 00, 在 3 时,当按下 K1、K6 时得到 01,当按下 K2、K3、K4、K5 时得到 00,
} } IO1=1;IO2=1; if((keybuf !=0) && (keybuf == tempkey)) {
bkeyok=1; keydat=tempkey; } keybuf=tempkey; return(bkeyok); } uchar read_key(void) { bkeyok=0; return(keydat); } void doanything(uchar key)

这是我在网上论坛上看到的用少量的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键号

51单片机按键控制电路设计内容总结

51单片机按键控制电路设计内容总结

51单片机按键控制电路设计内容总结一、引言在现代电子产品中,按键控制是一种常见的操作方式。

通过按下不同的按键,可以实现不同的功能。

而在电子设备的控制电路中,需要一种可靠的方式来检测按键的状态,并根据按键的状态来进行相应的操作。

本文将介绍基于51单片机的按键控制电路设计。

二、按键控制电路的基本原理按键控制电路的基本原理是通过检测按键的状态来确定按键是否被按下。

当按键被按下时,按键的状态会发生改变,通过检测这种状态的改变,可以触发相应的操作。

在51单片机中,可以通过外部中断来实现对按键状态的检测。

当按键被按下时,会触发外部中断,从而通知单片机按键的状态发生了改变。

三、按键控制电路的设计步骤1. 硬件设计在按键控制电路的硬件设计中,需要确定使用的按键数量,并选择合适的按键类型。

常见的按键类型有机械按键和触摸按键。

根据实际需求,选择合适的按键类型,并将其连接到51单片机的外部中断引脚上。

2. 软件设计在按键控制电路的软件设计中,需要编写相应的程序来实现对按键状态的检测和相应操作的执行。

在51单片机中,可以通过中断服务程序来实现对外部中断的响应。

当外部中断触发时,中断服务程序会被执行,并根据按键的状态来执行相应的操作。

四、案例分析下面以一个简单的案例来说明按键控制电路的设计。

假设我们需要设计一个LED灯的开关控制电路,通过按下按键可以控制LED灯的开关状态。

1. 硬件设计选择一个机械按键作为控制按键,并将其连接到51单片机的外部中断引脚上。

同时,将一个LED灯连接到51单片机的IO口上。

2. 软件设计编写相应的程序来实现按键状态的检测和LED灯开关状态的控制。

当按键被按下时,外部中断触发,中断服务程序被执行。

在中断服务程序中,通过读取按键的状态来确定按键是否被按下,并根据按键的状态来控制LED灯的开关状态。

五、总结通过本文的介绍,我们了解了按键控制电路的基本原理和设计步骤。

在51单片机中,可以通过外部中断来实现对按键状态的检测。

按键模块电路设计

按键模块电路设计

按键模块电路设计
按键模块常用于电子产品中,用于实现电路的开关和控制功能。


面是按键模块电路设计的一些基本要点和步骤:
一、选择按键模块
选择合适的按键模块是电路设计的第一步。

需要根据电路的具体需求,选择适合的按键模块。

一般按键模块有带灯和不带灯两种,还有多个
按键的组合型按键模块。

二、电路设计
1. 确定按键的信号引脚位置,并进行布局设计。

2. 设计按键的接口电路,包括输入电阻、电容和滤波电路等。

3. 最后将按键电路和目标电路连接起来,实现按键控制功能。

三、按键模块电路的注意事项
1. 要注意按键和目标电路的电位和电流的匹配,避免电流和电压冲突
造成短路或损坏。

2. 注意按键模块的接口电路的优化设计,要考虑抗干扰和稳定性问题。

3. 如果是带灯的按键模块,要注意灯的功率和亮度的设计,避免灯过亮或过暗导致误操作。

以上是按键模块电路设计的基本要点和步骤,在实际电路设计中,还有很多细节问题需要注意。

需要根据不同的电路需求,进行具体的优化和设计。

按键模块电路设计

按键模块电路设计

按键模块电路设计
按键模块电路设计是一种常见的电路设计,它可以用于各种电子设备中,如遥控器、计算器、电子钟表等。

按键模块电路设计的主要作用是检测按键的状态,当按键被按下时,电路会产生相应的信号,从而实现对设备的控制。

按键模块电路设计的基本原理是利用按键的机械结构,通过按下按键使得电路中的开关闭合,从而改变电路的状态。

按键模块电路设计通常由按键、电容、电阻、晶体管等元器件组成。

其中,按键是电路的核心部件,它可以分为机械按键和触摸按键两种类型。

机械按键通常采用弹簧结构,当按键被按下时,弹簧会产生弹力,从而使得按键弹起,闭合电路。

触摸按键则是利用人体电容的变化来检测按键状态,当手指接触到按键时,会改变电容的值,从而产生信号。

在按键模块电路设计中,电容和电阻的作用是滤波和稳压。

电容可以起到滤波的作用,使得电路中的信号更加稳定。

电阻则可以起到稳压的作用,防止电路中的电压波动过大,从而保护电路中的元器件。

晶体管是按键模块电路设计中的另一个重要元器件,它可以起到放大信号的作用。

当按键被按下时,电路中的信号会变化,晶体管可以将这个变化放大,从而使得电路中的其他元器件可以更好地检测
到按键的状态。

按键模块电路设计是一种非常实用的电路设计,它可以用于各种电子设备中,从而实现对设备的控制。

在设计按键模块电路时,需要考虑到按键的类型、电容和电阻的选取以及晶体管的放大倍数等因素,从而保证电路的稳定性和可靠性。

按键开关原理 双控开关接线图

按键开关原理 双控开关接线图

今天,小编带大家了解一下在家庭电路中很重要的按键开关原理,并看看双控开关接线图。

让你电路装修时不再小白!
按键开关原理
按键开关是用来切断和接通控制电路的低压开关电器。

按钮开关的触头的额定电流为5A。

所以,操作按钮开关所控制的电路属于小电流电路。

按钮有单极双位开关或双极双位开关,它按动能与用途又分为起动按钮、复位按钮、检查按钮、控制按钮、限位按钮等多种。

按键有动合(常开)和动断(常闭)之分,微型按钮用导电橡胶或金属片等作导体,可作为状态选择开关,用于小型半导体收音机、遥控器、验钞器等产品中。

按键开关是旧标准用术语,新标准(GB2900·18)中简称为按钮。

 
按键开关是用来切断和接通控制电路的低压开关电器。

按钮开关的触头的额定电流为5A。

所以,操作按钮开关所控制的电路属于小电流电路。


按键有单极双位开关或双极双位开关,它按动能与用途又分为起动按钮、复位按钮、检查按钮、控制按钮、限位按钮等多种。

双控开关接线图
双控开关接线图
双控开关接线图
双控开关接线图
看了以上的关于按键开关原理和双控开关接线图的介绍,不知大家都学到一手没!希望本文能让大家更了解按键开关原理和双控开关接线图的知识。

上述作品版权归原作者所有,新浪装修平台只属于点赞和传播者,转载请注明来源
『新浪装修抢工长』是由乐居控股有限公司投资打造的互联网装修服务生态平台,致力于成为全国最大客户与工长直接互动的装修服务平台,全新开启装修领域的互联网时代。

&&关注生活家居、经济、服装、书法、手绘、旅游、摄影、运动、奢侈品。

单片机按键设计的四个方案详解

单片机按键设计的四个方案详解

单片机按键设计的四个方案详解在单片机系统里,按键是常见的输入设备,在本文将介绍几种按键硬件、软件设计方面的技巧。

一般的在按键的设计上,一般有四种方案:一是GPIO口直接检测单个按键,如图1.1所示;二是按键较多则使用矩阵键盘,如图1.2所示;三是将按键接到外部中断引脚上,利用按键按下产生的边沿信号进行按键检测,如图1.3所示;四是利用单片机的ADC,在不同的按键按下后,能够使得ADC接口上的电压不同,根据电压的不同,则可以识别按键,如图1.4所示。

在以上四种设计上,各有优点和不足。

第一种是最简单和最基础的,对于单片机初学者很容易理解和使用,但是缺点是,需要在主循环中不断检测按键是否按下,并且需要做消抖处理。

若主循环中某个函数任务占用时间较长,则按键会有不同程度的“失灵”。

第二种,优点是能够在有限的GPIO情况下,扩展尽可能多的按键。

但缺点同上,需要不停检测按键是否按下。

第三种方式是效率最高,不需要循环检测按键是否按下,但是缺点是,需要单片机有足够的外部中断接口以供使用;第四种的优点是,只需要单片机的一个ADC接口,一根线,就能对多个按键进行识别,缺点是按键一旦内部接触不良,则可能按键串位,且按键产生的抖动,会造成一定的识别错误。

在以上的三种常见按键设计的基础上,现在分享我学习和工作中总结的按键方案。

改进一:在原方案一的基础上,加上与门电路,使得任何一个按键按下,都能产生中断,然后在中断里面识别是哪个按键被按下。

因此不需要循环扫描,大大提高了效率。

方案如图1.5所示。

只需要每个按键对应地增加一个二极管,利用二极管的线与特性,可以实现按下任何按键,都能产生中断信号,但是按键之间互不影响。

二极管选用普通整流二极管即可,本人亲测可行。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
够酷吧!等等,大家先别满足现状,我们再看一下图二,是不是有点启发?对,我们再分析一下“用5个IO口对地衍生的5个键”。看图六:
图六
25个键!5个IO口扫出25个键!先别激动,我们再分析一下它的可行性,分析通得过才能真正使用。假设扫键流程:先扫对地的5个键,再如图五扫键。先扫对地5个键,判断没有按键,接着对逐一对IO口进行扫键。但当对某一IO口扫键时,如果有对地的键按下,这时有可能会误判按键,因为对地键比其他键有更高的响应优先级。例如:扫IO1,IO1输出“0”,恰好此时K62按下,IO2检测到有按键,那就不能判断是K11还是K62。我们可以在程序上避免这种按键误判:若IO2检测到有按键,那下一步就去判断是否有对地键按下,如果没有,那就可以正确地判断是K11了。
感觉怎么样?不错吧!让我们再看看图三,好有成就感!看着,看着……又看到了什么?快!见图四:
图四
真强!被您看出20个键!多了一个对称的三角形。可是,像这样的排列能正确扫20个键吗?回答是肯定的:不能!上下三角形相互对称,其对称扫出的键无法区别。有没有注意到分析图三时提到的注意点?(à“当扫某IO口时,不要去检测已经扫过的IO口,否则会出错”)
{
Key_Num = i+3;
return Key_Num;
}
}
}
//扫描第三行开关
DDRC |= BIT(PC3); //PC3输出
PORTC &= ~BIT(PC3); //PC2=0
DDRC &= ~(BIT(PC1)|BIT(PC2)|BIT(PC4)|BIT(PC5)); //PC1、PC2、PC4、PC5输入
5个IO口最多能扫描多少个按键?
简介:在做项目(工程)的时候,我们经常要用到比较多的按键,而且IO资源紧张,于是我们就想方设法地在别的模块中节省IO口,好不容易挤出一两个IO口,却发现仍然不够用,实在没办法了就添加一个IC来扫键。一个IC虽然价...
在做项目(工程)的时候,我们经常要用到比较多的按键,而且IO资源紧张,于是我们就想方设法地在别的模块中节省IO口,好不容易挤出一两个IO口,却发现仍然不够用,实在没办法了就添加一个IC来扫键。一个IC虽然价格不高,但对于大批量生产而且产品利润低的厂家来说,这是一笔不菲的开支!
如果在IO0为输入状态下,剩下的4个引脚任意选择2个引脚增加短路按键,则可以扩展出C4选2个按键也就是(4 * 3)/(2 * 1)共6个按钮。考虑还可以从5个IO中每次任选一个座位输入,则一共有C5选1种也就是5 / 1个按钮。
这样在原有25基础上可以继续扩出30个按键了。
1、将IO1设置为输入并开启上蜡电阻
2、将IO2设置为输出高电平,将其余IO设置为输出低电平
3、检测IO1的电平来判断K11是否被按下
4、将IO3设置为输出高电平,将其余IO设置为输出低电平
5、检测IO1的电平来判断K12是否被按下
这样就可以单独区别K11和K12了。
继续考虑,当K11和K12同时被按下时,相当于IO2和IO3被短路,如果在IO2和IO3之间增加一个用于短路的按键,就可以扩展一个按键了
UINT8 _25Key_Scan(void)
{
UINT8 i = 0,Key_Num = 0;
//扫描最下面一行开关
DDRC |= BIT(PC1)|BIT(PC2)|BIT(PC3)|BIT(PC4)|BIT(PC5);
PORTC |= BIT(PC1)|BIT(PC2)|BIT(PC3)|BIT(PC4)|BIT(PC5);
那,我们能不能想到比较好的扫键方法:用最少的IO口,扫最多的键?可以吗?
举个例:给出5个IO口,能扫多少键?有人说是2*3=6个,如图一:
图一
对,大部分技术参考书都这么做,我们也经常这样做:用3个IO口作行扫描,2个IO作列检测(为方便描述,我们约定:设置某一IO口输出为“0”――称其为“扫某IO口”)。用行线输出扫键码,列线检测是否有按键的查询方法进行扫键。扫键流程:在行线依次输出011,101,110扫键值,行线每输出一个扫键值,列线检测一次。当列线检测到有按键时,结合输出的扫键值可以判断相应的按键。
PORTC &= ~BIT(PC4); //PC4=0
DDRC &= ~(BIT(PC1)|BIT(PC2)|BIT(PC3)|BIT(PC5)); //PC1~PC3、PC5输入
PORTC |= BIT(PC1)|BIT(PC2)|BIT(PC3)|BIT(PC5); //PC1~PC3、PC5=1
DDRC &= ~(BIT(PC2)|BIT(PC3)|BIT(PC4)|BIT(PC5)); //PC2-PC5输入
PORTC |= BIT(PC2)|BIT(PC3)|BIT(PC4)|BIT(PC5); //PC2~PC5=1
NOP();
NOP();
for(i = 2; i <=5; i++)
{
if(!(PINC & BIT(i)))
{
Key_Num = i+16;
return Key_Num;
}
}
return Key_Num;
//循环的方法实现使用的是PORTD口
/*
uint8 i = 0, j =0;
DDRD = 0;
PORTD = 0xff;
for(i = 0; i< 5; i++)
PORTC |= BIT(PC1)|BIT(PC3)|BIT(PC4)|BIT(PC5); //PC1、PC3~PC5=1
if(!(PINC & BIT(1)))
{
Key_Num = 5;
return Key_Num;
}
else
{
for(i = 3; i <= 5; i++)
{
if(!(PINC & BIT(i)))
PORTC |= BIT(PC1)|BIT(PC2)|BIT(PC4)|BIT(PC5); //PC1、PC2、PC4、PC5=1
if(!(PINC & BIT(1)))
{
Key_Num = 9;
return Key_Num;
}
else if(!(PINC & BIT(2)))
{
Key_Num = 10;
IO3 PC3
IO4 PC4
IO5 PC5
核心函数:
/***********************************************************
*函数说明:五个端口扫描25个键盘的函数*
*输入:无*
*输出:键盘编号*
*调用函数:无*
***********************************************************/
for(i = 1; i <= 3; i++)
{
if(!(PINC & BIT(i)))
{
Key_Num = i+12;
return Key_Num;
}
}
if(!(PINC & BIT(5)))
{
Key_Num = 16;
return Key_Num;
}
//扫描第五行开关
DDRC |= BIT(PC5); //PC5输出
PORTC &= ~BIT(PC5); //PC5=0
DDRC &= ~(BIT(PC1)|BIT(PC2)|BIT(PC3)|BIT(PC4)); //PC1-PC4输入
PORTC |= BIT(PC1)|BIT(PC2)|BIT(PC3)|BIT(PC4); //PC1~PC4=1
for(i = 1; i <= 4; i++)
{
if(!(PIND&BIT(i)))
{
return i+1;
}
}
for(i = 0; i < 5; i++)
{
DDRD = BIT(i);
PORTD = ~BIT(i);
for(j = 0; j < 5; j++)
{
if((!(PIND&BIT(j)))&&(j != i))
{
if(j>=i)return i*4+j+5;
我们分析一下图四:当IO1输出“0”时,按下K11或K11’键都能被IO2检测到,但IO2检测却无法区别K11和K11’键!同理,不管扫哪个IO口,都有两个对称的键不能区分。
我们假想,如果能把对称键区分开来,我们就能正常地去判断按键。我们在思考:有没有单向导通性器件?有!见图五!
图五
很巧妙的思路!利用二极管的单向导通性,区别两个对称键。扫键思路:对逐个IO口扫键,其他四个IO口可以分别检测其所在的四个按键。这样,就不会有分析图三时提到的注意点。
{
if(!((PINC & BIT(i))))
{
Key_Num = i-1;
return Key_Num;
}
}
//扫描第二行开关
DDRC |= BIT(PC2); //PC2输出
PORTC &= ~BIT(PC2); //PC2=0
DDRC &= ~(BIT(PC1)|BIT(PC3)|BIT(PC4)|BIT(PC5)); //PC1、PC3-PC5输入
return i*4+j+6;
}
}
}
return 0;*/
}
根据最新成果,如果只考虑单个按键被按下的情况,键盘已经可以扩展为25 + 5 *(4 * 3 / 2)= 25 + 30 = 55个按键了……
相关文档
最新文档