单片机独立式键盘
单片机独立按键识别实验报告

桂林电子科技大学
实验报告
2016-2017 学年第一学期
开课单位海洋信息工程学院
适用年级、专业 14级机械设计制造及其自动化
课程名称《单片微型计算机与接口技术-课内实验》
主讲教师周旋
课程序号 BS1615000_03
课程代码 BS1615000 实验名称《独立按键识别》
学号 1416010516 - 17 姓名林亦鹏卢炳荣
独立按键识别实验报告
电路采用无源蜂鸣器,从P1.5口形成脉冲来驱动。
因为单片机开机初始化瞬间,其I/O口为高电平,会有误响动作。
单片机的独立键盘使用的是P1口。
当有键按下时,P1口相应位为低电平。
、查找资料说明按键抖动的原因。
、延时程序是怎么实现延时的?
定义蜂鸣器的连接端口--//。
单片机课程设计例题8-独立式小键盘输入

Vcc
P口
图437 独立式键盘结构图
4.程序设计
(1)流程图
开始 开始
键盘扫描函数 mark=01 ? Y mark=02 ? Y mark=03 ? Y LED点亮左移函数 点亮左移函数
有键按下? Y 延时 键释放? Y 置标志位 mark N LED闪烁函数 闪烁函数 结束 N
N
N
LED点亮右移函数 点亮右移函数
n n n n n n n n n n n n n n n n
void main(void) //主函数 { do { switch (key_scan()) { case 0: break; case 1:Led_left(); break; case 2:Led_right(); break; case 3:Led_flash(); break; } }while(1); //循环 }
n n n n n n n n n n n
void Led_right(void)//按键SW2,LED点亮右移函数 { unsigned char i,j=0x7F; for (i=0;i<8;i++) { P1=j ; delay() ; j=(j>>1); j=j|0x80; } }
n
void delay(void) //延时0.5s n { n unsigned int i,j; n for (i=0;i<500;i++) n for (j=0;j<120;j++); for (j=0;j<120;j++); n }
n
n n n n n n n n n n n n n n
4.3 单片机键盘接口电路设计

