单片机5按键功能的实现

实验5 按键功能的实现一、实验目的1、理解按键电路的作用;2、学习按键功能的编程方法;3、熟悉单片机I/O口连接独立式按键的编程应用方法。

二、实验说明按键在单片机应用系统中实现向单片机输入数据、传送命令等功能,是人工干预单片机工作的主要手段。

如果需要较多数量的按键,可以采用按键矩阵和专门的接口器件扩展按键。

实际的单片机应用系统中,用到的按键数量一般不多,通常采用单片机I/O口和独立式按键即能满足需要。

实验箱核心板上有 4 个按键,其一端全部与地线相连,另一端顺次与P1.4~P1.7 相连。

本实验需要用到核心板上的3 个按键、3 个指示灯和6 个数码管,所用到的实验电路原理如图 3.1.6 所示。

本实验中 3 个按键设计的功能,是一个实用的简单温度控制系统的按键功能,要求通过按键设定一个温度上限值和一个温度下限值。

本实验只涉及按键和显示功能,在今后的实验中,将进一步增加硬件和软件功能,利用单片机实现实际的温度控制系统,使温度维持在上、下限值之间。

①“功能”键:在内存数据区定义一个名称为“KBM”的字节,存放功能编号,共有 3 种功能,分别对应编号为0,1,2。

每按一次“功能”键,“KBM”中的值在这三个数字中循环改变一次。

与三种功能对应,设计三个LED(发光二极管)指示灯,由单片机P3 口控制,当处于某种功能状态时,相应的指示灯亮。

本实验的内容,实际上是后面进一步做温度测量控制系统的一部分。

三种功能的含义如下:功能号0:显示测量的温度值;功能号1:对温度上限值进行修改;功能号2:对温度下限值进行修改。

②“↑”键:每按一次“↑”键,内存数据区中指定变量单元的值增1,持续按住则连续增1。

③“↓”键:与“↑”键对应,每按一次“↓”,内存数据区中指定变量单元的值减1,持续按住则连续减1。

功能号为0 时,数码管显示被测温度值,此时按另外两个按键不起作用。

功能号为 1 时,数码管显示设定温度的上限值,按另外两个按键可以修改温度上限值。

功能号为 2 时,数码管显示设定温度的下限值,此时按另外两个按键可以修改温度下限值。

3、实验任务1、理解单片机I/O口与按键、指示灯和LED数码管的综合使用方法;2、理解图3.1.6所示的电路,读懂参考程序;3、自行设计按键显示功能(比如将6位数码管分成三组,分别显示上限、下限、测量值),并编程实现所设计的功能。

