状态机方式按键扫描单片机程序
- 格式: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--); }。
单片机控制多个按键的方法在很多嵌入式系统中,通常会用到按键进行输入。
单个按键的控制可能相对简单,但是如果需要控制多个按键,就需要用到一些特殊的控制方法。
常用的按键控制方法主要有以下几个方面: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被按下,执行相应的操作}}四、总结单片机控制多个按键的方法,需要采用特殊的控制方法,例如矩阵按键法和编码按键法等。
新型的按键扫描程序不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。
我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入式处理器上面,因为C语言强大的可移植性。
同时,这里面用到了一些分层的思想,在单片机当中也是相当有用的,也是本文的另外一个重点。
对于老鸟,我建议直接看那两个表达式,然后自己想想就会懂的了,也不需要听我后面的自吹自擂了,我可没有班门弄斧的意思,hoho~~但是对于新手,我建议将全文看完。
因为这是实际项目中总结出来的经验,学校里面学不到的东西。
以下假设你懂C语言,因为纯粹的C语言描述,所以和处理器平台无关,你可以在MCS-51,AVR,PIC,甚至是ARM平台上面测试这个程序性能。
当然,我自己也是在多个项目用过,效果非常好的。
好了,工程人员的习惯,废话就应该少说,开始吧。
以下我以AVR的MEGA8作为平台讲解,没有其它原因,因为我手头上只有AVR的板子而已没有51的。
用51也可以,只是芯片初始化部分不同,还有寄存器名字不同而已。
核心算法:unsigned char Trg;unsigned char Cont;void KeyRead( void ){unsigned char ReadData = PINB^0xff; // 1Trg = ReadData & (ReadData ^ Cont); // 2Cont = ReadData; // 3}完了。
有没有一种不可思议的感觉?当然,没有想懂之前会那样,想懂之后就会惊叹于这算法的精妙!!下面是程序解释:Trg(triger)代表的是触发,Cont(continue)代表的是连续按下。
1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。
2:算法1,用来计算触发变量的。
一个位与操作,一个异或操作,我想学过C 语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。
51单片机的矩阵按键扫描的设计C语言程序以下为一个基于51单片机的矩阵按键扫描的设计C语言程序:```c#include <reg51.h>//定义端口连接到矩阵键盘sbit col1 = P2^0;sbit col2 = P2^1;sbit col3 = P2^2;sbit row1 = P2^3;sbit row2 = P2^4;sbit row3 = P2^5;sbit row4 = P2^6;//声明按键函数char read_keypad(;void maiwhile (1)char key = read_keypad(; // 读取按键值//根据按键值进行相应操作switch(key)case '1'://第一行第一列按键逻辑//在此处添加相应的代码break;case '2'://第一行第二列按键逻辑//在此处添加相应的代码break;//继续处理其他按键//...default://未识别到按键break;}}//按键扫描函数char read_keypacol1 = 0; col2 = 1; col3 = 1; // 激活第一列if (row1 == 0) { // 第一行第一列按键被按下while (row1 == 0); //等待按键释放return '1'; // 返回按键值}if (row2 == 0) { // 第二行第一列按键被按下while (row2 == 0); //等待按键释放return '4'; // 返回按键值}if (row3 == 0) { // 第三行第一列按键被按下while (row3 == 0); //等待按键释放return '7'; // 返回按键值}if (row4 == 0) { // 第四行第一列按键被按下while (row4 == 0); //等待按键释放return '*'; // 返回按键值}col1 = 1; col2 = 0; col3 = 1; // 激活第二列//处理第二列的按键逻辑//...col1 = 1; col2 = 1; col3 = 0; // 激活第三列//处理第三列的按键逻辑//...return '\0'; // 返回空字符表示未检测到按键```以上代码中,我们使用51单片机的P2端口连接到矩阵键盘的列和行,通过扫描不同的列和检测行的状态来判断按键是否被按下。
单片机按键实验报告篇一:单片机按键扫描实验报告键盘扫描一.实验目的(1)掌握矩阵键盘接口电路和键盘扫描编程方法。
(2)掌握按键值处理与显示电路设计。
二.实验任务(1)设计4*4键盘,编写各个键的特征码和对应的键值(0~F);(2)编程扫描按键,将按键对应的数字值使用数码管显示出来。
三.实验电路及连线方法1.采用动态显示连线方法:电路由2 片74LS573,1 个六字一体的共阴数码管组成。
由U15 输出段选码,U16 做位选码,与单片机的采用I/O 口连接方式,短路片J22 连接P2.0,J23 连接P2.3,做输出信号锁存。
(实际电路连接是d7-d6-d5-d4-d3-d2-d1-d0?h-c-d-e-g-b-a-f)。
PW12 是电源端。
2.键盘电路连线方法:电路由16 个按键组成,用P1 口扩展4×4 行列式键盘。
J20 是键盘连接端,连接到P1 口。
J21 是行列键盘、独立键盘选择端,当J21 的短路片连接2-3脚时,构成4×4 行列式键盘;当J21 的短路片连接2-1 脚时,可形成3×4 行列式键盘,4 个独立式按键S4、S8、S12、S16,这4 个独立按键分别连接P1.4~P1.7;其他12 个键3×4 行列式键盘。
PW15 是电源端。
四.编程思路1.采用反转法识别按键的闭合。
2.采用动态显示将键值显示出来。
五.算法流程图六.资源分配1.用P1口进行查找按键2.用R3做键值指针3.用R1做动态显示为选码指针。
4.R5为延时指针。
七.程序设计KPIN:ORG MOV MOV ANL MOV 0000H P1,#0F0H A,P1 A,#0F0H B,AMOVP1,#0FHMOVA,P1ANLA,#0FHORLA,BCJNE A,#0FFH,KPIN1AJMP EXITKPIN1: MOVB,AMOVDPTR,#TABKPMOVR3,#0KPIN2: MOVA,R3MOVC A,@A+DPTRCJNE A,B,KPIN3MOVA,R3LOOP: MOVR1,#0FEH;键盘动态显示 LOOP1: MOVA,R3ANLA,#0FHMOV DPTR,#TABMOVC A,@A+DPTRCLRP2.0CLRP2.1MOVP0,ASETB P2.0NOPCLRP2.0LOOP2: MOVA,R1;位选码MOVP0,ASETB P2.1MOVR5,#250LOOP3: DJNZ R5,LOOP3CLRP2.1SJMP LOOPKPIN3: INCR3CJNE A,#0FFH,KPIN2EXIT: RETTABKP: DB0EEH,0DEH,0BEH,7EH,0EDH,0DDH,0BDH,7DH,0EBHDB 0DBH,0BBH,7BH,0E7H,0D7H,0B7H,77H,67H,0FFHTAB: DB77H,44H,3EH,6EH,4DH,6BH,7BH,46H,7FH,6FH,5FHDB 79H,33H,7CH,3BH,1BHEND八.调试出现的问题及解决问题1:程序正常运行,但按键显示出现乱码解决:动态显示笔形码错误,并改正。
题目按键状态扫描显示电路的设计与制作题目: 按键状态扫描显示电路的设计与制作初始条件:(1)以0~9十个数符标识十个按键(2)当有键按下时,显示其标识符,并保持显示符直到新的按键作用(3)如果多个按键同时作用,只响应最先作用的按键要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)设计任务及要求(2)方案比较及认证(3)系统框图,原理说明(4)硬件原理,完整电路图,采用器件的功能说明(5)调试记录及结果分析(6)改进方法(7)总结(收获及体会)(8)参考资料(9)附录:器件表,芯片资料时间安排:6月25日~6月28日:明确课题,收集资料,方案确定7月28日~7月2日:整体设计,硬件电路调试7月2日~7月6日;报告撰写,交设计报告,答辩指导教师签名:2012年 7月日目录摘要 (1)1 设计内容及方案选择 (2)1.1设计内容及其设计要求. (2)1.2方案选择 (2)1.2.1 按键的标识及对应的标识符显示方案的选择 (2)1.2.2 信号的锁存及按键优先作用方案的选择 (2)2 电路的设计及器件的选择 (3)2.1电路的原理 (3)2.1.1 电路的原理框图及其说明 (3)2.1.2 单元电路的说明 (3)2.1.3 完整的电路图 (4)2.2开关电路的设计和器件的选择 (5)2.2.1开关电路的设计 (5)2.2.2各主要芯片的功能说明 (5)2.2.3 电路的总体说明 (10)2.3方案二完整电路图及其比较选择 (11)3 硬件电路的设计及其制作与调试 (11)3.1仿真使用的系统 (12)3.2 制作与调试的方法和技巧 (12)3.3测试的数据分析 (12)3.4 制作与调试中出现的故障、原因及排除方法 (12)结束语 (13)参考文献 (14)附录按键状态扫描显示电路所用元件 (15)本科生课程设计成绩评定表 (16)摘要此课程设计是基于键盘按键功能的模拟,需要运用现有所学的数字电子技术的知识,主要实现以下设计的功能 1.按键显示:按下一个按钮输出显示对应的数字,十个按钮分别用0~9显示 2.按键保持:按键后的显示一直保持到新的按键作用 3.优先按键:如果多个按键同时作用,只响应最先作用的按键。
状态机方式按键扫描单片机程序
这是从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。