//函数功能:键盘扫描 //检测到有键按下 //延时10ms再去检测 //按键k1被按下 //按键k2被按下 //按键k3被按下 //按键k4被按下
▲▲▲
独立式键盘接口设计案例
void forward(void) { P3=0xfe; led_delay(); P3=0xfd; led_delay(); P3=0xfb; led_delay(); P3=0xf7; led_delay(); P3=0xef; led_delay(); P3=0xdf; led_delay(); P3=0xbf; led_delay(); P3=0x7f; led_delay(); }
break;
}
}
}
▲▲▲
独立式键盘接口设计案例
void key_scan(void) { P1=0xff; if((P1&0x0f )!=0x0f ) { delay10ms(); if(S1==0) keyval=1; if(S2==0) keyval=2; if(S3==0) keyval=3; if(S4==0) keyval=4; }
//处理按下的k1键,“……”为处理程序 //跳出switch语句 //处理按下的k2键 //跳出switch语句 //处理按下的k3键 //跳出switch语句 //处理按下的k4键 //跳出switch语句 //处理按下的k5键 //跳出switch语句
独立式键盘接口设计案例
1.独立式键盘的查询工作方式
{
case 1:forward(); //键值为1,调用正向流水点亮函数
break;
case 2:backward(); //键值为2,调用反向流水点亮函数
break;
case 3:Alter(); //键值为3,调用高、低4位交替点亮函数
单片机课程设计报告

中州大学工程技术学院单片机课程设计说明书课题名称秒表专业机械制造与自动化学生XX 马振杨班级机制一班学号7指导教师沈娣丽完成日期2013年9月25日目录摘要 (1)一.系统设计要求 (2)二.设计思路分析 (2)三.秒表电路原理图设计 (2)3.1系统总电路图 (2)3.2时钟电路设计 (3)3.3 输入模块电路设计 (3)3.4显示模块电路设计 (3)四.系统硬件电路设计 (3)4.1秒表显示模块 (4)4. 2控制器模块单片机的选择 (4)4. 3键盘的选择 (5)五.简易秒表软件系统设计 (6)5.1定时模块 (6)5.2 主程序流程图 (8)六.系统的调试 (8)七.心得体会 (11)八.参考文献 (12)摘要单片机在日用电子产品中的应用日益广泛,单片机控制秒表是基于单片机技术、模拟电子技术、数字技术为一体的机电一体化高科技产品,具有功耗低、平安性高使用方便等优点。
秒表是人们日常生活中常常需要用到的一种工具。
本文采用AT89S51单片机从硬件和软件两方面介绍了一款简易的秒表设计过,并对硬件原理图和程序流程图作了简洁的描述。
关键字:单片机AT89C51,LED,秒表,计数器引言:随着单片机技术的不断开展,单片机在日用电子产品中的应用越来越广泛,而本文设计并制作了一款基于AT89C51的3位数码管显示的秒表,其电路简单,软硬件构造模块化,易于实现。
产品和技术革新的日新月异都让人非常惊讶。
在电子科学技术高速开展的今天,高科技产品越来越多的应用在我们的日常生活中,给我们的生活带来了非常大的方便,每时每秒我们都能感受到产品的更新换代。
像平常我们工作所用的电脑、手机和生活所用的电视机,收音机,Mp3等等,这些高科技产品给我们带来了极大的方便,但这要归功于科学技术的高速开展。
一、设计要求⑴硬件设计:根据任务要求,完成单片机最小系统及其扩展设计。
⑵软件设计:根据硬件设计完成显示功能要求,完成控制软件的编写与调试;⑶功能要求:用S1启动秒表和停顿秒表,S2键将秒表归零,按一下S1,即开场定时,在数码管上每秒加1,加到60,归零。
单片机键盘显示实验报告

单片机的键盘和显示实验报告㈠实验目的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从上面的结果可以看出,本次实验基本完成了实验要求。
独立键盘电路

2
键盘是单片机不可缺少的输入设备,在单片机应用系统中,常使用按键或者键盘 控制系统的工作状态或向系统内部输入数据。
全编码键盘 键盘
非编码键盘
独立式键盘 矩阵式键盘
1.综述
3
➢ 编码键盘:键盘闭合键的识别由专用硬件实现。
➢ 非编码键盘:键盘闭合键的识别由软件实现。
当松开按键后,线路断开,无电流流过,此时KeyIn1和+5V是等电位,为高 电平。
这样我们就可以通过KeyIn1这个接口的电平高低来判断是否有按键按下。
2.独立键盘电路
6
独立式按键程序查询方式和中断方式的接口电路
2.独立键盘电路
4
独立式键盘就是各个按键相互独立,每一个按键各接一根I/O接口线,彼此独立, 单片机通过向此I/O口发出读指令来得到当前按键的状态。原理图如图1所示。
图1 独立键盘电路原理图
2.独立键盘电路
5
工作原理:
4条输入线接到单片机的I/O口上,当按键K1按下时,+5V电源通过R1和K1进 入GND形成一条通路,此时全部电压都加到了电阻R1上,从而导致KeyIn1引脚为 低电平;
非编码键盘结构简单,成本低廉,在单片机中得到广泛应用。
➢ 独立式键盘特点:电路配置灵活,软件结构简单,但每个按键必须占用一根 I/O线,占用硬件资源较多,因此适用于按键比较少的场合。
➢ 矩阵式键盘特点:矩阵式键盘的按键设置在行、列的交叉点上。键盘中按键数 量较多时,为了减少I/O口的占用,通常采用矩阵式键盘。
单片机控制系统按键的类型

012 3 0
456 7 1
8 9 10 11 2
12 13 14 15 3
0 123
图7.5 矩阵式键盘结构
+5 V
矩阵式键盘中,行、列线分别连接到按键开关的两 端,行线通过上拉电阻接到+5V上。当无键按下时,行 线处于高电平状态;当有键按下时,行、列线将导通, 此时,行线电平将由与此行线相连的列线电平决定。这 是识别按键是否按下的关键。然而,矩阵键盘中的行线、 列线和多个键相连,各按键按下与否均影响该键所在行 线和列线的电平,各按键间将相互影响,因此,必须将 行线、列线信号配合起来作适当处理,才能确定闭合键 的位置。
图7.8是一种简易键盘接口电路,该键盘是由8051 P1口 的高、低字节构成的4×4键盘。键盘的列线与P1口的高4位 相连,键盘的行线与P1口的低4位相连,因此,P1.4P1.7是 键输出线,P1.0P1.3是扫描输入线。图中的4输入与门用于 产生按键中断,其输入端与各列线相连,再通过上拉电阻接 至+5 V电源,输出端接至8051的外部中断输入端。
2. 矩阵式键盘按键的识别 识别按键方法很多,其中最常见的方法是扫描法。下 面以图7.5中8号键的识别为例来说明扫描法识别按键的过程。 按键按下时,与此键相连的行线与列线导通,行线在 无键按下时处在高电平。显然,如果让所有的列线也处在 高电平,那么,按键按下与否不会引起行线电平的变化, 因此,必须使所有列线处在低电平。只有这样,当有键按 下时,该键所在的行电平才会由高电平变为低电平。CPU 根据行电平的变化,便能判定相应的行有键按下。8号键按 下时,第2行一定为低电平。然而,第2行为低电平时,能 否肯定是8号键按下呢?
(3) 求按键位置。根据前述键盘扫描法,进行逐 列置0扫描。图7.6中,32个键的键值分布如下(键值 由4位十六进制数码组成,前两位是列的值,即A口数 据,后两位是行的值,即C口数据,X为任意值):
单片机原理及接口技术第5章 IO口应用-显示与开关键盘输入

图5-1
发光二极管与单片机并行口的连接
5
如果端口引脚为低电平,能使灌电流Id从单片机的外部流入内部,则将
大大增加流过的灌电流值,如图5-1(b)所示。所以,AT89S51单片机任 何一个端口要想获得较大的驱动能力,要采用低电平输出。 如果一定要高电平驱动,可在单片机与发光二极管之间加驱动电路,如 74LS04、74LS244等。 5.1.2 单片机I/O端口控制发光二极管的编程 发光二极管与单片机的I/O端口的连接,如图5-1(b)所示。如要点亮 某发光二极管,只需该I/O端口位写入“0”即可。下面通过一个例子介绍如
21
图5-6 4位LED静态显示的示意图
示字符。这样在同一时间,每一位显示的字符可以各不相同。但是,静态
显示方式占用I/O口线较多。 对于图5-6所示电路,要占用4个8位I/O口(或锁存器)。如果数码管 数目增多,则还需要增加I/O口的数目。在实际的系统设计中,如果显示位 数较少,可采用静态显示方式。但显示位数较多时,为了降低成本,一般 采用动态显示方式。 2. 动态扫描显示方式 显示位数较多时,静态显示所占用的I/O口多,为节省I/O口与驱动电路
单片机控制的8位I/O口锁存器输出相连。如果送往各个LED数码管所显示字 符的段码一经确定,则相应I/O口锁存器锁存的段码输出将维持不变,直到
送入下一个显示字符的段码。因此,静态显示方式的显示无闪烁,亮度较
高,软件控制比较容易。 图5-6所示为4位LED数码管静态显示电路,各个数码管可独立显示,
只要向控制各位I/O口锁存器写入相应的显示段码,该位就能保持相应的显
闭合时,P3.0引脚为低电平。单片机对开关状态的检测是由程序检测
10
图5-3
开关、LED发光二极管与P1口的连接
单片机实验五报告_单片机键盘实验

单片机实验五报告_单片机键盘实验一、实验目的本次单片机键盘实验的主要目的是让我们深入了解单片机与键盘的接口技术,掌握如何通过编程实现对键盘输入的检测和响应,从而提高我们在单片机应用开发中的实际操作能力。
二、实验原理在单片机系统中,键盘通常是作为输入设备使用的。
常见的键盘有独立式键盘和矩阵式键盘两种类型。
独立式键盘是每个按键单独占用一根 I/O 线,其优点是电路简单,编程容易,但缺点是占用较多的 I/O 口资源。
矩阵式键盘则是将按键排列成矩阵形式,通过行线和列线的交叉来识别按键。
这种方式可以有效地节省 I/O 口资源,但电路和编程相对复杂一些。
在本次实验中,我们采用了矩阵式键盘。
其工作原理是通过逐行扫描或者逐列扫描的方式,检测行线和列线的电平状态,从而确定按下的按键。
三、实验设备及材料1、单片机开发板一块2、计算机一台3、编程软件(如 Keil C51)4、下载工具(如 STCISP)四、实验步骤1、硬件连接将矩阵式键盘与单片机的 I/O 口进行连接,注意行线和列线的对应关系。
连接好电源和地线,确保硬件电路正常工作。
2、软件编程打开编程软件,创建一个新的工程。
编写初始化程序,包括设置 I/O 口的工作模式、中断等。
编写键盘扫描程序,通过循环扫描行线和列线的电平状态,判断是否有按键按下。
当检测到按键按下时,根据按键的编码执行相应的操作,如在数码管上显示按键值、控制 LED 灯的亮灭等。
3、编译和下载对编写好的程序进行编译,检查是否有语法错误。
如果编译成功,使用下载工具将程序下载到单片机中。
4、实验调试观察硬件电路的工作状态,看是否有异常现象。
按下不同的按键,检查程序的响应是否正确。
如果出现问题,通过调试工具(如单步调试、断点调试等)查找并解决问题。
五、实验代码以下是本次实验的部分关键代码:```cinclude <reg51h>//定义键盘的行和列define ROW_NUM 4define COL_NUM 4//定义行线和列线的端口sbit ROW1 = P1^0;sbit ROW2 = P1^1;sbit ROW3 = P1^2;sbit ROW4 = P1^3;sbit COL1 = P1^4;sbit COL2 = P1^5;sbit COL3 = P1^6;sbit COL4 = P1^7;//定义按键值的编码unsigned char code KeyCodeMapROW_NUMCOL_NUM ={{'1','2','3','A'},{'4','5','6','B'},{'7','8','9','C'},{'','0','','D'}};//键盘扫描函数void KeyScan(){unsigned char i, j, temp;unsigned char keyValue = 0;//逐行扫描for (i = 0; i < ROW_NUM; i++){//先将所有行线置高电平ROW1 = ROW2 = ROW3 = ROW4 = 1;//将当前行线置低电平switch (i){case 0: ROW1 = 0; break;case 1: ROW2 = 0; break;case 2: ROW3 = 0; break;case 3: ROW4 = 0; break;}//读取列线的电平状态temp = COL1 | COL2 | COL3 | COL4;//如果有列线为低电平,则表示有按键按下if (temp!= 0xF0){//延迟去抖动delay_ms(10);//再次读取列线的电平状态temp = COL1 | COL2 | COL3 | COL4; if (temp!= 0xF0){//确定按下的按键for (j = 0; j < COL_NUM; j++){if ((temp &(1 << j))== 0){keyValue = KeyCodeMapij;break;}}//执行相应的操作switch (keyValue){case '1'://具体操作break;case '2':break;//其他按键的操作}}}}}//主函数void main(){while (1){KeyScan();}}```六、实验结果及分析在实验过程中,我们成功地实现了对矩阵式键盘的输入检测,并能够根据不同的按键执行相应的操作。
独立键盘检测

独立键盘检测
单片机检测按键的原理:我们把按键的一端接地,另一端与单片机的I/O口相连,开始时先给该I/O口赋一高电平,然后让单片机不断地检测该I/O口是否变成低电平,当按键闭合时,即相当于该I/O口通过按键与地相连接,变成低电平,程序一旦检测到I/O口变为低电平则说明按键被按下,然后执行相应的指令。
实际波形在按下和释放的过程中都存在抖动现象,抖动时间长短和按键的机械特性有关,一般为5~10ms通常我们手动按下键然后立即释放,这个动作中稳定闭合的时间超过20ms。
因此单片机在检测键盘是否按下时要加上去抖延时。
延时去抖程序段举例:
if(key==0)
{
delay(10);
if(key==0)
{
num=0;
while(!key)
}
}
其中,delay(10)是去抖延时。
在确认按键被按下后,while(!key)是等待按键释放。
矩阵键盘检测
与独立键盘检测原理不同的是,矩阵键盘两端都与单片机I/O口相连,因此在检测时先送一列为低电平,其余几列为高电平然后立即检测一次各行是否有低
电平,若检测到某一行为低电平,则可确认被按下的按键是哪一行哪一列的。
矩阵键盘的4行分别与单片机的P3.0~P3.3相连,矩阵键盘的4列分别与单片机的P3.4~P3.7相连。
单片机IO口应用及键盘实验4-1

其他:
通道0作为I/O输出时,需要上拉电阻。驱动 MOS电路时,阻值为4.7K欧姆,驱动LED 显示器时为470欧姆;
通道0作为数据/地址线工作时,不需要上拉 电阻;
并口输出应用举例
VCC
R
VCC 220
2k Px.x
OUT LED
继电器
2 键盘扩展原理
消除键抖:JNB P口,分支
延迟程序
JB
P口,分支
按下一次键,在很短时间内弹起,算一次键抖
K3,K4处理程序结构
按键按下 消抖
寄存器加一/减一
寄存器判断
没有达到要求, 寄存器值赋值给A
达到要求, 寄存器值修改, 再把值送入A
查表显示
逻辑分析
先制一张表,表里面放入要显示的数值0~9共 十个数,表中数值地址也为0~9
KeyDown: CLR UpDown ;第四个键按下后的处理 KEY_RET: RET
采用中断方式 ?如何编程?
3 键盘实验(独立键盘)
键盘硬件连接如图 实验要求: 编写程序实现: 1)按K1,数码管显示0;按K2,数码管显示9 2)按K3,数码管当前数值加一 按K3,数码管当前数值减一
键盘的按键有触点式和非触点式 ; 按键开关的抖动问题 数字、功能、命令 键号、键值 重键
图2
键盘
键盘的类型: 独立式 行列式(或矩阵式) 键盘的工作方式 编程扫描(查询法) 定时扫描 中断
键盘和单片机的连接
和I/O相连:将每个按键的一端接到单片机的I/O口,另 一端接地,如图3所示是实验板上按键的接法,四个 按键分别接到P3.0 、P3.1、P3.2和P3.3
单片机I/O口应用及键盘实验
用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;}}}。
实验五:独立式键盘实验