4、程序流程图及代码分析D_DAT0 EQU 60HD_DAT1 EQU D_DAT0+1D_DAT2 EQU D_DAT1+1D_DAT3 EQU D_DAT2+1D_DAT4 EQU D_DAT3+1D_DAT5 EQU D_DAT4+1 ;定义显示数据单元LIGHT EQU D_DAT5+1H_DAT0 EQU LIGHT+1H_DAT1 EQU H_DAT0+1KBM EQU H_DAT1+1 ;定义按键功能号存放单元D_MAX EQU KBM+1 ;定义上限值存放单元D_MIN EQU D_MAX+1 ;定义下限值存放单元T_DAT0 EQU D_MIN+1T_DAT1 EQU T_DAT0+1 ;定义测量值存放单元ORG 0000HAJMP STARTORG 0030HSTART: MOV SP,#30H ;初始化堆栈指针MOV D_DAT0, #0MOV D_DAT1, #0MOV D_DAT2, #0MOV D_DAT3, #0MOV D_DAT4, #0MOV D_DAT5,#0 ;初始化显示数据MOV LIGHT, #80HCLR P1.0CLR P1.1CLR P1.2CLR P1.3 ;初始化有关I/O口MOV R0,#D_DAT0 ;初始化数据指针,R0指向第一位显示数字MOV R1,#01H ;初始化需点亮数码管位置代码MOV KBM,#0 ;初始化功能号MOV D_MAX, #80MOV D_MIN, #70 ;初始化上、下限值MOV T_DAT0, #66MOV T_DAT1,#0 ;目前人为赋给测量值一个值,将来有实际测量值就存放在此MOV H_DAT0, T_DAT0MOV H_DAT1, T_DAT1LCALL HTD ;将测量值二进制数转换为十进制数MAIN: LCALL DISP ;刷新显示LCALL DELAY ;显示、延时子程序同前;******************************************************;按键处理程序;*****************************************************JB P1.7,KEY1 ;查询K0,若K0未按下则跳转LCALL DISPLCALL DELAY ;延时去抖动,顺便刷新显示JB P1.7,KEY1 ;若K0未真正按下则跳转INC KBM ;K0真正按下,功能号增1MOV A,KBMCJNE A,#3,KEY01MOV KBM,#0 ;若功能号为3,则清0KEY01: NOPAJMP KEND ;跳转至按键结束处理程序KEY1: JB P1.6,KEY2 ;查询K1LCALL DISPLCALL DELAYJB P1.6,KEY2MOV A,KBMCJNE A,#1,KEY11 ;功能号不为1则跳转INC D_MAX ;功能号1,上限值加1AJMP KENDKEY11: CJNE A,#2,KEY12 ;功能号不为2则跳转INC D_MIN ;功能号2,下限值加1KEY12: AJMP KEND ;跳转至按键结束处理程序KEY2: JB P1.5,KEND ;查询K2LCALL DISPLCALL DELAYJB P1.5,KENDMOV A,KBMCJNE A,#1,KEY21DEC D_MAX ;功能号1,上限值减1AJMP KENDKEY21: CJNE A,#2,KENDDEC D_MIN ;功能号2,下限值减1KEND: NOP ;以下程序根据功能号显示不同内容MOV A, KBMCJNE A, #0, KEND1MOV H_DAT0, T_DAT0MOV H_DAT1,T_DAT1 ;功能号0,准备显示测量数据MOV LIGHT,#0BFH ;点亮相应指示灯AJMP KEND3 ;跳转到刷新显示处KEND1: NOPCJNE A, #1, KEND2MOV H_DAT0, D_MAXMOV H_DAT1,#0 ;功能号1,准备显示上限值MOV LIGHT,#7FH ;点亮相应指示灯AJMP KEND3 ;跳转到刷新显示处KEND2: NOPCJNE A, #2,KEND3MOV H_DAT0, D_MINMOV H_DAT1,#0 ;功能号2,准备显示下限值MOV LIGHT,#0DFH ;点亮相应指示灯KEND3: MOV P0, LIGHTSETB P1.0NOPCLR P1.0 ;产生一个指示灯输出锁存脉冲LCALL HTD ;将需显示数据转换成4个十进制数MOV R4, #80HKEND4: LCALL DISPLCALL DELAY ;刷新显示,延时DJNZ R4,KEND4 ;此处循环延时是为了避免按键多次重入LJMP MAIN ;跳转到主程序开始处循环执行;******************************************************;通过595显示4位数字子程序;*****************************************************DISP: MOV A,R1 ;取位代码数据MOV R2,#8DISP1: CLR CRLC AMOV P1.3,C ; 位代码送到SER的输入端SETB P1.1NOPCLR P1.1 ;产生一个输入锁存脉冲DJNZ R2,DISP1 ;依次将8位位代码移入,实际只有6位有用MOV A,@R0 ;取需显示的数字MOV DPTR,#DISPD ;笔画编码表同前MOVC A,@A+DPTR ;取需显示数字笔画代码MOV R2, #8DISP2: CLR CRLC AMOV P1.3,C ;笔画代码送到SER的输入端SETB P1.1NOPCLR P1.1 ;产生一个输入锁存脉冲DJNZ R2,DISP2 ;依次将8位笔画代码(段代码)移入INC R0 ;R0增1指向下一个需显示数字MOV A,R1RL AMOV R1,A ;R1中的值左移1位,指向下一位数码管CJNE R1,#40H,DISP3 ;R0中不为70H则继续MOV R0, #D_DAT0MOV R1,#01H ;R0中为70H,循环完一轮;重新赋初值DISP3: SETB P1.2CLR P1.2RET;数字笔画代码表; 0 1 2 3 4 5 6 7 8 9 熄DISPD: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,0;**********************************************;延时子程序;**********************************************DELAY: MOV R7,#2DELY1: MOV R6,#0FFHDELY2: DJNZ R6,$ ;$代表当前行(与DJNZ R6,DELY2相同) DJNZ R7, DELY1RET;二进制转换十进制子程序HTD: M OV D_DAT5,#00H ;将结果千位清0MOV D_DAT4, #00HMOV D_DAT3, #00HMOV D_DAT2, #00HH1000: CLR C ;进位位C清0MOV A,H_DAT0 ;源数据低位装载到累加器A中MOV R6,A ;备份源数值低位到寄存器R6中SUBB A,#0E8H ;源数值低位减去1000的低位0E8HMOV H_DAT0,A ;余数存回到源数值低位存储单元MOV A,H_DAT1 ;源数值高位装载到累加器A中MOV R7,A ;备份源数值高位到寄存器R7中SUBB A,#03H ;源数值高位带借位减1000的高位03HMOV H_DAT1,A ;余数存回到源数值低位存储单元INC D_DAT2 ;千位增1JNC H1000 ;如果没有借位则利用余数循环再减;有借位表明为最后一次无效减;程序顺序执行,应还原最后一次修改值MOV H_DAT0,R6MOV H_DAT1,R7 ;用备份值作为新的源数值(余数)DEC D_DAT2 ;千位数减1,去掉最后一次无效减的影响H100: MOV A,H_DAT0 ;源数值低位装载到累加器A中MOV R6,A ;备份源数值低位到寄存器R6中CLR C ;清0进位位CSUBB A,#100 ;减去100MOV H_DAT0,A ;存回余数低位MOV A,H_DAT1 ;取源数值高位SUBB A,#00H ;减100的高位0,实际上是减去借位位MOV H_DAT1,A ;存回余数高位JC H10 ;有借位则跳到下一步继续运算INC D_DAT3 ;没有借位,百位增1AJMP H100 ;没有借位继续减;注意本轮循环中最后一次减时百位未增1;所以不存在还原的问题;进入下一轮时,源数值(余数)都在R6中H10: C LR CMOV A,R6 ;源数值(低位)装载到累加器A中;到此源数值高位已经为0,不用再参加计算MOV D_DAT5,A ;存回源数值低位;如果是最后一次减,则此值即为个位SUBB A,#10 ;减去10MOV R6,A ;保存余数JC H1 ;有借位,运算结束INC D_DAT4 ;没有借位,十位增1LJMP H10 ;没有借位继续减H1: RET ;子程序返回END5、实验现象数码管能正确显示,能正确实现按键的功能。

