状态机方式按键扫描单片机程序
- 格式:pdf
- 大小:71.21 KB
- 文档页数:2
单片机按键总结按键在电子设备中是一种常见的输入方式,其在单片机应用中具有重要的作用。
单片机按键的设计和使用对于产品的功能和用户体验具有直接影响。
本文将对单片机按键进行总结,包括按键的种类、连接方法以及常见的按键处理技术。
一、按键的种类在单片机应用中,按键的种类多种多样,常见的按键种类包括如下几种:1. 电子按键:电子按键是通过电容、电感或者电阻来实现的,通常具有体积小、响应速度快等优点。
常见的电子按键有触摸按键、滑动按键等。
2. 机械按键:机械按键是通过机械触点来实现的,具有手感好、寿命长等特点。
常见的机械按键有按钮开关、旋转开关等。
3. 光电按键:光电按键是通过光敏器件接收光信号来实现的,具有接触式触发、高灵敏度等特点。
常见的光电按键有红外遥控按键、光电开关等。
二、按键的连接方法单片机与按键之间的连接方式通常有两种:直接连接和矩阵连接。
1. 直接连接:直接连接是指每个按键与单片机的一个引脚直接相连。
这种连接方式简单、直观,但是需要消耗较多的IO口资源。
2. 矩阵连接:矩阵连接是指多个按键通过行列的方式连接到单片机的引脚上。
这种连接方式可以有效地节省IO口资源,但需要编写一定的扫描程序。
三、按键的处理技术在单片机中,按键的处理需要借助相应的技术手段,常见的按键处理技术包括如下几种:1. 常规轮询:常规轮询是指通过循环查询每个按键的状态,判断按键是否按下。
这种处理方式简单易懂,但是对CPU的占用较高。
2. 外部中断:外部中断是指按键触发时通过中断方式通知单片机进行处理。
这种处理方式可以有效地降低CPU的占用,提高系统的响应速度。
3. 硬件定时器:硬件定时器是通过定时器模块实现按键的扫描和检测。
这种处理方式可以减轻CPU的负担,提高按键的灵敏度。
4. 状态机方法:状态机方法是通过状态的转换来处理按键事件。
这种处理方式可以方便地处理多个按键的组合事件,提高系统的灵活性。
四、按键的应用案例1. 汽车遥控器:汽车遥控器通常使用红外遥控按键来实现对车辆的控制,通过单片机接收红外信号并解码,实现对车辆的开锁、上锁、寻车等功能。
单片机按键程序设计单片机按键的基本原理其实并不复杂。
通常,按键就是一个简单的开关,当按键按下时,电路接通,对应的引脚电平发生变化;当按键松开时,电路断开,引脚电平恢复到初始状态。
在程序设计中,我们需要不断检测引脚的电平变化,从而判断按键是否被按下。
在实际的按键程序设计中,有多种方式可以实现按键检测。
其中一种常见的方法是查询法。
这种方法是通过不断地读取按键对应的引脚状态来判断按键是否被按下。
以下是一个简单的查询法示例代码:```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` 函数中编写了按键按下时的处理代码。
51单片机独立按键工作原理
51单片机独立按键是单片机常用的一种输入方式,其工作原理主要包
括按键输入、按键扫描和按键判断三个部分。
一、按键输入
在51单片机独立按键的输入中,按键一般都是使用电子开关实现的。
当按下按键时,电子开关会闭合,形成一条通路。
通路中的电流会使
得连接在单片机输入引脚上的电容充电,使得电容电压迅速上升。
二、按键扫描
在51单片机独立按键的输入过程中,按键的状态需要被单片机不断地
进行扫描。
为了使得扫描的速度变快,通常会将扫描的引脚定义为优
先级较高的中断引脚。
因此,当按键按下的时候,单片机会处理中断
请求,并在相应的寄存器中保存按键的状态。
三、按键判断
在51单片机独立按键输入的最后一步,就是根据按键的状态来判断其
具体的操作。
这个判断过程需要我们设置一个合适的延迟时间,以保
证扫描程序不会出现错误。
总之,51单片机独立按键的工作原理包括按键输入、按键扫描和按键
判断三个部分。
这个过程中,电子开关的闭合和断开会形成一条通路,将电容充电,引脚定义为中断引脚,优先级较高。
最后,根据按键的
状态进行相应的判断来完成各种不同的操作。
STM32按键扫描之状态机问题描述:STM32平台GPIOA_Pin_6连接独立按键。
现需要实现:当按键按下后在1秒内释放了,此时计数值加1,而当按键按下后在1秒内没有释放,那么以后每隔0.5秒,计数值就会自动加上10,直到按键释放为止。
实现原理:采用有限状态机分析,事半功倍。
状态转换图如下:因此该状态图有四种状态:初始状态无按键状态(NoKeyDownStatus)、按键确认状态(KeySureDownStatus)、单次按键状态(OnceKeyDownStatus)、和连发状态(ContiousKeyDownStatus)。
系统每10ms进入读按键状态函数:StateStatus ReadKeyStatus(void)定义一个枚举类型列出该系统所有的状态:typedef enum{NoKeyDownStatus=0,KeySureDownStatus,OnceKeyDownStatus,ContiousKeyDownStatus}StateStatus;/**************************************************************Name :StateStatus ReadKeyStatus(void)*Function :Get the key status at the frequency of 10ms*Input :None*Output :Key status*************************************************************/StateStatus ReadKeyStatus(void){static StateStatus state = NoKeyDownStatus;static int TimeCount=0;int KeyPress = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6);StateStatus KeyReturn = NoKeyDownStatus;switch(state){case NoKeyDownStatus:if(!KeyPress){state = KeySureDownStatus ;}break;case KeySureDownStatus:if(!KeyPress){state = OnceKeyDownStatus ;TimeCount = 0;}else{state = NoKeyDownStatus ;}break;case OnceKeyDownStatus:if(KeyPress) //if the kye is up,so it's a normal key.{state = NoKeyDownStatus ;KeyReturn = OnceKeyDownStatus;}/*-If the status keep 1s,state switch to contious status-*/ else if(++TimeCount>=100){state = ContiousKeyDownStatus ;TimeCount = 0;KeyReturn = ContiousKeyDownStatus ;}break;case ContiousKeyDownStatus:if(KeyPress){state = NoKeyDownStatus ;KeyReturn = NoKeyDownStatus ;}/*-contious status have stay for 0.5s-*/else if(++TimeCount>50){//state = ContiousKeyDownStatus;KeyReturn = ContiousKeyDownStatus;TimeCount = 0;}/*if it dose not uplift but stay for ContiousKeyDownStatus less than 0.5s*/else{KeyReturn = NoKeyDownStatus;}break;}return KeyReturn;}代码微分析:如图在计时状态一时,其状态转换条件有:1)该状态没有维持1S时,按键就已抬起,此时转换到无按键按下状态。
单片机与触摸按键的交互设计在单片机应用中,触摸按键技术是一种常见的交互方式。
通过触摸按键,用户可以方便地与单片机进行交互,实现各种功能。
本文将探讨单片机与触摸按键的交互设计,从硬件设计和软件设计两个方面进行讨论。
一、硬件设计触摸按键的硬件设计主要包括触摸传感器和按键控制电路两部分。
1. 触摸传感器触摸传感器是用来感知用户触摸行为的装置。
常见的触摸传感器有电容触摸传感器和电阻触摸传感器两种类型。
- 电容触摸传感器:基于电容原理,通过感应人体的电容变化来检测用户的触摸行为。
它具有高灵敏度、易于集成等特点,但对环境的干扰较大。
- 电阻触摸传感器:基于电阻原理,通过感应用户的电阻变化来检测触摸行为。
它相对于电容触摸传感器来说,对环境的干扰较小。
在选择触摸传感器时,需根据具体的应用场景和性能要求进行合理选择,并按照厂商提供的设计指南进行布局和连接。
2. 按键控制电路按键控制电路主要用于检测触摸按键的信号并将其转换为数字信号,以供单片机进行处理。
按键控制电路一般由按键和按键检测电路组成。
- 按键:可以选择机械按键或触摸按键,其具体选择取决于应用需求。
机械按键相对来说操作感更好,但功耗和使用寿命较触摸按键较差。
- 按键检测电路:主要用于检测按键的开关状态,将按键的状态转换为数字输出。
可以采用行列式检测电路、编码器检测电路等方式进行设计。
二、软件设计单片机与触摸按键的软件设计主要包括按键扫描、触摸检测和交互逻辑处理三个部分。
1. 按键扫描按键扫描是指对触摸按键进行周期性扫描,并根据扫描结果判断按键的状态。
可以采用轮询扫描和中断扫描两种方式。
- 轮询扫描:通过在主循环中逐一检测各个按键的状态,实时响应用户操作。
适用于小规模按键的应用,实现简单。
- 中断扫描:通过外部中断或定时器中断来触发按键扫描,提高扫描效率。
适用于大规模按键的应用,具有较好的实时性。
2. 触摸检测触摸检测是指通过对触摸传感器的采样和处理,判断用户是否触摸按键。
摘要本文对按键状态扫描显示电路的原理与设计方案作了详细的说明与分析,主要通过各芯片与门电路的结合,通过合理的设计、布局,对由开关电路输入的信号进行编码、触发、保持、译码、显示等操作,实现按键状态扫描显示电路的功能。
电路的设计方案通过比较和优化,比较简单,电路的设计用到了TTL系列芯片,外加一些基本的电阻、导线、开关、电源。
电路设计方案完成后,在M ultisim 软件中进行了仿真,最后做出了实物,进行了调试与分析。
本电路的设计将所学的数字电路基础和电路的相关知识,运用于实践,最后本文对该电路设计做了整体评价,并作出总结。
关键词:按键编码触发保持译码显示按键状态扫描显示电路的设计与制作1 设计内容与方案选择1.1 设计的内容与要求初始条件:(1)以0~9十个数符标识十个按键;(2)当有键按下时,显示其标识符,并保持显示符直到新的按键作用;(3)如果多个按键同时作用,只响应最先作用的按键。
1.2方案选择1.2.1按键的标识及其对应的标识符显示的选择该电路用无锁的按键开关代替按键,用开关的通断控制信号的输入,开关按下时接通,输入1,开关断开输入0,编码电路可以采用优先编码器74LS148芯片,10输入可以用两片74LS148级联实现,输入低有效,因此开关断开时表示输入信号。
1.2.2按键优先方案的选择该电路设计的难点在于如何实现当多个按键同时作用,只响应最先作用的按键。
我想到可以用触发器来实现,使当多个按键同时作用,仅第一个按键按下时触发器工作,其余按键按下时触发器输出不变。
触发器的输出端连接译码显示电路。
实现对触发器的控制有两种方案:方案一:通过输入信号控制触发器的触发信号触发器采用74LS175,低电平触发,输入信号经过与非门连接至74LS175的CP 输入端,当输入信号全为1时,与非门输出0,CP输入端为0;当有一个开关断开,输入为0时,与非门输出0→1,CP输入端为0→1,触发器工作。
如果再断开多个开关,与非门输出仍为1,CP输入也不变,触发器输出不变,后面连接的译码显示输出也不变,因此满足该电路的设计要求。
矩阵键盘扫描原理方法一:逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。
方法二:行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平。
当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。
//行列扫描#include<reg51.h>#define GPIO_KEY P0#define GPIO_LCD P2unsigned char code a[17]={~0xfc,~0x60,~0xda,~0xf2,~0x66,~0xb6,~0xbe,~0xe0,~0xfe,~0xf6,~0xee,~0x3e,~0x9c,~0x7a,~0xde,~0x8e,~0x00}; //按位取反的用法void delay10ms();void keydown();//要与下面的定义一致void main(){GPIO_LCD=a[16];//初始化数码管while(1){keydown();}}void delay10ms(){unsigned char a,b;for(a=38;a>0;a--)for(b=130;b>0;b--);}void keydown()//检测按下,按下时需要消抖,检测松开,返回按键值//没有按键时保持{unsigned char n=0,key;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f)//读取按键是否按下{delay10ms(); //延时10ms消抖if(GPIO_KEY!=0x0f)//再次检测按键是否按下{GPIO_KEY=0x0f;//测试列switch(GPIO_KEY){case 0x07: key=0;break;case 0x0b: key=1;break;case 0x0d: key=2;break;case 0x0e: key=3;break;default : GPIO_LCD=a[16];}GPIO_KEY=0xf0;//测试行switch(GPIO_KEY){case 0x70: key=key;break;case 0xb0: key=key+4;break;case 0xd0: key=key+8;break;case 0xe0: key=key+12;break;default : GPIO_LCD=a[16];}GPIO_LCD=a[key];while(++n<5&&GPIO_KEY!=0xf0)//检测按键是否松开 {delay10ms();}}}}//逐行扫描#include<reg51.h>#define GPIO_KEY P0#define GPIO_LED P2unsigned char code a[17]={~0xfc,~0x60,~0xda,~0xf2,~0x66,~0xb6,~0xbe,~0xe0,~0xfe,~0xf6,~0xee,~0x3e,~0x9c,~0x7a,~0xde,~0x8e,~0x00}; //按位取反的用法void delay10ms();void keydown1();//要与下面的定义一致void main(){GPIO_LED=a[16];//初始化数码管while(1){keydown1();}}void keydown1(){unsigned char n=0,key;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f)//检测按键是否按下{delay10ms();//延时10ms消抖if(GPIO_KEY!=0x0f)//再次检测{GPIO_KEY=0x7f;//高四位轮流输出低电平 if(GPIO_KEY!=0x7f){switch(GPIO_KEY){case 0x77: key=0;goto AA;case 0x7b: key=1;goto AA;case 0x7d: key=2;goto AA;case 0x7e: key=3;goto AA;}}GPIO_KEY=0xbf;{switch(GPIO_KEY){case 0xb7: key=4;goto AA; case 0xbb: key=5;goto AA; case 0xbd: key=6;goto AA; case 0xbe: key=7;goto AA; }}GPIO_KEY=0xdf;if(GPIO_KEY!=0xdf){switch(GPIO_KEY){case 0xd7: key=8;goto AA; case 0xdb: key=9;goto AA; case 0xdd: key=10;goto AA; case 0xde: key=11;goto AA; }}GPIO_KEY=0xef;{switch(GPIO_KEY){case 0xe7: key=12;goto AA;case 0xeb: key=13;goto AA;case 0xed: key=14;goto AA;case 0xee: key=15;goto AA;}}GPIO_LED=a[16];goto BB;AA: GPIO_LED=a[key];BB: GPIO_KEY=0x0f;while(++n<5&&GPIO_KEY!=0x0f) delay10ms();//调用函数别忘记() }}}void delay10ms(){unsigned char a,b;for(a=38;a>0;a--)for(b=130;b>0;b--); }。
状态机方式按键扫描单片机程序
这是从51hei/bbs/dpj-19294-1.html这个单片机做的收音机里面截取出来的
一个子程序,完整的代码和
adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=17&is_app=0&jk=66a
41a025f30382d&k=%D4%AD%C0%ED%CD%BC&k0=%D4%AD%C0%ED%CD%B C&kdi0=0&luki=3&n=10&p=baidu&q=98059059_cpr&rb=0&rs=1&seller_id=1&si
d=2d38305f21aa466&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1831118&u=http%3A%2 F%2Fwww%2E51hei%2Ecom%2Fmcu%2F1974%2Ehtml&urlid=0” id=“5_nwl” mpid=“5” target=“_blank”>原理图可从原帖下载. /*-----------状态机方式按键扫描-----------*/ /*------------外部晶振为12MHz-----------*/ /*--------最后修改2011.02.26--------------*/#include “STC12C5620AD.H”#include “Key_Scan.H”#define Key_Mask 0x0f //屏蔽不用的按键,不用的按键用0屏蔽
/********************** 声明外部变量**************************/extern uchar Work_Mode; //From Main.c/********************** 按键扫描读取**************************/uchar Key_Scan(void){static uchar Key_State=0; //
定义按键状态uchar Key_Press;uchar Key_Return=0x00; //定义按键返回的键值Key_Press=Key_Input&Key_Mask;//读按键I/O电平switch(Key_State){case 0: // 按键初始态if (Key_Press!=Key_Mask)Key_State=1; // 键被按下,状态转换到键
确认态break;case 1: // 按键确认态if (Key_Press==Key_Input&Key_Mask) {Key_Return=Key_Press; // 按键仍按下且键值键值,按键确认输出BEEP_DRV=1; // 驱动蜂鸣器Key_State=2;// 状态转换到键释放态} elseKey_State=0;// 按键已抬起或改变,并转换到按键初始态break;case 2:if。