实验五:独立式键盘实验4.5.1 实验目的1. 掌握单片机独立键盘接口设计方法。
2. 掌握单片机键盘扫描程序设计方法。
3. 掌握按键功能设计方法。
4. 掌握软件消除按键抖动方法。
4.5.2 实验预习1.熟悉Keil集成编译环境的使用方法。
2. 复习单片机C语言程序设计方法。
3. 复习独立键盘工作原理。
4. 复习按键去抖动方法。
4.5.3 实验原理实验板上提供4个独立按键,与单片机接口如图4.5.1所示,每个按键单独接单片机一个I/O接口。
只要将相应端口设为1,然后判断端口状态,如果仍为1,则按键处于断开(释放)状态,如果为0,则按键处于接通(闭合)状态。
图4.5.1 独立键盘电原理图4.5.4 预作实验任务1. 用Proteus仿真软件绘制独立键盘电路图,包括如图4.5.1所示键盘接口,单片机最小系统以及数码管动态显示电路。
2. 简述按键识别过程中如何等待按键释放。
3. 简述按键抖动对单片机系统工作性能的影响,并简介消除按键抖动的方法。
4. 编写按键识别函数,要求正确识别4个按键的状态,如果有按键按下则返回键值,从左到右四个键值分别为1~4。
并通过仿真或实验板验证(要求用软件的方法消除按键抖动)。
5.为实验板上4个按键设定不同的功能,在数码管上显示数字128,4个按键按下后分别对显示的数字做如下修改:key1:数字+1;key2:数字-1;key3:数字+10;key4:数字-10;流程图如图4.5.2所示,试设计完整程序(按键识别子程序KEYSCAN和动态显示子程序DISPLAY可直接调用这里省略)。
图4.5.2 按键功能设计流程图4.5.5 实验任务1.开机时数码管显示1002.按键key1一次数字加1,按键key2一次数字减1。
加到999时再加1归零,减到000时再减1得999。
3.按住键key3不放实现连加功能,每0.2s加1。
4.按住键key4不放实现连减功能,每0.2s减1。
4.5.6 实验步骤1.分析题意,确定算法,绘制主程序流程图。
51单片机学习之5-独立按键和矩阵键盘