合集下载

单片机按键模块设计

单片机按键模块设计

单片机按键模块设计一、硬件设计1、按键的类型选择按键的类型有很多种,常见的有机械按键和触摸按键。

机械按键通过金属触点的闭合和断开来产生电信号,具有成本低、可靠性高的优点,但寿命相对较短,容易产生抖动。

触摸按键则通过电容感应或电阻感应来检测触摸动作,寿命长、外观美观,但成本相对较高,且容易受到外界干扰。

在一般的单片机应用中,机械按键通常是更经济实用的选择。

2、按键的连接方式按键可以采用独立式连接或矩阵式连接。

独立式连接适用于按键数量较少的情况,每个按键单独连接到单片机的一个 I/O 口上,这种方式简单直观,但占用的 I/O 口资源较多。

矩阵式连接则适用于按键数量较多的情况,通过将按键排列成矩阵形式,利用行线和列线的交叉点来识别按键,大大节省了 I/O 口资源,但编程相对复杂。

以 4×4 矩阵按键为例,我们需要 8 个 I/O 口,其中 4 个作为行线,4 个作为列线。

当某个按键被按下时,对应的行线和列线会接通,通过扫描行线和列线的状态,就可以确定被按下的按键。

3、上拉电阻的使用为了保证单片机能够正确检测按键的状态,通常需要在按键连接的I/O 口上加上拉电阻。

