51单片机独立键盘
基于51单片机的USB键盘设计与实现
基于51单片机的USB键盘设计与实现
一、背景介绍
USB键盘是近些年来随着计算机科技发展而出现的一种新型输入设备。
它采用USB接口,是电脑设备接口标准由PS/2接口更换而来的,可以满
足现代电脑日益增长的输入需要。
现代联想主板,微星主板都采用了USB
接口出现,同时USB接口也可以有效投放鼠标、USB外置设备等。
是一种
非常有效的替代方案。
本文的主要目的是基于51单片机的USB键盘设计与实现,在此基础上,可以得出一个具有良好性能的USB键盘,它将成为计算机用户所不可
或缺的输入设备之一
二、功能要求
B键盘的硬件部分,采用51单片机作为核心,屏幕模块和按键
模块作为主要的输入设备。
2.支持USB1.1/2.0标准,能够兼容主流的主板及不同接口的设备,
实现多种输入功能并支持多种操作系统。
3.按键部分及其他硬件设计,需考虑到键盘的灵敏度、机械结构的耐
用性、按键的设计及密度等多方面因素,以提高使用者的操作方便性。
4.软件设计,在51单片机上实现USB键盘的驱动程序,在根据不同
接口的主板及设备对应的协议、功能及数据格式等配置相应的控制程序,
以保证其能够实现对应的输入功能。
三、硬件设计
1.主控:采用51单片机作为主控。
在AT89S52 单片机上连接矩阵键盘-51单片机与4x4键盘
unsigned char Key_Scan(void)//键盘扫描函数 如果有键按下返回键 ASC 值 若无返回 0 {
P1=0XF0; if(P1!=0XF0)//先确定是否有键按下 {
Delay(5);//稍微延时 避开按键前期抖动 if(P1!=0xf0)//再次检测是否按下
{ //--------------1-----------------------------------P1=0XFE;//第一次把 P1^7 拉低 switch (P1)//测 P1^0~~~P1^3 有没有低的 { case 0xee: while(P1!=0xfe);return '0';//P1^3 低 while();是在等待松手
//-------------3-------------------------------------P1=0XFB;//第三次把 P1^5 拉低 switch (P1)//测 P1^0~~~P1^3 有没有低的 {
case 0xeb: return '8';//P1^3 低 返回‘8’ case 0xdb: return '9';//P1^2 低 返回‘9’ case 0xbb: return 'A';//P1^1 低 返回‘A’ case 0x7b: return 'B';//P1^0 低 返回‘B’ default: break;//没有本行的键按下 继续下面扫描 }
case 0xe7: return 'C';//P1^3 低 返回‘C’ case 0xd7: return 'D';//P1^2 低 返回‘D’ case 0xb7: return 'E';//P1^1 低 返回‘E’ case 0x77: return 'F';//P1^0 低 返回‘F’ default: break;//没有键按下 继续下面 } } return 0; } 希望新入行的兄弟上机试一下这段函数 可以配个 LCD 来做显示 也可以用串口发回电脑显 示 否则光是看看印象不会很深的 严重不建议简单电路使用软件仿真 还是要 搭板子 编程 烤片 试验的
独立式键盘程序
51单片机:键盘控制程序2009-11-14 16:12键盘控制1.功能说明:用八位指拨开关(DIP)作单片机的输入,控制输出端口连接的八只LED发光二极管。
如若DIP1开关为 ON(向右拨动)则LED1亮,其它开关作用同。
程序:LOOP: MOV A, P3 ; 从P3读入DIP开关值MOV P1, A ; 从P1输出03: JMP LOOP ; 无穷循环04: END ;程序结束2.功能说明:用DIP开关中的低4位作二进制的输入,控制输出端数码管显示器的输出。
程序:01: MOV DPTR,#TABLE ; 存表02: MOV P0, #0FFH ; LED全灭03: LOOP: MOV A, P3 ; 从P3口读入DIP开关值04: ANL A, #0FH ; 高4位清0,取低四位05: ACALL CHANG ; 转成七段显示码06: MOV P0, A ; 从P0输出07: JMP LOOP ; 转移LOOP处,循环08: CHANG: MOVC A,@A+DPTR ; 取码09: RET ; 返回转换显示码子程序10: TABLE: DB 0C0H, 0F9H, 0A4H, 0B0H ;11: DB 99H, 92H, 82H, 0F8H ;12: DB 80H, 90H, 88H, 83H ;13: DB 0C6H, 0A1H, 86H, 8EH ; 显示码表14: END ;程序结束3.功能说明:用两个按键开关K1和K2作输入,K1为电源指示灯开关,K2为工作指示灯开关。
分别控制电源指示灯(P1.0接的LED)和工作指示灯(P1.7接的LED)的接通和关闭。
接通电源时,电源指示灯是在亮的状态。
当按K2时,工作指示灯亮,电源指示灯灭。
按K1时,电源指示灯亮,工作指示灯灭。
程序:01: START: MOV P1, #11111110B ; P1.0所接LED亮02: JB P2.5 , $ ; 判断P2.5(K2键)是否为103: ON: MOV P1, #01111111B ; P1.7所接LED亮04: JNB P2.4, START ; 判断P2.4(K1键)是是否为005: JMP ON ; 未按K1键,则跳至ON06: END ;程序结束4.功能说明:由四个按键开关组成独立式键盘,控制灯左移、右移和闪烁。
51单片机矩阵键盘
山中的四季。【教学提示】翻译有直译与意译两种方式,直译锻炼学生用语的准确性,但可能会降低译文的美感;意译可加强译文的美感,培养学生的翻译兴趣,但可能会降低译文的准确性。因此,需两种翻译方式都做必要引导。全文直译内容见《我的积累本》。目标导学四:解读文段,把握文本内容
阳修。他于庆历五年被贬谪到滁州,也就是今天的安徽省滁州市。也是在此期间,欧阳修在滁州留下了不逊于《岳阳楼记》的千古名篇——《醉翁亭记》。接下来就让我们一起来学习这篇课文吧!【教学提示】结合前文教学,有利于学生把握本文写作背景,进而加深学生对作品含义的理解。二、教学新
课目标导学一:认识作者,了解作品背景作者简介:欧阳修(1007—1072),字永叔,自号醉翁,晚年又号“六一居士”。吉州永丰(今属江西)人,因吉州原属庐陵郡,因此他又以“庐陵欧阳修”自居。谥号文忠,世称欧阳文忠公。北宋政治家、文学家、史学家,与韩愈、柳宗元、王安石、苏洵、苏轼、
此五物之间,岂不为六一乎?”写作背景:宋仁宗庆历五年(1045年),参知政事范仲淹等人遭谗离职,欧阳修上书替他们分辩,被贬到滁州做了两年知州。到任以后,他内心抑郁,但还能发挥“宽简而不扰”的作风,取得了某些政绩。《醉翁亭记》就是在这个时期写就的。目标导学二:朗读文章,通文
会员免费下载 顺字1.初读文章,结合工具书梳理文章字词。2.朗读文章,划分文章节奏,标出节奏划分有疑难的语句。节奏划分示例
1、键盘的分类
键盘分编码键盘和非编码键盘。键盘上 闭合键的识别由专用的硬件编码器实现,并 产生键编码号或键值的称为编码键盘,如计 算机键盘.
6.4 STM32F103c8t独立按键功能深入剖析(神舟51+ARM)
那么接下来” SRAM 实际寄存器地址偏移 0x2000_0000 的 bit 数”该如何计算呢? 对,用寄存器的地址减去这个基地址,然后在乘以 8(因为一个地址对应 8 个 bit), 所以就可以得到以下的公式:
(A‐0x20000000)*8 以上这个公式可以知道实际寄存器离基地址有多少个 bit 的距离,访问该寄存器的第 n 个 bit 位还必须加上一个 n,就变成以下的公式:
6.4 独立按键............................................................................................................................2 6.1.1 按键的分类.......................................................................................................2 6.1.2 按键属性...........................................................................................................2 6.1.3 STM32 的位带操作..........................................................................................3 6.1.4 例程 01 STM32 芯片按键点灯(无防抖)....................................................8 6.1.5 例程 02 STM32 芯片按键点灯-增加了防抖的代码.....................................14
单片机键盘显示实验报告
单片机的键盘和显示实验报告㈠实验目的1.掌握单片机I/O的工作方式;2.掌握单片机以串行口方式0工作的LED显示;3.掌握键盘和LED显示的编程方法。
㈡实验器材1.G6W仿真器一台2.MCS—51实验板一台3.PC机一台4.电源一台㈢实验内容及要求实验硬件线路图见附图从线路图可见,8051单片机的P1口作为8个按键的输入端,构成独立式键盘。
四个LED显示器通过四个串/并移位寄存器74LS164接口至8051的串行口,该串行口应工作在方式0发送状态下,RXD端送出要显示的段码数据,TXD则作为发送时钟来对显示数据进行移位操作。
编写一个计算器程序,当某一键按下时可执行相应的加、减、乘、除运算方式,在四个显示器上显示数学算式和最终计算结果。
注:①通过按键来选择加、减、乘、除四种运算方式。
②输入两个数字均为一位十进制数,可预先放在内存中。
㈣实验框图(见下页)㈤思考题1.当键盘采用中断方式时,硬件电路应怎样连接?P1.4~P1.7是键输出线,P1.0~P1.3是扫描输入线。
输入与门用于产生按键中断,其输入端与各列线相连,再通过上拉电阻接至+5 V电源,输出端接至8051的外部中断输入端。
2.74LS164移位寄存器的移位速率是多少?实验中要求计算的式子和结果之间相差一秒,移位寄存器的移位速率应该是每秒一位吧。
其实这个问题确实不知道怎么回答。
LED 显示用的段码与教科书所提供的不同,本实验采用如下段码:显示数符段码显示数符段码0BBH A DBH109H B F1H2EAH C B2H36BH D E9H459H E F2H573H F D2H否有否P1口置输入读P1口开 始显示“0000”是否有键按下?延迟消抖是否有键按下?是读键码加法运算减法运算除运算6F3H—40H70BH.04H8FBH┗┛A1H97BH┗┛1AH灭00H P DAH实验代码:ORG 0000HAJMP MAINORG 0030HMAIN:MOV 41H,#0BBH ;对几个存放地址进行初始化MOV 42H,#0BBHMOV 43H,#0BBHMOV 44H,#0BBHMOV SCON,#00H ;初始化串行口控制寄存器,设置其为方式0 LCALL DISPLAY ;初始化显示KEY:MOV R3,#08H;用来存放两个数据MOV R4,#02HMOV P1,#0FFH ;初始化P1口MOV A,P1 ;读取按键状态CPL A ;取正逻辑,高电平表示有键按下JZ KEY ;A=0时无键按下,重新扫描键盘LCALL DELAY1;消抖MOV A,P1 ;再次读取按键状态CPL AJZ KEY ;再次判别是否有键按下PUSH AKEY1:MOV A,P1CPL AANL A,#0FH ;判别按键释放JNZ KEY1 ;按键未释放,等待LCALL DELAY1;释放,延时去抖动POP AJB ACC.0,ADD1 ;K1按下转去ADD1JB ACC.1,SUB1 ;K1按下转去SUB1JB ACC.2,MUL1 ;K1按下转去MUL1JB ACC.3,DIV1 ;K1按下转去DIV1LJMP KEYADD1:LCALL BUFFER ;显示加数和被加数MOV 43H,#049HLCALL DISPLAY ;显示加号MOV A,R3ADD A,R4DA AMOV R3,A ;相加结果放入R6ANL A,#0FHMOV R4,A ;结果个位放入R7MOV A,R3SWAP A ;半字节交换,高四位放入低四位ANL A,#0FHMOV R3,A ;结果的高位放入R6LCALL L;显示缓存区设置LCALL DELAY2;延时一秒后显示LCALL DISPLAYLJMP KEYSUB1:LCALL BUFFER ;显示减数和被减数MOV 43H,#40HLCALL DISPLAY ;显示减号MOV A,R3CLR CY ;CY清零SUBB A,R4 ;做减法PUSH ARLC A ;带进位循环左移,最高位放入CYJC F ;判断最高位,若为1则跳转到负数ZHENG: POP AMOV R4,AMOV R3,#00H ;高位清零SJMP OUTFU:POP ACPL A ;取绝对值INC AMOV R4,AMOV R3,#11H ;显示负号OUT: LCALL L ;显示缓存区设置LCALL DELAY2 ;延时1s后显示LCALL DISPLAYLJMP KEYMUL1:LCALL BUFFER ;显示两位乘数MOV 43H,#99HLCALL DISPLAY ;显示乘号MOV A,R3MOV B,R4MUL AB ;结果放入AB,A中是低8位,B中是高8位MOV B,#0AHDIV AB ;十进制转换MOV R4,B ;结果个位放入R7MOV R3,A ;结果的十位放入R6LCALL LLCALL DELAY2LCALL DISPLAY ;延时1s后显示LJMP KEYDIV1:LCALL BUFFER ;显示除数和被除数MOV 43H,#62HLCALL DISPLAY ;显示除号MOV A,R3MOV B,R4DIV AB ;A除以BMOV R4,B ;余数放在R4中MOV R3,A ;商放在R3中MOV A,R4MOVC A,@A+DPTR ;调用段选号MOV 41H,A ;显示余数MOV A,R3MOVC A,@A+DPTRMOV 43H,A ;显示商MOV 42H,#00HMOV 44H,#00HLCALL DELAY2 ;延时1S后显示LCALL DISPLAYLJMP KEYBUFFER: MOV 41H,#22H ;显示初始化,在做计算之前显示两个操作数,显示等号MOV DPTR,#TABLMOV A,R4MOVC A,@A+DPTRMOV 42H,AMOV A,R3MOVC A,@A+DPTRMOV 44H,ARETDISPLAY:MOV R5,#04H;共四位需要显示MOV R0,#41HDISPLAY1:MOV A,@R0MOV SBUF,ADISPLAY2:JNB TI,DISPLAY2;是否传完了CLR TIINC R0DJNZ R5,DISPLAY1RETL:MOV A,R4MOVC A,@A+DPTRMOV 41H,A ;R4对应的段码MOV A,R3MOVC A,@A+DPTRMOV 42H,A ;R3对应的段码MOV 43H,#00HMOV 44H,#00HRETDELAY1: ;普通延时MOV R1,#20HDS1:MOV R2,#0FFHDS2:DJNZ R2,DS2DJNZ R1,DS1RETDELAY2:MOV R6,#14H ;定时1SMOV TMOD,#01HDS3:MOV TH0,#3CHMOV TL0,#0B0H ;50msSETB TR0LOOP:JNB TF0,LOOPCLR TF0CLR TR0DJNZ R6,DS3 ;1s到,中断返回RETTABL:DB 0BBH 09H 0EAH 6BH ;段码表DB 59H 73H 0F3H 0BHDB 0FBH 7BH 00H 0DBHDB 0F1H 0B2H 0E9H 0F2HDB 0D2H 40H实验结果及分析按键1:8+2= 结果:10按键2:8-2= 结果: 6按键3:8*2= 结果:16按键4:8/2= 结果:4从上面的结果可以看出,本次实验基本完成了实验要求。
51单片机项目教程项目 8 独立键盘输入
判断键一次按下的具体方法
先判断键是否按下,若按下了延时10 ms,跳过按下抖动期,然后再判 断按键是否按下,若是说明按键真的按下了,否则说明是干扰信号, 如果键真的按下了,则等待键释放,如果键释放了,延时10 ms,再判 断键是否释放,若释放了,说明按键真的释放了,否则说明是干扰信 号,如果按键真的释放了,说明一次完整的按键过程完成了。在一次 完整的按键后,可以连接该键对应的功能程序段,以实现特定的功 能。
8.2技术准备
IF语句(条件分支语句) if (条件) 语句 语句可以是复合语句 复合语句:用 { }将多条语句组合在一起而形成的一种语句不需要用;结束, 但它内部的语句仍需要用;结束。
复合语句格式:
{ 局部变量定义; 语句1;
语句2;
…… 语硬件实物和模块原理图
8.2技术准备
8.2.1独立键盘输入理论知识 P3口第二功能表 图8- 1 P3口第二功能表 P3.0—P3.7: 双功能口(内置了上拉电阻) 它具有特 定的第二功能。 在不使用它的第二功能时它就是普通的通用准双向I/O 口。 如何检测键盘输入 键盘的分类 独立式键盘电路原理。 编写一个简单的键盘输入程序:按下KEY1,用LED显示出信号 读端口就是读Pn端口寄存器;读引脚就是读该引脚在Pn端口寄存器中的对应位,通过引用Pn端口寄存 器的值,或者引用Pn端口寄存器中的对应位,就可以实现读端口或者读引脚。 IF语句 键盘输入检测的一种基本方法:轮询法。 键按下和释放时,输入信号的抖动现象,如何进行键盘软件消抖。
8.3 项目实施
实物结果如图所示
图8- 6 按键实验实物
8.3 项目实施
8.3.1 独立键盘输入实战环节
实验代码独立键盘输入1 /************************************************* *实验名:独立键盘输入 *实验效果:按下第1个独立按键K1 2个红色的led灯亮 按下第2个独立按键K1 2个绿色的led灯亮 按下第3个独立按键K1 2个黄色的led灯亮 按下第4个独立按键K1 2个蓝色的led灯亮 *************************************************/
例说51单片机8-学习使用键盘
pzq@/csh@sparkcn8. 学习使用键盘前面章节我们主要了LED 、点阵、数码管等,这些我们都称之为输出设备,这一章我们就一起来看嵌入式中最常用的输入设备—按键和键盘。
8.1 简介说到按键大家都很熟悉,这个东西随处可见,其原理也比较简单,就是平时处于断路状态,一按下,就是短路状态了,达到一个状态切换的目的。
如下图8-1所示图 8-1在嵌入式中常见的键盘有三种1 独立键盘所谓独立按键就是每个按键单独连接在CPU 的一个I/O 口上,每个按键之间是独立的。
如图8-2的连接方式pzq@/csh@sparkcn图 8-2这种连接方式,每增加一个按键就要多使用一个I/O 口,所以在按键比较多的情况下,就不适合使用这种按键连接方式。
否则整个CPU 都被按键给占用。
这种按键的操作方式也比较简单,学完本章后面的内容,代码留给大家做动手题。
2 矩阵键盘当使用的键盘比较多时,使用这种方式连接可以节约很多IO 口,因为在原图图上排列成矩形,所以一般叫矩阵键盘,有时也叫行列键盘。
上图图 8-3这种方式方式使用n 行n 列可以扩展出n*n 个键盘,比使用独立按键大大减pzq@/csh@sparkcn少IO 口的使用。
适合于按键比较多的情况,这个也是这章主要负责消灭的问题。
3使用专用芯片来管理键盘,当单片机的I/O 口已经不够添加需要的按键数或单片机的程序本身很繁忙,没有功夫应付按键的计算时,就得考虑使用专用芯片了。
如周立功的zlg7289(请童鞋们自己上网搜索这个芯片的使用手册并了解其使用方法)。
抖动注意了,这里的抖动可不是说你按键时手的抖动。
这里的抖动指的是因为按键机械特性,固有的抖动。
当我们按下按键时,我们认为他的状态就是由开路直接变为短路了,从CPU 端看到就是0变1,或1变0了。
这是我们想的理想情况,实际情况并没有这么干脆利索,如果你手头有示波器的话,可以自己动手测量一下按下时的波形,这样印象会更深刻,如果没有,就看看前人的经验吧,也是一样的,看下图8-4。
51单片机键盘设置
\\\§8.3 键盘接口技术一、键盘输入应解决的问题键盘是一组按键的集合,它是最常用的单片机输入设备.操作人员可以通过键盘输入数据或命令,实现简单的人机通讯。
键是一种常开型按钮开关,平时(常态)键的二个触点处于断开状态,按下键时它们才闭合(短路)。
键盘分编码键盘和非编码键盘。
键盘上闭合键的识别由专用的硬件译码器实现并产生编号或键值的称为编码键盘,如:ASCⅡ码键盘、BCD码键盘等;靠软件识别的称为非编码键盘。
在单片机组成的测控系统及智能化仪器中用得最多的是非编码键盘。
本节着重讨论非编码键盘的原理、接口技术和程序设计。
键盘中每个按键都是—个常开关电路,如图所示。
1.按键的确认:P1.7=1 无按键;P1.7=0 有按键;2.去抖动去抖动的方法:①硬件去抖动采用RS触发器:优点: 速度快,实时,缺点: 增加了硬件成本②软件去抖动采用延时方法延时5—10ms 延时5—10ms P1.7=0 确认P1.7=0 P1.7=1 (去前沿抖动) (去后沿抖动)二、独立式键盘每个I/O口连接一个按,S1 P1.0S2 P1.1……………………….S8 P1.7软件:START:MOV P1,#0FFH ;置P1口为高电平JNB P1.0, RS1 ; S1按下,程序去执行RS1JNB P1.1, RS2 ; S2按下,程序去执行RS2JNB P1.2, RS3 ; S3按下,程序去执行RS3JNB P1.3, RS4 ; S4按下,程序去执行RS4JNB P1.4, RS5 ; S5按下,程序去执行RS5JNB P1.5, RS6 ; S6按下,程序去执行RS6JNB P1.6, RS7 ; S7按下,程序去执行RS7JNB P1.7, RS8 ; S8按下,程序去执行RS8AJMP START ; 继续扫描按键………….RS1: AJMP PK1 ;RS2: AJMP PK2 ;RS3: AJMP PK3 ;RS4: AJMP PK4 ;RS5: AJMP PK5 ;RS6: AJMP PK6 ;RS7: AJMP PK7 ;RS8: AJMP PK8 ;AJMP START ; 无键按下,继续扫描…………………PK1: ……….. ;按键S1功能处理程序AJMP START ;处理S1按键后, 继续扫描PK2: ……….. ;按键S2功能处理程序AJMP START………………….PK8: ………………;按键S8功能处理程序AJMP START ; 处理S8按键后, 继续扫描优点: 连线简单,程序容易.缺点: 太浪费资源适用于按键较少、I/O口空闲的场合。
跟我学51单片机(四)——独立-矩阵键盘应用与设计
跟我学51单片机(四)——独立-矩阵键盘应用与设计
赵亮
【期刊名称】《电子制作》
【年(卷),期】2011(000)004
【摘要】@@ 上讲介绍并应用了单片机的串口通信,并给出了实例.从这一讲开始将介绍单片机的外围电路.这讲向大家介绍单片机外接键盘电路,通过该讲,读者可以掌握单片机外接键盘的工作原理从而实现电路与程序设计.
【总页数】4页(P75-78)
【作者】赵亮
【作者单位】
【正文语种】中文
【相关文献】
1.跟我学51单片机(一)——单片机最小系统组成与I/O输出控制 [J], 赵亮
2.跟我学51单片机(二)——单片机内部定时/计数器和中断系统 [J], 赵亮
3.跟我学51单片机(三)——单片机串口通信实例 [J], 赵亮
4.跟我学51单片机(五)——单片机动态扫描驱动数码管 [J], 赵亮
5.51单片机综合学习系统——矩阵键盘篇 [J], 徐纬
因版权原因,仅展示原文概要,查看原文内容请购买。
单片机独立式按键、矩形按键的应用-PPT精品文档
8
8.1.3.独立按键流程图与软件实现
开始 否
ORG LJMP ORG MAIN: MOV MOV CJNE LJMP L_PRESS:
0000H MAIN 0030H P1,#0FFH A,P1 A,#0FFH,L_PRESS MAIN DELAY20MS ;消抖 P1,#0FFH A,P1 A,#0FFH,L_TUREPRESS MAIN A,#11111110B KEY0 L_EXIT A,#11111101B KEY1 L_EXIT A,#11111110B KEY7 MAIN
计算行: 计算列:
行全部输出高电平,列全部输出低电平,读回数据,如果P1.0P1.3某行变为低电平就知道该行上面有按键。代码如左下: 行全部输出低电平,列全部输出高电平,然后读回来判断。如果 P1.4-P1.7某列变为低电平就知道该列上面有按键。代码如右下:
第八章
常规按键的应用
硅谷芯微 技术贡献 网址:threeway
键盘的分类
键盘分编码键盘和非编码键盘。键盘上闭合键的 识别由专用硬件编码器实现,并产生键编码号或 键值的称为编码键盘,如BCD码键盘、ASCLL码 键盘等;而靠软件来识别的称为非编码键盘;在 单片机组成的测控系统及智能化仪器中,用的最 多的是非编码键盘。 非编码键盘有分为:独立式非编码键盘和行列式 非编码键盘(矩阵键盘)。无论是何种按键,其 功能实现都是分为三个步骤:
有按键? 是 消抖
有按键? 是 按键1? 是 处理按键1
否
否
按键n? 是 按键n服务程序
否
LCALL MOV MOV CJNE LJMP L_TUREPRESS: CJNE LCALL LJMP CJNE LCALL LJMP ……….. CJNE LCALL L_EXIT: LJMP
基于MCS-51单片机的独立按键和矩阵按键检测实验
实验三基于MCS-51单片机的独立按键和矩阵按键检测实验一、支撑课程目标目标1:掌握微机和单片机的基本原理、编程技术、中断技术、系统扩展、定时器、串行接口和其他输入/输出接口技术,并且了解典型的单片机应用系统的设计思想和实现方法。
目标2:初步具备自行拟定实验步骤、检查和故障排除、分析和综合实验结果以及撰写实验报告的能力。
目标4:掌握MCS-51单片机/STM32F103单片机系统仿真工具和仿真流程,了解常用实验仪器、设备的基本工作原理,了解其正确使用方法,具备利用电子仪器设备和专业仿真软件对复杂工程问题进行分析和设计的能力。
二、实验类型:验证型( )、设计型(√)、研究创新型()三、预期学生学习的成果1、具有典型按键检测电路原理及消除抖动的必要性的认知。
2、理解程序设计消除抖动的实现过程。
3、掌握独立按键的程序查询检测编程实现。
4、掌握独立按键的中断检测编程实现。
5、理解矩阵键盘的行列扫描检测原理,具有矩阵键盘软硬件设计综合能力。
四、实验原理1、典型按键检测电路典型的按键检测电路具备检测按键的条件:检测引脚处在键按下前和后,要有电平变化,否则按键无法检测。
电路组成包括电源、上拉电阻、按键、接地组成,按下前,检测引脚高电平,按下后检测引脚低电平。
电阻防止按下电源短路,如图1(a)。
GND(a)(b)图 1 按键典型电路及对应检测电压2、按键抖动及消除如图1(b),理想条件下,按键未按下,在检测I/O端口是高电平,按下以后,检测I/O端口是低电平,手松后,按键弹起,检测I/O端口是高电平。
整个按键过程出现高电平到低电平又到高电平,有下降沿,也有上升沿。
实际过程中,由于人手的抖动,检测端电压如图1(c),检测电压出现“毛刺”抖动,假设单片机检测高电平阈值为VH,低电平阈值为VL,一次按键就会出现多次高电平到低电平变化,存在按键误检测可能。
常用消除办法之一:一旦检测到低电平,延迟u毫秒,u选择大于20,再次判断检测端是否是低电平,如果是,就判定为1次按键。
用51单片机制作ps2接口的工业小键盘
用51单片机制作ps2接口的工业小键盘经过我的验证,是完全可行的。
#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define SEM_FULL 1#define SEM_EMPTY 0uchar bdata ps2char;uchar bdata keystatus;uchar bdata parity_buf;uchar bdata s_buf,r_buf;uchar data last_s;sbit date=P3^0;sbit clock=P3^2;sbit key0=P2^0;sbit key1=P2^1;sbit key2=P2^2;sbit key3=P2^3;sbit key4=P2^4;sbit key5=P2^5;sbit key6=P2^6;sbit key7=P2^7;sbit s_buf0=s_buf^0;sbit r_buf7=r_buf^7;sbit parity_buf0=parity_buf^0;bit ps2_tx_sem=SEM_EMPTY;bit ps2_sendbyte(uchar c);void delayus(uchar us){while(--us);}void delayms(uchar ms){uchar i;while(ms--){for(i=0;i<120;i++);}}bit parity(){bit PARITY=1;uchar i;for(i=0;i<8;i++){PARITY^=parity_buf0;parity_buf=parity_buf>>1;}return PARITY;}void ps2_tx_sem_take(){ps2_tx_sem0:EA=0;if(ps2_tx_sem==SEM_FULL){EA=1;delayus(30);delayus(30);goto ps2_tx_sem0;}ps2_tx_sem=SEM_FULL;EA=1;return;}void ps2_tx_sem_give(){EA=0;ps2_tx_sem=SEM_EMPTY;EA=1;return;}void ps2_clk_check(){ps_tx_sem:EA=0;if(clock==0) // if PS2_CLK low, wait for 50us {EA=1;delayus(30);goto ps_tx_sem;}EA=1;return;}void ps2_send(uchar dat){ps2_tx_sem_take();ps2_clk_check();if(date==1)ps2_sendbyte(dat);ps2_tx_sem_give();}uchar ps2_recbyte() // Return receice data,Error return 0{uchar i;bit PARITY;r_buf=0;while(!clock); // Wait KBCLK Highdelayus(10);if(date) // KBDA TA shoud be low,mean received start bit{ps2_send(0xfe); // if KBDATA is High, return and send error status date(0xfe)return 0;}delayus(30);clock=0; // Device control the KBCLK signalfor(i=0;i<8;i++) // Rising edge of KBCLK, write data into r_buf7{delayus(30);clock=1;delayus(10);if(!clock) return 0; // if KBCLK pull down, mean Host cancelled this sendingr_buf7=date;if(i!=7)r_buf=r_buf>>1;delayus(10);clock=0;}delayus(30);clock=1;delayus(10);if(!clock) return 0; // if KBCLK pull down, mean Host cancelled this sendingPARITY=date; // Receive odd parity bitdelayus(10);clock=0;delayus(30);clock=1;delayus(10); // Receive Stop bit, should be highif(!date) // Otherwise,send error status date(0xfe){ps2_send(0xfe);return 0;}date=0; // Send ACK bit, mean have receive data done delayus(10);clock=0;delayus(30);clock=1; // Set KBCLK and KBDATA highdelayus(10);date=1;delayus(10);parity_buf=r_buf;if(PARITY==parity()) // Check Odd parity{return r_buf;}else{ps2_send(0xfe);return 0;}delayus(30);}bit ps2_sendbyte(uchar c) // Success return 1,Fail return 0{uchar i;bit PARITY;clock=1;if(!clock) // Host prevent Keyboard sending datareturn 0;parity_buf=c;PARITY=parity(); // Calculate value about sending data odd paritylast_s=c; // Save last sending datas_buf=c;if(!clock) // Host prevent Keyboard sending datareturn 0;if(!date) // Host prepared sending command data to keyboard return 0;date=0; // Falling edge of KBCLK send data, start bit 0 delayus(10);clock=0;for(i=0;i<8;i++) // First send LSB{delayus(10);clock=1;delayus(10);if(!clock) // if KBCLK is low,mean Hos prevent Keyboard sending datareturn 0;date=s_buf0;s_buf=s_buf>>1;delayus(10);clock=0;}delayus(10);clock=1;delayus(10);if(!clock) // if KBCLK is low,mean Hos prevent Keyboard sending datareturn 0;date=PARITY; // Sending odd parity bitdelayus(10);clock=0;delayus(10);clock=1;delayus(10);date=1; // Sending stop bitdelayus(10);clock=0;delayus(30);clock=1;delayus(30);delayus(10);return 1;}bit bat(){if(P2!=0xff)return 1;elsereturn 0;}void re_send ( ){ps2_send(last_s);}void reset(){date=1;while(!clock||!date); // Wait KBCLK and KBDATA highif(bat())ps2_send(0xfc); // Self-Check failedelseps2_send(0xaa); // Self-Check successed}bit Check_command ( ) // Keyboard receive host command,return 1 { clock=1;date=1;if(!clock&!date)return 1;elsereturn 0;}void receive_process(){uchar command;if(!Check_command()) return;command=ps2_recbyte();if(!command) return;switch(command){case 0xff: // reset commandps2_send(0xfa);reset();break;case 0xfe: // re-send commandps2_send(0xfa);re_send();break;case 0xf3: // Set Typematic Rate/Delayps2_send (0xfa);break;case 0xf2: // Read IDps2_send(0xfa);ps2_send(0xAB);ps2_send(0x83);break;case 0xee: // respond commandps2_send(0xee);case 0x00:ps2_send(0xfe);default:ps2_send(0xfa); // other command, just send a response of 0xFA break;}}void main(){P2=0xff;if(bat())ps2_send(0xfc);elseps2_send(0xaa);while(1){ if(Check_command())receive_process();key4=0;while(!key4){if(!key0){delayms(5);if(!key0){ps2_sendbyte(0x1C);delayms(5);ps2_sendbyte(0xF0);delayms(1);ps2_sendbyte(0X1C);while(!key0);}}else if(!key1){delayms(5);if(!key1){ps2_sendbyte(0x32);delayms(5);ps2_sendbyte(0xF0);delayms(1);ps2_sendbyte(0X32);while(!key1);}}else if(!key2){delayms(5);if(!key2){ps2_sendbyte(0x21);delayms(5);ps2_sendbyte(0xF0);delayms(1);ps2_sendbyte(0X21);while(!key2);}}else if(!key3){delayms(5);if(!key3){ps2_sendbyte(0x23);delayms(5);ps2_sendbyte(0xF0);delayms(1);ps2_sendbyte(0X23);while(!key3);}}else key4=1;}key5=0;while(!key5){if(!key0){delayms(5);if(!key0){ps2_sendbyte(0x24);delayms(5);ps2_sendbyte(0xF0);delayms(1);ps2_sendbyte(0X24);while(!key0);}}else if(!key1){delayms(5);if(!key1){ps2_sendbyte(0x2B);delayms(5);ps2_sendbyte(0xF0);delayms(1);ps2_sendbyte(0X2B);while(!key1);}}else if(!key2){delayms(5);if(!key2){ps2_sendbyte(0x34);delayms(5);ps2_sendbyte(0xF0);delayms(1);ps2_sendbyte(0X34);while(!key2);}}else if(!key3){delayms(5);if(!key3){ps2_sendbyte(0x33);delayms(5);ps2_sendbyte(0xF0);delayms(1);ps2_sendbyte(0X33);while(!key3);}}else key5=1;}key6=0;while(!key6){if(!key0){delayms(5);if(!key0){ps2_sendbyte(0x43);delayms(5);ps2_sendbyte(0xF0);delayms(1);ps2_sendbyte(0X43);while(!key0);}}else if(!key1){delayms(5);if(!key1){ps2_sendbyte(0x3B);delayms(5);ps2_sendbyte(0xF0);delayms(1);ps2_sendbyte(0X3B);while(!key1);}}else if(!key2){delayms(5);if(!key2){ps2_sendbyte(0x42);delayms(5);ps2_sendbyte(0xF0);delayms(1);ps2_sendbyte(0X42);while(!key2);}}else if(!key3){delayms(5);if(!key3){ps2_sendbyte(0x4B);delayms(5);ps2_sendbyte(0xF0);delayms(1);ps2_sendbyte(0X4B);while(!key3);}}else key6=1;}key7=0;while(!key7){if(!key0){delayms(5);if(!key0){ps2_sendbyte(0x3A);delayms(5);ps2_sendbyte(0xF0);delayms(1);ps2_sendbyte(0X3A);while(!key0);}}else if(!key1){delayms(5);if(!key1){ps2_sendbyte(0x31);delayms(5);ps2_sendbyte(0xF0);delayms(1);ps2_sendbyte(0X31);while(!key1);}}else if(!key2){delayms(5);if(!key2){ps2_sendbyte(0x44);delayms(5);ps2_sendbyte(0xF0);delayms(1);ps2_sendbyte(0X44);while(!key2);}}else if(!key3){delayms(5);if(!key3){ps2_sendbyte(0x4D);delayms(5);ps2_sendbyte(0xF0);delayms(1);ps2_sendbyte(0X4D);while(!key3);}}else key7=1;}}}。
51单片机-独立按键
查询方式
单片机不断的扫描键盘判断按键是否动作 特点:硬件简单,但需要单片出中断请求,单片机响应中断请求后转按键 识别程序
特点:硬件复杂,需要中断电路,但不占用CPU资源
单片机处理按键的流程
单片机处理按键动作需要以下步骤:
按键识别
单片机在识别按键时,IO口工作在输入状态:
按键弹起,IO口电平5V
Vcc
按键按下,IO口电平0V
单片机读取IO口的状态
即可知按键的状态
单片机
按键抖动
实际的按键在被按下或抬起时,由于机械 触点的弹性作用,在闭合或断开的瞬间均伴随有 一连串的抖动现象。
理想波形
实际波形
按下抖动
稳定闭合
释放抖动
完整的按键过程包括: 1. 释放状态 2. 按下抖动阶段 3. 完全按下状态 4. 释放抖动阶段 5. 释放状态
按键防抖
防抖措施:
硬件防抖
在按键输出端加RS或施密特触发器 去抖效果好、电路复杂、成本高
软件防抖
利用软件进行延时(10ms) 电路简单、成本低、但占用CPU时间
键盘的工作方式
判断按键是否按下 按键按下时的防抖 识别哪个按键按下,判断键值 判断按键是否放开 送出键值,处理按键动作
练习:单片机按键查询操作,8个按键对应8个LED灯, K1对应D1,K2对应D2,K3对应D3,……,查询按键, 按下某一个按键后对应的LED亮起,再按一次关闭。
利用51单片机,8个按键,8路发光二级管构成一个独立式键盘系统,按下8个按键,点亮对应的灯。
电子信息工程学院电子设计应用软件训练任务【训练任务】:1、熟练掌握PROTEUS软件的使用;2、按照设计要求绘制电路原理图;3、能够按要求对所设计的电路进行仿真;【基本要求及说明】:1、按照设计要求自行定义电路图纸尺寸;2、设计任务如下:利用51单片机,8个按键,8路发光二级管构成一个独立式键盘系统,按下8个按键,点亮对应的灯。
3、按照设计任务在Proteus 6 Professional中绘制电路原理图;4、根据设计任务的要求编写程序,在Proteus下进行仿真,实现相应功能。
【按照要求撰写总结报告】指导教师年月日负责教师年月日学生签字年月日成绩评定表电子设计应用软件训练总结报告一.任务说明本次任务是利用51单片机、按键以及发光二极管设计一个独立式键盘系统,要求独立简单可控。
首先要明确51单片机的工作原理,在此基础上编写单片机程序,再载入到所连电路原理图中实现按键控制二极管亮灭。
此次任务需要完成电路原理图的绘制、单片机汇编语言的编程。
目的是通过本次设计熟悉Proteus软件的工作环境,掌握基本的操作及流程以及对单片机汇编语言的进一步学习,使之前的学习得到巩固。
二.原理图绘制说明总体而言,一个完善的系统最重要的是稳定,精确,设计简单,修护容易,成本低,体积小。
满足以上条件的系统我们都可以说是完善的系统。
因此,我在设计中选用了一些比较成熟的器件,这些器件都经过时间的考验,能稳定的工作,同时,价格也相对便宜。
下面对原理图中主要的硬件进行简单介绍。
2.1 AT89C51的基本概述AT89C5l单片机,是一种低功耗、高性能的、片内含有4KB Flash ROM的8位CMOS 单片机,工作电压范围为2.7~6V(实际使用+5V供电),8位数据总线。
它有—个可编程的全双工串行通信接口,能同时进行串行发送和接收。
AT89C51具有4K并行可编程的非易失性FLASH程序存储器,可实现对器件串行在系统编程ISP和在应用中编程(IAP)。