51单片机学习之5-独立按键和矩阵键盘
第14集
键盘的原理
键盘分编码键盘(例如电脑键盘)和非编码键盘(自己用程序去识别)。
非编码键盘分:独立式非编码键盘(独立按键)、行列式非编码键盘(4*4阵列键盘)
独立键盘的电路图。
因为51单片机的IO口不是双向口而是准双向口,要让IO口具备输入功能,必须将IO口置1,置1之后当按键按下时IO口的电平会被拉低,即被置0。
当检测到IO口为0时即可判断该按键已经按下。
按键按下时会有一个抖动的
过程(弹片会抖动),由于单片机检测IO口速度非常快,超过弹片抖动的频率,所以当单片机检测到IO口为0时需延时一小段时间再检测IO是否为0,如果仍为0就确认该按钮被按下。
因为IO口里面有上拉电阻,所以当松开按钮时,IO口又被拉高。
例程:
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitKey=P3;//按键
sbitLed=P1;//Led灯
voiddelay(uintz);
/********主函数********/
voidmain()。
利用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)。
单片机应用技术项目化教程 09第九章 项目五键盘

只有一个数码管是亮的),利用人眼的
视觉暂留现象(也叫余晖效应)。
数码管动态显示秒表流程图
数码管消隐
• 产生背景:
•
数码管位选切换过渡阶段造成的
段选的瞬态显示。
• 解决方法:
•
切换之前关闭位选或者段选,切
换后一次性打开。
switch语句的用法
• switch(表达式) •{
– case 常量表达式1: 语句1; – case 常量表达式2: 语句2; – ... ... – case 常量表达式n: 语句n; – default : 语句n+1; •}
任务一:按下按键,对应的LED灯亮
1.注释; 2.电路改变 3.加以变化
任务二:独立按键识别
【要求】采用独立按键方式实现下述功能:开机时LED全熄, 然后根据按键动作使相应灯亮,并将亮灯保持到按压其它键 时为止。
做输入, 先写1
任务三:键控流水灯
【要求】 K1为“启动键”,按压K1可产生“自下向上” 的流水灯运动; K2 为“方向键”,按压K2可产生“自下向上”运动。
+5V
无抖动
理想波形
图为键闭合时列线电压波形。键闭合和断开过程中A 存在抖动
实际波形
B
期(呈现一串负脉冲),按抖下抖动 动时稳 间定闭 长合短与释放抖 开动 关的机械特+性5V 有关有抖 ,动 一
般为5~10 ms之间;稳定闭合期由操作员的按键动作所确定,
一般为数百毫秒到几秒。为了保证CPU对键的闭合做一次处理,
用时分配内存单元,调用结束释放内存。 • 2、实参可以是常量,也可以是简单或者复杂的表达式,但是要求
必须有确定的值,在调用时传递给形参。 c = add(1,a+b);
单片机系统键盘的设计小结