上拉电阻将I/O 口的电平拉高,当按键未按下时,I/O 口处于高电平;当按键按下时,I/O 口被拉低为低电平。

上拉电阻的阻值一般在10KΩ 左右。

4、消抖处理由于机械按键在按下和释放的瞬间,触点会产生抖动,导致单片机检测到的电平不稳定。

为了消除这种抖动,通常采用软件消抖或硬件消抖的方法。

软件消抖是在检测到按键状态变化后,延迟一段时间(一般为10ms 20ms),再次检测按键状态,如果状态保持不变,则认为按键有效。

这种方法简单易行,但会增加程序的执行时间。

硬件消抖则是通过在按键两端并联电容或使用专用的消抖芯片来实现。

电容可以吸收触点抖动产生的尖峰脉冲,使电平稳定。

但硬件消抖会增加硬件成本和电路复杂度。

二、软件编程1、按键扫描程序在软件编程中,需要编写按键扫描程序来检测按键的状态。

单片机按键-长按-短按-连发-双击-抬起-按下

单片机按键-长按-短按-连发-双击-抬起-按下
KeyAttribute_TypeDef KeyAttributeZero;
/******************************************************************************** 功能:获取按键状态 参数:无 返回值:按键状态 STAT_DOWN 按键按下
/* 每个按键都包括自己的属性 */ /*按键属性定义*/
typedef struct {
StatEnum_TypeDefstat; unsigned char KeyNum; unsigned short CountMs; unsigned short ShakeTimeMs; unsigned short LongClickTimeMs; unsigned short ContinueSendTimeMs; unsigned short DoubleClickTimeMs; unsigned char (*GetKeyStat)(void); }KeyAttribute_TypeDef;
void KeyAttributeZeroInit(void); void RefreshKeyStat_1_Ms(KeyAttribute_TypeDef *pKeyAttribute); unsigned short GetKeyVal(void);
#endif
/****************************************************************************************************************************** keyfunc.c
STAT_UP 按键未按下 说明:每个按键必须包括一个此类型的函数[unsigned char (*)(void)]然后用按键属性中的

单片机按键单击、双击、长按功能实现

单片机按键单击、双击、长按功能实现

单片机按键单击、双击、长按功能实现由于项目产品的需要,只能设置一个按键,但是需要实现短按(即单击)切换工作模式、长按开关机、双击暂停等复用功能。

下图是三种情况下的按键波形。

按键未按下时是高电平,按下去是低电平。

按键单击时,判断时间门槛设置为50~2000ms;长按门槛为持续按下2000ms。

双击可以视为时间间隔很短的俩次有效单击,从第一次单击上升沿到第二次单击上升沿延时门槛为100~500ms。

按键单击按键长按按键双击在STM8单片机上面实现代码为://按键按下去会出现下降沿,设置按键IO口GPIOB4所在的外部端口B下降沿触发中断void exit_init(void){EXTI_DeInit();EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB,EXTI_SENSITIVITY_FALL_ONLY);}//按键按下中断服务程序INTERRUPT_HANDLER(EXTI_PORTB_IRQHandler,4){if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_4)==0)//是按键下降沿{key_fall_flag = 1;//生成按键按下标志}}//周期1ms的定时器中断服务程序INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23){if(key_fall_flag==1)//发生按键按下事件{if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_4)==0)//按键持续按下{if(key_holdon_ms <= 2000){key_holdon_ms++;}else //按键按下到2000ms就判断长按时间成立,生成长按标志{key_holdon_ms = 0;short_key_flag=0;//清短按键标志key_long_down = 1;//长按键标志置位key_fall_flag = 0;//清按键按下标志}}else //按键抬起{if(key_holdon_ms>50)//按下时间大于50ms,生成单击标志{key_holdon_ms=0;short_key_flag=1;key_long_down =0;key_fall_flag=0;//距离上次单击时间在100~500ms之间,则认为发生连击事件if(keyupCnt>100 && keyupCnt<500){doubleClick = TRUE;short_key_flag=0;}keyUpFlag = TRUE;//单击抬起按键后,生成按键抬起标志}else//按键持续时间小于50ms,忽略{key_holdon_ms=0;short_key_flag=0;long_key_flag=0;key_fall_flag=0;}}}if(keyUpFlag)//单击抬起后,启动计数,计数到500mskeyupCnt++;if(keyupCnt>500){keyupCnt = 0;keyUpFlag = FALSE;}}。

单片机按键程序设计

单片机按键程序设计

单片机按键程序设计单片机按键的基本原理其实并不复杂。

通常,按键就是一个简单的开关,当按键按下时,电路接通,对应的引脚电平发生变化;当按键松开时,电路断开,引脚电平恢复到初始状态。

在程序设计中,我们需要不断检测引脚的电平变化,从而判断按键是否被按下。

在实际的按键程序设计中,有多种方式可以实现按键检测。

其中一种常见的方法是查询法。

这种方法是通过不断地读取按键对应的引脚状态来判断按键是否被按下。

以下是一个简单的查询法示例代码:```cinclude <reg51h> //包含 51 单片机的头文件sbit key = P1^0; //定义按键连接的引脚void main(){while(1) //无限循环{if(key == 0) //如果按键按下,引脚为低电平{//执行按键按下的操作//比如点亮一个 LED 灯P2 = 0xfe;while(key == 0);//等待按键松开}}}```上述代码中,我们首先定义了按键连接的引脚`key`,然后在主函数的无限循环中不断检测按键引脚的状态。

当检测到按键按下时,执行相应的操作,并通过`while(key == 0)`等待按键松开。

除了查询法,还有中断法可以用于按键检测。

中断法的优点是能够及时响应按键动作,不会因为程序的其他操作而导致按键响应延迟。

```cinclude <reg51h> //包含 51 单片机的头文件sbit key = P1^0; //定义按键连接的引脚void int0_init()//中断初始化函数{IT0 = 1; //下降沿触发中断EX0 = 1; //使能外部中断 0EA = 1; //开总中断}void int0() interrupt 0 //外部中断 0 服务函数{//执行按键按下的操作//比如点亮一个 LED 灯P2 = 0xfe;}void main(){int0_init();//初始化中断while(1);//无限循环,保持程序运行}```在上述代码中,我们首先在`int0_init` 函数中对中断进行了初始化设置,然后在`int0` 函数中编写了按键按下时的处理代码。

单片机按键程序的编写

单片机按键程序的编写
下面我们来看看多个按键的情况 吧
一般情况下,如果多个按键每个都直接接在单片机的 I/O 上的话会占用很多的 I/O 资源。比 较合理的一种做法是,按照行列接成矩阵的形式。按键接在每一个的行列的相交处。这样对 于 m 行 n 列的矩阵,可以接的按键总数是 m*n。这里我们以常见的 4*4 矩阵键盘来讲解矩阵 键盘的编程。
/******************************************
* 此模块所需相关支持库
*
******************************************/
#include"regx52.h"
#define uint8 unsigned char
#define uint16 unsigned int
bit bdata StartScan = 0 ;//此变量需放在定时中断中置位
else
{
//SHOW_ICON
}
}
}
每次执行读键盘函数时,只是对一些标志进行判断,然后退出。因此能够充分的利用 CPU 的资源。同时可以处理连发按键。此按键扫描按键函数可以直接放在主函数中。如果感觉按 键太过灵敏或者迟钝则改一下相关消抖动的宏定义即可。此函数也可以通过中断标志位进行 定时的扫描。此时,需要添加一个定时标志位,并将相关消抖动的和连击时间的宏定义改小 即可。然后在主程序类似下面这样写即可
这个流程是好多教科书上的做法。可惜,误导了好多人。为什么呢。因为它根本就没有考虑 实际情况。我们根据这幅流程图来写它的代码看看。
unsigned char v_ReadKey_f( void )
{
unsigned char KeyPress ;

单片机按键实验实训报告

单片机按键实验实训报告

一、实验目的1. 理解单片机按键的工作原理和电路连接方法;2. 掌握按键消抖原理及其实现方法;3. 学会使用单片机编程控制按键功能,实现简单的输入控制;4. 提高单片机实验操作能力和编程能力。

二、实验仪器及设备1. 单片机开发板(如STC89C52);2. 按键;3. 万用表;4. 电脑;5. Keil C编译器。

三、实验原理1. 按键原理:按键是一种电子开关,按下时导通,松开时断开。

在单片机应用中,按键常用于输入控制信号。

2. 按键消抖原理:由于按键机械弹性,闭合和断开时会有一连串的抖动。

若直接读取按键状态,容易导致误操作。

因此,需要进行消抖处理。

3. 消抖方法:主要有软件消抖和硬件消抖两种方法。

本实验采用软件消抖方法,即在读取按键状态后,延时一段时间再读取,若两次读取结果一致,则认为按键状态稳定。

四、实验步骤1. 硬件连接:将按键一端接地,另一端与单片机的某个I/O口相连。

2. 编写程序:使用Keil C编译器编写程序,实现以下功能:(1)初始化I/O口,将按键连接的I/O口设置为输入模式;(2)读取按键状态,判断按键是否被按下;(3)进行消抖处理,若按键状态稳定,则执行相应的功能。

3. 编译程序:将编写好的程序编译成HEX文件。

4. 烧录程序:将编译好的HEX文件烧录到单片机中。

5. 实验验证:观察实验现象,验证按键功能是否实现。

五、实验结果与分析1. 硬件连接正确,程序编译无误。

2. 实验现象:当按下按键时,单片机执行相应的功能;松开按键后,按键功能停止。

3. 分析:通过软件消抖处理,有效避免了按键抖动导致的误操作。

六、实验总结1. 本实验成功实现了单片机按键控制功能,掌握了按键消抖原理及实现方法。

2. 通过实验,提高了单片机编程和实验操作能力。

3. 在后续的单片机应用中,可以灵活运用按键控制功能,实现各种输入控制需求。

4. 本次实验为单片机应用奠定了基础,为进一步学习单片机技术打下了良好基础。

单片机按键单击双击长按功能实现

单片机按键单击双击长按功能实现在很多嵌入式系统中,都需要对按键进行检测和处理,以实现不同的功能。

常见的按键功能包括单击、双击和长按。

在这篇文章中,我们将介绍如何使用单片机实现这些按键功能。

首先,我们需要连接一个按键到单片机的I/O口。

按键通常是一个开关,有两个接触点。

当按键按下时,两个接触点会闭合,导致I/O口的电平发生变化。

我们可以利用这个变化来检测按键的状态。

为了实现按键功能,我们需要编写一段程序来监测按键的状态。

以下是一个简单的流程:1.初始化I/O口:将按键连接到I/O口上,并将I/O口设置为输入模式。

2.监测按键状态:定时读取I/O口的电平状态,以检测按键是否按下。

如果I/O口电平发生变化,则按键被按下或松开。

3.单击功能:当按键被按下时,记录当前时间,并等待一段时间,如果超过这段时间,说明按键已松开,则触发单击功能。

4.双击功能:如果在两次按键之间的时间间隔内再次检测到按键按下,则触发双击功能。

5.长按功能:当按键被按下一段较长的时间后,触发长按功能。

下面我们来具体介绍如何实现这些功能。

首先,我们需要初始化单片机的I/O口。

这个过程可以通过配置相应的寄存器实现。

具体的方法和步骤依赖于你使用的单片机型号和开发环境。

在这里,我们不具体展开,而是假设我们已经成功初始化了I/O口。

接下来,我们需要设置一个计时器用于定时检测按键的状态。

计时器的定时周期决定了我们可以检测的最短按键时间间隔。

通常,我们使用一个定时器来实现单击和双击功能,使用另一个定时器来检测长按功能。

一旦我们完成了计时器的配置,我们就可以开启定时器中断,并启动计时器。

每当定时器溢出时,中断函数会被触发,我们可以在这个函数中检测按键的状态。

在中断函数中,我们读取I/O口的电平状态,并根据当前的按键状态做出相应的处理。

首先,我们需要检测按键是否按下。

为了防止按键的抖动和误触发,我们使用一个状态机来确定按键的状态。

状态机的状态可以分为按下和松开两种。

单片机的按键功能是什么

单片机的按键功能是什么你们知道单片机的每个按键的具体功能吗?下面是店铺收集整理关于单片机的每个按键的具体功能的资料以供大家参考学习,希望大家喜欢。

·单片机的每个按键的具体功能介绍键盘的分类:键盘分编码键盘和非编码键盘。

键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘;而靠软件编程来识别的称为非编码键盘。

在单片机组成的各种系统中,用的最多的是非编码键盘。

也有用到编码键盘的。

非编码键盘有分为:独立键盘和行列式(又称为矩阵式)键盘。

本文主要讨论矩阵键盘(独立键盘比较简单可以与此类比),下面是矩阵键盘的电路连接图。

按键的扫描,主要是对每一个按键所编码的识别与确定。

如上图:按键所接口为P2口,置“0”则按键有效。

当P2口检测到值为P2=0x7e时,S1有效。

低四位用来确定行按键,高四行用来确定列按键。

基本的编程思想是:先设定P2口为0xfe,确定第一行按键有效,然后将P2口的值与0xf0按位与(&),然后检测P2口的值是否为0xf0,这样就屏蔽了低四位的电位改变(因为无论之后低四位怎样变化,低四位与0相与总是0)。

然后如果P2口得值不为0xf0时,则证明高四位有电位改变。

则检测此时的P2口得值,就可以确定是哪个按键被按下了。

如按键S1,它编码是P2=0x7e,也就是当P2口检测到值为P2=0x7e时,S1有效。

需要注意的是:按键按下时有一个前后抖动时间,如下图(a)所示。

如果单片机检测到的是抖动部分,则无法按键判断是否有效,所以我们需要加入防抖程序。

注:也可以通过硬件防抖,如上图(b)。

功能:矩阵键盘(按相应的按键,数码管从0~F的显示)单片机:AT89S52#include <reg52.h>#define uint unsigned int#define uchar unsigned charsbit DAT=P0^3;sbit CLK=P0^2;uchar temp,h;void delay(uint); //延迟程序void sendbyte(uchar); //数码管显示void keyscan(); //按键扫描uchar code tab[]={0xed,0x09,0xbc,0x9d,0x59,0xd5,0xf5,0x0d,0xfd,0xdd,0x7d,0xf1,0xe4,0xb9,0xf4,0x74,0x00} ; //0-F, 全灭void main (void){sendbyte(16); //初始时数码管无显示while(1){keyscan(); //按键扫描}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=100;y>0;y--);}void sendbyte(uchar byte){uchar num,c;num=tab[byte];for(c=0;c<8;c++){CLK=0;DAT=num&0x01;CLK=1;num>>=1; //右移位赋值}}void keyscan(){/*第一行按键的扫描*/P2=0xfe; //确定第一行的按键有效temp=P2; //将其赋给一个变量(处理I/O口时,一般先赋值给一个变量,然后通过处理变量来处理I/O口)temp=temp&0xf0; //用于检测第一行的哪个按键按下while(temp!=0xf0) /*这个部分只要是用来消除按下抖动的*/{delay(5);temp=P2;temp=temp&0xf0;while(temp!=0xf0) //这个地方,已经消除了按下抖动,P2口的值已经确定temp=P2; //将P2口得值赋给变量switch(temp) //这个switch语句,用来确定哪一个按键按下时,数码管的显示值{case 0x7e:h=0;break; //这个break很重要,表示如果有匹配的值,就跳出switch语句,防止程序跳不出来。

单片机按键模块设计(二)

单片机按键模块设计(二)引言概述:本文将介绍单片机按键模块设计的相关内容。

按键模块在嵌入式系统中被广泛应用,能够方便地实现对系统的控制和操作。

本文将从五个大点进行阐述,包括按键模块原理介绍、按键类型选择、按键电路设计、按键功能实现和按键模块调试。

通过详细介绍和分析,将帮助读者更好地理解和使用单片机按键模块。

正文:1. 按键模块原理介绍- 按键模块是通过触发按键开关来产生不同信号的模块。

它由按键开关和其它电路组成,可以实现按键信号的检测和处理。

- 常见的按键模块原理包括矩阵式按键、独立式按键和编码式按键。

每种原理都有其适用的场景和特点。

2. 按键类型选择- 按键的类型包括机械按键和触摸按键。

机械按键通常使用弹簧结构,稳定可靠,适用于精确操作。

触摸按键使用电容或电阻感应原理,触摸灵敏,外观简洁。

- 在选择按键类型时,需要根据具体应用场景和用户需求,综合考虑按键的性能、可靠性、成本等因素。

3. 按键电路设计- 按键电路设计要考虑按键的接入、滤波、去抖动等问题。

接入问题包括按键引脚的连接和布局。

滤波问题可以通过外部电容电路实现,防止因按键抖动引起的干扰。

去抖动问题可以通过软件或硬件的方式解决,确保按键信号的稳定和准确。

4. 按键功能实现- 按键的功能实现可以通过编程来完成。

根据按键的不同组合或按下时间等条件,可以触发不同的功能操作。

- 常见的按键功能包括开关控制、菜单选择、模式切换等。

通过编程,可以灵活地定制按键功能,满足不同应用的需求。

5. 按键模块调试- 按键模块的调试主要包括按键动作测试、按键信号检测和按键功能验证。

通过合理的测试和验证,可以确保按键模块的正常工作。

- 调试可以通过示波器、调试工具等设备来实现。

通过观察按键信号的波形和分析按键功能的实现情况,可以排查和解决可能存在的问题。

总结:本文从按键模块原理介绍、按键类型选择、按键电路设计、按键功能实现和按键模块调试五个大点进行了详细阐述。

通过本文的介绍,读者可以了解到单片机按键模块设计的基本原理和实现方法,从而能够更好地应用于具体的嵌入式系统中。

51单片机按键使用及注意事项

51单片机按键使用及注意事项如下:
1.按键工作原理:按键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时,开
关断开。

在开发板上使用的按键及内部简易图按键管脚两端距离长的表示默认是导通状态,距离短的默认是断开状态,如果按键按下,初始导通状态变为断开,初始断开状态变为导通。

2.按键电路接法:上拉是为了让引脚默认是高电平,但是上拉的力量扛不住接地,所以按键没有按
下时上拉的力量保证了IO引脚输入为1,而按下后绝对为0。

3.按键抖动:通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械点的弹性
作用,按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开,因而在闭合和断开的瞬间均伴随着一连串的抖动。

抖动时间的长短由按键的机械特性决定的,一般为5ms到10ms。

4.按键消抖:有两种方式,一种是硬件消抖,另一种是软件消抖。

5.注意事项:CPU通过监测按键连接的IO引脚的电平输入是1还是0来得知外部有没有人按下
这个按键。

CPU在按键被按下的一瞬间检测到的信号是很多次的忽高忽低的电平信号,这种信号是不稳定
的。

因此,需要使用按键消抖的算法使单片机获取到正常稳定的信号。

总的来说,51单片机按键使用需要注意按键的电路接法、抖动以及消抖等问题。

在使用过程中,需要遵循相应的原理和注意事项,以确保按键的正常工作。

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