非 编码 键 盘 : 只简 单地 提 供键 盘 的 行列 与 矩 阵 , 他 操 作 如 其 键 的识别 , 决定 按 键的 读数 等仅 靠 软件 完成 , 故硬 件较 为简 单 , 但
占用 C U较 多时 间 。有 : P 独立 式按 键结 构 、 矩阵 式按键 结 构 。
响 的 软 件措 施 是切 实 可行 的 。)
务 繁重 之情 况 . 用 8 7 采 2 9可 编 程键 盘 管 理 接 口芯 片 构 成 编 码 式 键 盘 系统 是 很 实 用 的方 案 。
这 种 方法 只适 用 于 键 的 数 目较少 的情 况 。
软 件 消 抖 : 果 按 键 较 多 , 件 消抖 将 无 法 胜 任 , 采 用 如 硬 常
(. 阳 东软 派 斯 通 医疗 系统 有 限公 司 , 宁 沈 阳 10 7 ; 1沈 辽 1 19 2内蒙 古 西部 天 然 气 股份 有 限公 司 , . 内蒙 古 鄂 尔 多斯 0 70 ) 10 0
【 摘 要 】 文章介 绍 了单片机键盘 的设计要求和工作原理 , 并结合开发过程 , 讨论分析 了键盘的分类、 结构、 功能特点以及 应用
对 按 键释 放 的处 理 . 了消 除连 击 , 得 一次 按 键 只产 生 一次 键 为 使 功 能 的执 行 ( 管 一次 按 键持 续 的 时 间多 长 , 不 仅采 样 一个 数 据 ) 。 否 则的话 , 功 能程 序 的执 行 次数 将 是 不 可预 知 , 按键 时 间决 键 由 定 连 击 是 可以利 用的 。 连击 对 于用计 数 法设 计 的多功 能 键特别
软 件 消抖 。 常 采 用 软 件 延 时 的方 法 : 第 一 次检 测 到 有 键 按 通 在 下 时 , 行 一段 延 时 1ms 子 程 序 后 , 确 认 电平 是 否 仍 保 执 0 的 再
独立键盘和矩阵键盘-PPT

图8.2 矩阵式键盘接口
特点:电路连接复杂,但提高了 I/O口利用率,软件编程较复 杂。适用于需使用大量按键 得场合。
U1
P10 1 P11 2 P12 3 P13 4 P14 5 P15 6 P16 7 P17 8
P10 P11 P12 P13 P14 P15 P16 P17
P00 P01 P02 P03 P04 P05 P06 P07
设第2行第 4列键按下
89C51 P1.0 P1.1 P1.2 P1.3 P1.4 11 11 11 1011 P1.5 P1.6 P1.7
+5V
101 110 110 01
行线输出 列线输入
0111 1011 1101 1110
1111 1110 1111 1111
(2)线反转法。 线反转法也就是识别闭合键得一种常用方法, 该 法比行扫描速度快, 但在硬件上要求行线与列线外 接上拉电阻。 先将行线作为输出线, 列线作为输入线, 行线输出 全“0”信号, 读入列线得值, 那么在闭合键所在得列 线上得值必为0;然后从列线输出全“0”信号,再读取 行线得输入值,闭合键所在得行线值必为 0。这样, 当一个键被按下时, 必定可读到一对唯一得行列值。 再由这一对行列值可以求出闭合键所在得位置。
独立键盘和矩阵键盘
通常,键盘有编码与非编码两种。编码键盘通过 硬件电路产生被按按键得键码与一个选通脉冲。选 通脉冲可作为CPU得中断请求信号。这种键盘使用 方便,所需程序简单,但硬件电路复杂,常不被单片机采 用。
非编码键盘按组成结构又可分为独立式键盘与 矩阵式键盘。独立式键盘得工作过程与矩阵式键盘 类似,无论就是硬件结构还就是软件设计都比较简单,。
…… else if (表达式n-1) (语句n-1;) else {语句n}
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
四、软件设计 1-流程图
B口初始化 D口初始化
B口初始化 D口初始化
读取B口状态; 向D口输出;
若B0=0; PORTD
=~0x01; …… …… 若B7=0; PORTD
=~0x80;
7
四、软件设计 2-代码1
#include "iom48v.h"
void io_init(void) { /*IO口初始化函数*/ DDRB = 0x00; //方向输入 PORTB = 0xFF; //打开上拉 DDRD = 0xFF; //方向输出 PORTD = 0xFF; //高电平
} if ((PINB & 0x08)==0) PORTD=~(0x08);
}
if ((PINB & 0x10)==0) PORTD=~(0x10);
if ((PINB & 0x20)==0) PORTD=~(0x20);
if ((PINB & 0x40)==0) PORTD=~(0x40);
if ((PINB & 0x80)==0) PORTD=~(0x80);
单片机原理与 接口技术
广州大学自动化系 肖忠
1
一、设计目标
任务二:独立式键盘
(一个按键对应一个LED,按 下一个键,对应的LED灯亮)
2
二、典型硬件电路
3
二、典型硬件电路
4
三、知识点 1-按键电路
启用
X
5
三、知识点 2-寄存器设置
1、D口为输出, 初态为高; DDRD = 0xFF; PORTD=0xFF; 2、B口为输入, 设置内部上拉; DDRB = 0x00; PORTB=0xFF;
9
五、电路仿真
10
六、实物演示
11
七、作业
1、制作独立式按键实验电路模块;
2、实现任务二的功能;
3、实现另一种功能:即一个按键对应控 制一个LED灯,按一次点亮,再按一次 熄灭;
12
附:电路图
13
本次课所学知识
• IO端口----输入、输出、第二功能 • 定时器----普通、CTC、PWM • 中 断----定时器中断、外部中断 • 其 它----AD、USART、SPI、
比较器
14
课后复习
• 数据手册:P58~74 • 教材:P59~61
15
下一讲的主要内容
• AVR的内核、体系、存储结构 • 中断向量表 • 时钟系统与熔丝位
16
}
8
四、软件设计 2-代码2
void main(void) {
unsigned char i;
io_init();
while (1) {
iif (=(PPINIBN&B0;x01)=B & 0x02)==0) PORTD=~(0x02);
iPf (O(PIRNBTD& 0=x04i)=;=0) PORTD=~(0x04);