8051硬件实验5 键盘接口实验
单片机IO口应用及键盘实验5

(2007H)= 43H
2 查表和散转程序的编写与应用
查表:常用于特殊的数据译码和转换 MOVC A,@A+DPTR 查表指令 MOVC A,@A+PC 散转:程序的分支 JMP @A+DPTR
查表举例
TAB1:
DB 0C0H,0F9H,
指令MOV A,@A+DPTR和 MOV A,@A+PC
使用符号常量的优点可改善程序的可读性,它 的定义需要使用伪操作命令“EQU”或 “= ” 。
赋值命令
EQU 赋值命令。定义变量地址或者常数名称。 格式: 字符名称 EQU (数或汇编符号) 赋值后的符号名称可做:数据地址\代码地址\代
码地址\立即数\寄存器名 例如:
ABC EQU 30H ABC EQU R7 不能重名定义
SERCH1: MOV A,BUFF
DB 0A4H ,0B0H, DB 099H,092H,082H DB ,0F8H,080H,090H 表格中依次定义了从“0~
9”的共阳LED数码管显 示“7段码”
MOV DPTR,#TAB1
MOVC A,@A+DPTR
LJMP DISPLAY
……
TAB1:
散转表举例
如果使用查表法,我们应该知道两个数据,一 个找出按下键的数值(自己设定),另一个是 这个键所表示的数字在表中的位置
举例说明
假设S9按下,我们试着来查找 首先,原理图高四位为行,低四位为列
1.设置P1值为00001111(0FH), 有键按下, 该列值变为0,所以S9按下,P1值为07H
2.此时只是判断出第一列有键按下,但是不知 道是哪个,所以接下来扫描整列
3.设置P1值为11110000(F0H), 有键按下, 该列值变为0,所以S9按下,P1值为D0H
单片机 键盘接口实验

实验六键盘接口实验一、实验目的1、掌握Keil C51软件与Protues软件联合仿真调试的方法;2、掌握单片机的键盘接口电路;3、掌握单片机的键盘扫描原理;4、掌握键盘的去抖原理及处理方法。
二、实验仪器与设备1、微机一台2、Keil C51集成开发环境3、Protues仿真软件三、实验内容1、用Protues设计一矩阵键盘接口电路。
要求利用P1口接一4×4矩阵键盘。
串行口通过一74LS164接一共阴极数码管。
用线反转法编写矩阵键盘识别程序,用中断方式,并将按键的键值0-F通过串行口输出,显示在数码管上。
2、将P1口矩阵键盘改成8个独立按键,重新编写识别和显示程序。
四、实验说明矩阵键盘识别一般包括以下内容:⑴判别有无键按下。
⑵键盘扫描取得闭合键的行、列号。
⑶用计算法或查表发的到键值;⑷判断闭合键是否释放,如没释放则继续等待。
⑸将闭合键的键值保存,同时转去执行该闭合键的功能。
五、实验步骤1、用Protues设计键盘接口电路;2、在Keil C51中编写键盘识别程序,编译通过后,与Protues联合调试;3、按动任意键,观察键值是否能正确显示。
六、实验电路仿真图矩阵键盘电路图见附录1。
独立按键电路图见附录2。
七、实验程序实验程序见附录3、4。
八、实验总结1、矩阵键盘常用的检测方法有线反转法、逐行扫描法。
线反转法较简单且高效。
在矩阵键盘的列线上接一与门,利用中断方式查询按键,可提高CPU的运行效率。
2、注意用线反转法扫描按键时,得到的键值不要再赋给temp,最好再设一新变量接收键值,否则再按下按键显示数字的过程中,再按按键会出现乱码。
3、学会常用与门、与非门的使用方法。
附录1:矩阵键盘实验电路图附录2:独立按键实验电路图附录3:矩阵键盘实验程序#include <REG51.H>char code LED_TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};char code KEY_TABLE[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};char code tab1[10]={0xfe,0xde,0x9e,0x9a,0x92,0x82,0x82,0x80,0xff};char temp,num,i,m;int t;bit flag=0;void Delay_ms(t){int i;for(;t>0;t--)for(i=0;i<124;i++);}void main(void){TMOD=0x01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;ET0=1; PT0=1; SCON=0;EX0=1; IT0=1; EA=1;P1=0xf0;while(1){SBUF=tab1[m];while(TI==0); TI=0;Delay_ms(400); //500msm++;if(m==9) m=0;}}void int_1() interrupt 0{P1=0xf0;if(P1!=0xf0){Delay_ms(10);if(P1!=0xf0){temp=P1;P1=0x0f;temp=temp|P1;for(i=0;i<16;i++){if(temp==KEY_TABLE[i]){temp=i; break;}}SBUF=LED_TAB[temp];while(TI==0); TI=0; TR0=1;while(flag==0); flag=0;} } P1=0xf0;}void timer_0() interrupt 1{TH0=(65536-10000)/256;TL0=(65536-10000)%256;t++;if(t==300){t=0; flag=1; TR0=0;}}附录4:独立按键实验#include <REG51.H>char code LED_TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};char code KEY_TABLE2[]={ 0xfe,0xfd,0xfb,0x f7, 0xef,0xdf,0xbf,0x7f,} ;char code tab1[10]={0xfe,0xde,0x9e,0x9a,0x 92, 0x82,0x82,0x80,0xff};char temp,i,m;int t;bit ff;bit flag=0;void Delay_ms(t){int i;for(;t>0;t--)for(i=0;i<124;i++);}void main(void){TMOD=0x01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;ET0=1; SCON=0; EX0=1;IT0=1; PT0=1; EA=1;P1=0xff;while(1){ff=IE0;SBUF=tab1[m];while(TI==0); TI=0;Delay_ms(400);m++;if(m==9) m=0;}}void timer_0() interrupt 1{TH0=(65536-10000)/256;TL0=(65536-10000)%256;t++;ff=IE0;if(t==300){t=0;flag=1;}}void int_0() interrupt 0{EX0=0;Delay_ms(10);temp=P1;if(temp!=0xff){for(i=0;i<8;i++){if(temp==KEY_TABLE2[i]){temp=i; break;}}SBUF=LED_TAB[temp];while(TI==0); TI=0;TR0=1; while(flag==0);flag=0; TR0=0;P1=0xff; EX0=1;}}。
51单片机键盘接口电路(含源程序)

51单片机键盘接口电路(含源程序)键盘是由若干按钮组成的开关矩阵,它是单片机系统中最常用的输入设备,用户能通过键盘向计算机输入指令、地址和数据。
一般单片机系统中采和非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。
按钮开关的抖动问题组成键盘的按钮有触点式和非触点式两种,单片机中应用的一般是由机械触点组成的。
在下图中,当开<键盘结构图>< P> 图1 < P> 图2关S未被按下时,P1。
0输入为高电平,S闭合后,P1。
0输入为低电平。
由于按钮是机械触点,当机械触点断开、闭合时,会有抖动动,P1。
0输入端的波形如图2所示。
这种抖动对于人来说是感觉不到的,但对计算机来说,则是完全能感应到的,因为计算机处理的速度是在微秒级,而机械抖动的时间至少是毫秒级,对计算机而言,这已是一个“漫长”的时间了。
前面我们讲到中断时曾有个问题,就是说按钮有时灵,有时不灵,其实就是这个原因,你只按了一次按钮,可是计算机却已执行了多次中断的过程,如果执行的次数正好是奇数次,那么结果正如你所料,如果执行的次数是偶数次,那就不对了。
为使CPU能正确地读出P1口的状态,对每一次按钮只作一次响应,就必须考虑如何去除抖动,常用的去抖动的办法有两种:硬件办法和软件办法。
单片机中常用软件法,因此,对于硬件办法我们不介绍。
软件法其实很简单,就是在单片机获得P1。
0口为低的信息后,不是立即认定S1已被按下,而是延时10毫秒或更长一些时间后再次检测P1。
0口,如果仍为低,说明S1的确按下了,这实际上是避开了按钮按下时的抖动时间。
而在检测到按钮释放后(P1。
0为高)再延时5-10个毫秒,消除后沿的抖动,然后再对键值处理。
不过一般情况下,我们常常不对按钮释放的后沿进行处理,实践证明,也能满足一定的要求。
当然,实际应用中,对按钮的要求也是千差万别,要根据不一样的需要来编制处理程序,但以上是消除键抖动的原则。
接口实验报告——键盘

void KEY_Init(void)
{ //行L4为输出
Key = 0;
IO0DIR = (IO0DIR & (~ROW1) & (~ROW2)& (~ROW3)& (~ROW4) & (~ROW5)& (~ROW6))| COL1 | COL2 | COL3 | COL4 | COL5 | COL6;
VICVectCntl0 = 0x2E;
VICVectAddr0 = (uint32)KEY_IRQ;
VICIntEnable = VICIntEnable | 0x4000;
}
int main (void) //读取键值,根据键盘值控制灯亮次数
{
uint32 i,j;
if((IO0PIN & ROW5)==0) key=23;
if((IO0PIN & ROW6)==0) key=24;
//扫描第五列
IO0CLR = COL5;
IO0SET = COL2 | COL3 | COL4 | COL1 | COL6;
if((IO0PIN & ROW1)==0) key=25;
for(j=0;j<1000000;j++);
}
Key=0;
}
}
return 0;
}
if((IO0PIN & ROW6)==0) key=12;
//扫描第三列
IO0CLR = COL3;
IO0SET = COL2 | COL1 | COL4 | COL5 | COL6;
if((IO0PIN & ROW1)==0) key=13;
单片机实验--键盘扫描

实验4 键盘实验一、实验目的:1.掌握8255A编程原理。
2.了解键盘电路的工作原理。
3.掌握键盘接口电路的编程方法。
二、实验设备:CPU挂箱、8031CPU模块三、实验原理:1.识别键的闭合,通常采用行扫描法和行反转法。
行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如所读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。
本实验例程采用的是行反转法。
行反转法识别键闭合时,要将行线接一并行口,先让它工作于输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口往各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。
然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上的输入值,那么,在闭合键所在的行线上的值必定为0。
这样,当一个键被按下时,必定可以读得一对唯一的行线值和列线值。
2.程序设计时,要学会灵活地对8255A的各端口进行方式设置。
3.程序设计时,可将各键对应的键值(行线值、列线值)放在一个表中,将要显示的0~F字符放在另一个表中,通过查表来确定按下的是哪一个键并正确显示出来。
实验题目利用实验箱上的8255A可编程并行接口芯片和矩阵键盘,编写程序,做到在键盘上每按一个数字键(0~F),用发光二极管将该代码显示出来。
四、实验步骤:将键盘RL10~RL17接8255A的PB0~PB7;KA10~KA12接8255A的PA0~PA2;PC0~PC7接发光二极管的L1~L8;8255A芯片的片选信号8255CS接CS0。
五、实验电路:六、程序框图7.程序清单八、附:8251/8255扩展模块该模块由8251可编程串行口电路和8255可编程并行口电路两部分组成,其电源、数据总线、地址总线和片选信号均由接口挂箱上的接口插座提供。
一、8251可编程串行口电路(1)8251可编程串行接口芯片引脚及功能8251A是通用同步/异步收发器USART,适合作异步起止式数据格式和同步面向字符数据格式的接口,其功能很强。
单片机实验五报告_单片机键盘实验

单片机实验五报告_单片机键盘实验一、实验目的本次单片机键盘实验的主要目的是让我们深入了解单片机与键盘的接口技术,掌握如何通过编程实现对键盘输入的检测和响应,从而提高我们在单片机应用开发中的实际操作能力。
二、实验原理在单片机系统中,键盘通常是作为输入设备使用的。
常见的键盘有独立式键盘和矩阵式键盘两种类型。
独立式键盘是每个按键单独占用一根 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();}}```六、实验结果及分析在实验过程中,我们成功地实现了对矩阵式键盘的输入检测,并能够根据不同的按键执行相应的操作。
键盘接口实验

实验报告
实验课程名称MCS-51系列单片机系统
实验项目名称键盘接口实验
年级
专业
姓名
学号
实验时间:2016 年 5月 14 日
一、实验目的
1.熟悉单片机通过行列键盘的接口方法。
2. 掌握键盘扫描及处理程序的编程方法和调试方法。
二、实验原理
通过keil软件编程程序运行后,根据按下的数字键,数码管上应能显示相应数字。
如按下1,数码管上就显示出1.按下2,数码管显示2.
键输入程序的功能有以下的四个方面:(1)判别键盘上有无键闭合
(2)去除键的机械抖动。
(3)判别闭合键的键号。
公式为:
N=行首建号+列号(4)使CPU对键的一次闭合作一次处理。
采用的方法为等待闭合键释放以后再做处理。
三、实验步骤
1、进入Keil组合软件的操作环境。
2、在Keil C51组合软件环境中, 根据实验硬件电路编辑源程序并对源文件进行
编译,生成目标代码;
3.运行、调试程序和结果检查
⑴采用单步,设置断点等方法,观察程序走向是否正确;
⑵连续运行程序,依次按动数字键观察数码管的显示是否相符。
四、仿真结果
1.当按下矩阵键盘的8号键时,七段数码管的显示为3.如下图所示。
2.当按下矩阵键盘的A号键时,数码管显示的为9。
如图所示:
3.当按下矩阵的F按键时,数码管显示的为d。
如图所示:
硬件调试:
五、实验总结
通过这次的实验,学会了许多东西。
做这次的实验,自己对矩阵键盘的使用更加的了解,通过使用矩阵键盘,可以节省较多的单片机I/O的使用。
单片机原理及接口技术(C51编程)单片机的开关检测、键盘输入 与显示的接口设计

下面讨论P1~P3口如何与LED发光二极管驱动连接问 题。
单片机并行端口P1~P3直接驱动发光二极管,电路见 图5-1。
与P1、P2、P3口相比,P0口每位可驱动8个LSTTL输 入,而P1~P3口每一位驱动能力,只有P0口一半。
5.1 单片机控制发光二极管显示
发光二极管常用来指示系统工作状态,制作节日彩灯、 广告牌匾等。
大部分发光二极管工作电流1~5mA之间,其内阻为 20~100Ω。电流越大,亮度也越高。
为保证发光二极管正常工作,同时减少功耗,限流电阻 选择十分重要,若供电电压为+5V,则限流电阻可选1~3kΩ。
5.1.1 单片机与发光二极管的连接
5.2.2 开关检测案例2
图5-4 开关检测指示器2接口电路与仿真
5.2.2 开关检测案例2
参考程序:
#include <reg51.h> void main( ) {
char state; do {
P1=0xff; state=P1; state=state&0x03;
// 包含头文件reg51.h //主函数main( )
//延时函数
5.2.1 开关检测案例1
void main( ) { //主函数
while (1) {
unsigned char temp; //定义临时变量temp
P1=0xff;
//P1口低4位置1,作为输入;高4位置1,发光二极管熄灭
temp=P1&0xf0;
//读P1口并屏蔽低4位,送入temp 中
5.1.2 I/O端口的编程举例
键盘及LED显示实验

实验三键盘及LED显示实验一、实验内容利用8255可编程并行接口控制键盘及显示器,当有按键按下时向单片机发送外部中断请求(INTO, INT1),单片机扫描键盘,并把按键输入的键码一位LED 显示器显示出来。
二、实验目的及要求(一)实验目的通过该综合性实验,使学生掌握8255扩展键盘和显示器的接口方法及C51 语言的编程方法,进一步掌握键盘扫描和LED显示器的工作原理;培养学生一定的动手能力。
(二)实验要求1.学生在实验课前必须认真预习教科书与指导书中的相关内容,绘制流程图,编写C51语言源程序,为实验做好充分准备。
2.该实验要求学生综合利用前期课程及本门课程中所学的相关知识点,充分发挥自己的个性及创造力,独立操作完成实验内容,并写出实验报告。
三、实验条件及要求计算机,C51语言编辑、调试仿真软件及实验箱50台套。
四、实验相关知识点1. C51编程、调试。
2 .扩展8255芯片的原理及应用。
3.键盘扫描原理及应用。
4.LED显示器原理及应用。
5.外部中断的应用。
五、实验说明本实验仪提供了8位8段LED显示器,学生可选用任一位LED显示器,只要六、实验原理图8255七、连线说明F4 区: CS 、A0、A1A3 区: CS1、A0、A1 B6 区:JP56 (PA 口)F4 区:JP41(C)B6 区:JP53 (PB 口)F4 区:JP42(B) B6 区:JP52 (PC 口)F4 区:JP47(A)A3 区:JP51F4 区:JP92(D) A3 区:P1.6、P1.7A3 区:INT0、INT1注:F4的D 无法与INT0(P3.2)、INT1(P3.3)直接连接,所以使用P1 口桥接。
八、实验参考流程图 1 .主程序流程图DS30LG4041AH123 B 45 6 78SEGB (8255 PB6) / SEGC (8255 PB5)4 SEGD (8255 PB4) —2 SEGE (8255 PB3)—1 SEGA (8255 PB7) 11 SEGH (8255 PB0) JP42 ab ac 口:口gdpdPGND42af「g ]b 口dpGND3am p GND28 adpGND16DS29LG4041AHSEGH 3SEGA 11 SE( SEGC 4 SEGD 2 SEGE 1a b c d e f g dpadd c paGND3aGND2adpGND1GND46 JP41(PA7)(8255 PA6)(8255 PA5) (8255 PA4) (8255 PA3) (8255 PA2) (8255PA1)(8255 PA0)123 ;c6VCC R162 5.1KVCC |R1635.1KU36 DO 34D1 33 D2 32D3 31D4 30D5 29D6 28D7 27 RD 5WR 36 D0 PA0 D1 PA1 D2 PA2 D3 PA3 D4 PA4 D5 PA5 D6 PA6 D7 PA7 RD PB0 WR PB1 A0 PB2 A1 PB3 RESET PB4 CSPB5 PB6 PB7 PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC74 PA0 3PA1 2PA21PA3 40 ~PA4~ 39 PA5 38 PA6 37 PA7 18 PB019 PB1 20 PB2 21PB3PB4 23 PB5 24 PB6 25 PB714 严 PC015 PC1 16 PC2 '17 PC3 13 PC4 ' 12 PC5 ' 11 PC6 10PC71 2 3 4 5 6 7 8 1 2 3 4 5 6 7 81 2 34 5 6 7 8 JP56JP53JP526 —— 7A ■B ■C ■D —E ■(8255 PC7) (8255 PC6) (8255 PC5) (8255_PC4)_ (8255 PC3) (8255 PC2) (8255 PC1) (8255 PC0)-JP92 1 2 3 5D6 7 8-JP47 1 2 35A6 7 8开始■-0- >按键标志8255初始化(PA, PB, PC 口作输出)0- >8255PC 口定时器0:方式一允许定时器0中断允许外部中断0 (行线0)允许外部中断1 (行线1)外部中断0、1边沿触发允许中断按键标志=11Y /2 •外中断服务程序流程图夕卜部中断0外部中断1■:开始.:■v8255PC 口改为输入关外部中断10->P3.3 (键的行线1)读8255PC 口转化为8..F的键值-> 变量01 !8255的PC 口改为输出1->P3.30->8255PC 口------- N—〈有键按下〉设置定时器0初值(50ms定时)开定时器0键值变量=变量01清外部中断1允许外部中断13. LED 显示程序流程图九、C51语言参考源程序#in elude "reg52.h" un sig ned char KeyResult; un sig ned char buffer[8]; bit bKey;xdata un sig ned char P_8255 _at_ 0xf003; xdata un sig ned char PA_8255 _at_ OxfOOO; xdata un sig ned char PB_8255 _at_ OxfOOl; xdata un sig ned char PC_8255 _at_ 0xf002; code un sig ned char SEG_TAB[] = {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x0};sbit bLi ne0 = P3A 2; sbit bLi ne1 =卩3人3; II 延时1ms void Delay1ms() {un sig ned char i;■'返回II8255 的控制口II8255 的 PA 口II8255 的 PB 口 II8255 的 PC 口 II 段码II 存放键值//显示缓冲区 II 是否有键按下i = 0;while (--i);}// 显示void Display(){unsigned char i = 0x7f; unsignedchar j;for (j = 0; j < 8; j++){PA_8255 = i;PB_8255 = SEG_TAB[buffer[j]];i = i / 2 + 0x80;Delay1ms();}}// 扫描// 段数据// 更新显示缓冲区数据void RefurbishData(){char i;for (i = 7; i >0; i--)buffer[i] = buffer[i-1];buffer[0] = KeyResult;}void Int0Int() interrupt 0{unsigned char i = 0x80;unsigned char KeyResult0 = 0x0;EX0 = 0;P_8255 = 0x89; bLine0 = 0; // 关外部中断0 //PC 口输入//P3.2 作行输出while (i){if ((PC_8255 & i) == 0)break;KeyResult0++;i >>= 1;}P_8255 = 0x80;PC_8255 = 0;//8255 的PA、PC 口全作输出口IE1 = 0; EX1 = 1; }bLine0 = 1; if (i){TH0 = 60; TL0 = 176; TR0 = 1;KeyResult = KeyResult0;}// 定时中断计数器初值 // 定时 50msIE0 = 0; EX0 =1; } // 清除中断 // 开外部中断 0void Int1Int() interrupt 2 { unsigned char i = 0x80; unsigned char KeyResult0 = 8; EX1 = 0; P_8255 = 0x89; bLine1 = 0; // 关外部中断 0 //PC 口输入 //P3.2 作行输出while (i) { if ((PC_8255 & i) == 0) break;KeyResult0++; i >>= 1;}P_8255 = 0x80;PC_8255 = 0; bLine1 = 1;〃8255 的PA PB PC 口全作输出口if (i){TH0 60;TL0 = 176;TR0 1;}KeyResult = KeyResult0;// 定时中断计数器初值 // 定时 50ms// 清除中断 // 开外部中断 0//50ms 中断服务程序void INT_Timer0(void) interrupt 1{if (((KeyResult < 8) && !bLine0) || ((KeyResult >= 8) && !bLine1)){bKey = 1;}TR0 = 0;}void main(){char i;for (i = 0; i < 8; i++) buffer[i] = 0x10; // TR0 = 1; // bRefurbish = 1;while (1){if (bKey){bKey = 0;RefurbishData(); } Display();}}十、实验实施步骤1 .仔细阅读实验内容及要求,编写 C51 源程序。
单片机键盘接口实验实验报告

单片机键盘接口实验是嵌入式系统课程中常见的实践内容,通过该实验可以学习如何
通过单片机与键盘进行交互。
在实验报告中,你可以包括以下内容:
1. **实验背景**:简要介绍单片机键盘接口实验的背景和意义,说明该实验对于学习
嵌入式系统的重要性。
2. **实验目的**:阐明本次实验的主要目的和预期学习目标,如掌握单片机与外部键
盘的连接方式、键盘扫描原理等。
3. **实验器材**:列出用于实验的硬件设备和软件工具,如单片机型号、键盘类型、
开发板、编程软件等。
4. **实验原理**:详细描述单片机与键盘的接口原理、键盘扫描原理、键值获取原理
等相关知识。
5. **实验内容**:描述具体的实验步骤,包括单片机与键盘的连接方法、程序设计流
程等。
6. **实验结果**:展示实验的运行结果,可以包括通过键盘输入字符、数字等信息,
并说明实验达到预期的目标。
7. **实验分析**:对实验过程中遇到的问题进行分析,并提出解决方案。
也可以对实
验结果进行分析,说明实验现象背后的原理。
8. **实验总结**:总结本次实验的收获和体会,强调实验对于学习嵌入式系统的意义,以及未来可能的拓展方向。
9. **参考资料**:列出在撰写实验报告过程中所参考的相关书籍、网络资料或者其他
来源。
以上内容仅供参考,实验报告的具体内容可以根据你的实际实验情况和要求进行适当
调整和扩展。
希望这些信息能对你撰写实验报告有所帮助!。
实验五:独立式键盘实验

实验五:独立式键盘实验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.分析题意,确定算法,绘制主程序流程图。
8051和8155接口扩展与数码管显示实验

重庆交通大学学生实验报告实验课程名称单片机原理与应用实验名称8051和8255接口扩展与数码管显示实验实验类型设计性实验开课实验室电子实验室学院信息科学与工程学院学生姓名学号开课时间2012 至2013 学年第2 学期一、实验目的通过实验,掌握单片机在输入输出口线不够用时,怎样扩展接口的方法来支持8位LED 显示和16键盘集成实现。
熟悉8255、8279等芯片性能;掌握其编程方法。
掌握键盘子程序调试方法,掌握按一个键并将键值显示出来的编程方法,这是诊断硬件、测试硬件、产品开发、软件编程必须掌握的方法。
二、实验内容1、编写并调试出一个键盘实验子程序2、用子程序调用方法,分别调用键盘子程序和显示子程序,将按一个键的键值(0-f),在数码管上显示出来。
3、用C51必须重新编写上述实验内容的程序系统。
三、实验步骤1、打开keil程序,执行菜单命令“project”→”new project”创建“键盘数码管显示综合实验”项目,并选择单片机型号为AT89C51..2、执行菜单命令”file”→”new”创建文件,输入源程序,保存为“键盘数码管显示综合实验.A51“.在”project“栏的file项目管理窗口中右击文件组,选择”add file to group1“将源程序”键盘数码管显示综合实验.A51“添加到项目中。
3、执行菜单命令“project”→”options for target ’target 1’”,在弹出的对话框中选择“output”选项卡,选中“create hex file”4、执行菜单命令“project“→” build target”,编译源程序。
如果编译成功,则在”output window “窗口中显示没有错误,并创建了”键盘数码管显示综合实验.HEX“文件。
5、在protues仿真平台上建立参考图系统,并将程序上载到虚拟芯片上运行。
四、实验调试及结果五、实验分析#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar KeyScan(); //按键扫描子程序void delay10ms;uchar key_free();void key_deal();void main(){while(1){KeyScan();Key_free();Key_deal();}}uchar KeyScan(){unsigned char key,temp;P1=0xf0;if(P1&0xF0!=0XF0){ delay10ms();if(P1&0XF0!=0XF0) {P1=0xFE;temp=P1;temp=temp*0xF0; if(temp!=0xF0){switch(temp){case 0xE0:key=0;break;case 0xD0:key=4;break;case 0xB0:key=8;break;case 0x70:key=12;break;}}P1=0XFD;temp=P1;temp&=0xF0;if(temp1=0xF0) {switch(temp) {case 0xE0:key=1;break; case 0xD0:key=5;break; case 0xB0:key=9;break; case 0x70:key=13;break; }}P1=0XFB;temp=P1;temp&=0xF0;if(temp!=0xF0) {switch(temp) {case 0xE0:key=2;break; case 0xD0:key=6;break; case 0xB0:key=10;break; case 0x70:key=14;break; }}P1=0XF7;temp=P1; temp&=0xF0;if(temp!=0xF0){switch(temp){case 0xE0:key=3;break;case 0xD0:key=7;break;case 0xB0:key=11;break;case 0x70:key=15;break;}}}return(key);}}void delay10ms(){unsigned char i,j; for(i=0;i<10;i++)for(j=0;j<120;j++) {}}uchar key_free(){key=key_scan();P1=0xF0;while(P1&0XF0!=0XF0) {}return(key);}六、实验思考与总结本实验只有部分的参考程序,仿真图也需要做相应的修改,所以做起来相对要难一些,不过,也正是因为这样,使得我们需要花更多的功夫去了解所用单片机的引脚以及功能。
51单片机矩阵键盘与8051连接设计

sbit L6=P0_;
sbit L7=P0_;
sbit L8=P0_;
sbit DUAN=P2_;
sbit WEI=P2_;
/*-----------------------------
定时器0初始化函数
-----------------------------*/
void init()
case 0xed:L5=~L5;/*按键05功能*/ break;
case 0xdd:L6=~L6;/*按键06功能*/ break;
case 0xbd:L7=~L7;/*按键07功能*/ break;
case 0x7d:L8=~L8;/*按键08功能*/ break;
case 0xeb:/*按键09功能*/ break;
{
TR0=0; //定时终止
TH0=(65536-10000)/256; //定时器0初值重装
TL0=(65536-10000)%256;
NUM--;
}
/*--------------------------------------------------
矩阵键盘检测兼编码函数
--------------------------------------------------*/
kvalue=matrixkeyscan();
switch(kvalue)
{
case 0xee:L1=~L1;/*按键01功能*/ break;
case 0xde:L2=~L2;/*按键02功能*/ break;
case 0xbe:L3=~L3;/*按键03功能*/ break;
case 0x7e:L4=~L4;/*按键04功能*/ break;
8051微机硬件实验报告完整

实验报告Array课程名称:___ 微机原理与接口技术_ __指导老师:___ _王晓萍__ __成绩:__________________ 实验名称:硬件实验__实验类型:__ \ _同组学生姓名:_ __ 一、实验目的和要求二、实验内容和原理三、主要仪器设备四、操作方法和实验步骤五、实验数据记录和处理六、实验结果与分析七、讨论、心得第二篇硬件实验实验一I/O口控制实验一、实验目的1.学习P1口的使用方法;2.学习延时子程序的编写和使用。
二、实验说明P1口是准双向口,它作为输出口时与一般的双向口使用方法相同。
由准双向口结构可知当P1口用作输入口时,必须先对口的锁存器写“1”,若不先对它写“1”,读入的数据可能是不正确的。
三、实验步骤实验1:用P1 口做输出口,接八位逻辑电平显示,程序功能使发光二极管从右到左轮流循环点亮。
1.用8P 数据线连接80C51 MCU 模块的JD1(P1 口)与八位逻辑电平显示模块的JD1A5。
2.打开Keil uVision2 仿真软件,选择硬件仿真,选择串行口,设置波特率为38400。
3.新建一个项目文件,添加“TH7_P1A.ASM”源程序,编译,直到编译无误后进入仿真环境。
4.打开模块电源和总电源,点击RUN 按钮运行程序。
观察发光二极管显示情况。
发光二极管单只从右到左轮流循环点亮。
实验2:用P1.0、P1.1 作输入接两个拨断开关,P1.2、P1.3 作输出,接两个发光二极管。
程序读取开关状态,并在发光二极管上显示出来。
1.用导线分别连接80C51 MCU 模块的P1.0、P1.1 到八位逻辑电平输出模块的K0、K1;P1.2、P1.3到八位逻辑电平显示模块的L0、L1。
2.打开“TH7_P1B.ASM”源程序,编译无误后,进入仿真环境。
3.全速运行程序,拨动拨断开关,观察发光二极管的亮灭情况。
向上拨为点亮,向下拨为熄灭。
四、实验电路图五、实验流程图及源程序1.流程图2.源程序(一)实验1(二)实验23.实验结果程序编译无误后打开实验箱电源,进入仿真环境,可得如下实验结果:1)实验1:结果:点击RUN按钮运行程序后,发现实验箱上的发光二极管单只从右到左轮流循环点亮。
单片机键盘显示实验报告

单片机的键盘和显示实验报告㈠实验目的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.当键盘采用中断方式时,硬件电路应怎样连接~是键输出线,~是扫描输入线。
输入与门用于产生按键中断,其输入端与各列线相连,再通过上拉电阻接至+5 V电源,输出端接至8051的外部中断输入端。
移位寄存器的移位速率是多少实验中要求计算的式子和结果之间相差一秒,移位寄存器的移位速率应该是每秒一位吧。
其实这个问题确实不知道怎么回答。
LED实验代码: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 ,ADD1 ;K1按下转去ADD1JB ,SUB1 ;K1按下转去SUB1JB ,MUL1 ;K1按下转去MUL1JB ,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从上面的结果可以看出,本次实验基本完成了实验要求。
键盘接口实验实验报告及程序

键盘接口实验实验报告及程序一、实验目的本次实验的主要目的是深入了解计算机键盘接口的工作原理,并通过编程实现对键盘输入的读取和处理。
通过这个实验,我们将掌握如何与计算机硬件进行交互,提高对计算机系统底层运作的认识。
二、实验原理计算机键盘通常通过 PS/2 接口或 USB 接口与主机相连。
在本次实验中,我们以 PS/2 接口为例进行研究。
PS/2 接口使用双向同步串行协议进行通信,数据传输速率约为 10 167Kbps 。
键盘在向主机发送数据时,每个字节包含 11 位,分别是起始位(总是 0 )、 8 位数据位(低位在前)、校验位(奇校验)和停止位(总是 1 )。
主机通过向键盘发送命令来控制键盘的工作模式和获取相关信息。
三、实验设备及环境1、计算机一台2、开发板及相关配件3、编程软件(如 Keil 等)四、实验步骤1、硬件连接将开发板与计算机通过相应的接口连接好,确保连接稳定。
2、软件编程选择合适的编程语言和开发环境。
初始化相关的硬件接口和寄存器。
编写读取键盘输入数据的程序代码。
3、编译与下载对编写好的程序进行编译,检查是否有语法错误。
将编译成功的程序下载到开发板中。
4、实验测试按下键盘上的不同按键,观察开发板的输出结果。
检查读取到的数据是否准确,校验位是否正确。
五、程序代码实现以下是一个简单的基于 C 语言的键盘接口读取程序示例:```cinclude <reg51h>//定义 PS/2 接口相关引脚sbit PS2_CLK = P1^0;sbit PS2_DATA = P1^1;//读取一个字节的数据unsigned char ReadByte(){unsigned char data = 0;unsigned char i;while(PS2_CLK == 1);//等待时钟线拉低for(i = 0; i < 8; i++){while(PS2_CLK == 0);//等待时钟上升沿data =(data << 1) | PS2_DATA; //读取数据位}while(PS2_CLK == 1);//等待时钟线拉低return data;}void main(){unsigned char key;while(1){key = ReadByte();//读取键盘输入的数据//在此处对读取到的数据进行处理和显示}}```六、实验结果与分析在实验过程中,我们按下不同的键盘按键,开发板能够准确地读取到相应的键值。
键盘接口实验

键盘接口实验一、实验目的1、熟悉单片机通过行列键盘的接口方法。
2、掌握键盘扫描及处理程序的编程方法和调试方式。
二、实验内容编程实现按下数字键盘,在数码管上能显示相应数字。
三、实验步骤1、在Keil C51软件的操作环境,编辑源程序并对源文件进编译。
2、进入protues系统,画出实验电路图。
3、对protues系统和KEILc51系统进行联机设置。
(1)采用单步,设置断点等方法,观察程序走向是否正确。
(2)连续运行程序,依次按动数字键观察LED的显示是否相符。
四、实验:4.1、电路图:4.2、电路仿真图:4.3、参考程序如下(C语言):#include <reg51.h>typedef unsigned char uint8;typedef unsigned int uint16;#define BUZZER() P3 ^= 0x01code uint8 LED_CODE[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};void delay(uint16 x){uint16 i,j;for(i = x; i > 0; i --)for(j = 114; j > 0; j --);}uint8 Pre_KeyNO = 16,KeyNO = 16;void Keys_Scan(){uint8 Tmp;P1 = 0x0f;delay(1);Tmp = P1 ^ 0x0f;//高4位输出,低4位输入switch(Tmp){case 1: KeyNO = 0; break;case 2: KeyNO = 1; break;case 4: KeyNO = 2; break;case 8: KeyNO = 3; break;default: KeyNO = 16;}P1 = 0xf0;delay(1);Tmp = P1 >> 4 ^ 0x0f;//高4位输入,低4位输出switch(Tmp){case 1: KeyNO += 0; break;case 2: KeyNO += 4; break;case 4: KeyNO += 8; break;case 8: KeyNO += 12;}}void Beep(){uint8 i;for(i=0;i<100;i++){delay(1);BUZZER();}}void main(){P0 = 0x00;while(1){P1 = 0xf0;if(P1 != 0xf0)Keys_Scan();if(Pre_KeyNO != KeyNO){P0 = LED_CODE[KeyNO];Beep();Pre_KeyNO = KeyNO;}delay(10);}}。
单片机实验五报告-单片机键盘实验

南昌大学实验报告学生姓名:学号:专业班级:实验类型:⃞验证 ⃞综合■设计 ⃞创新实验日期:2018.05.18 实验成绩:实验五单片机键盘实验(一)实验目的1.掌握单片机键盘控制;2.掌握数码管显示控制。
(二)设计要求1.行列扫描按键键值为0~F;2.按键只支持单键按下,不支持多键同时按下;3.要求用数码管显示按键值。
(三)实验原理1.矩阵式键盘的设计按键数目较多的杨合常采用矩阵式(也称行列式)键盘。
键盘由行线和列线组成,按键位于行、列的交叉点上,如下图所示,一个4×4的行列结构可构成一个16个按键的键盘,需要一个8位的并行I/O口。
很明显,在按键数目较多的场合,矩阵式键盘要比独立式键盘节省较多的I/O口线。
对下图所示的矩阵式键盘的查询扫描,一般包括以下4个步骤。
(1)首先判别整个键盘有无按键按下方法为单片机驱动列线P0.0-P0.3输出全0,然后读行线P0.4-P0.7的状态,若全为1,则键盘上没有闭合键;若P0.4-P0.7,则有键按下。
(2)去除键的抖动当判别出可能有键按下时,软件延时一段时间(10ms左右)再判别键盘的状态,若仍有键闭合,则认为键盘上有确定的键按下,否则是键抖动。
(3)求出按下键的键号上图中的16个按键,键号依次为0,1,...15。
各行的首键号分别为0,4,8,12,列号依次为0,1,2,3。
行线通过上拉电阻接+5V,当无键按下时,行线为高电平,当有按键按下时,对应的行线与列线短接,行线的电平将由此行线相连的列线电平决定。
如果把行线设置为单片机的输入口线,列线设置为单片机的输出口线,则按键号的识别过程是:先令0列线P0.0为低电平0,其余3根列线都为高电平,遂行检查行线状态。
如果行线P0.4-P0.7都为高电平1,则P0.0这列上没有按键闭合,若P0.4-P0.7中有一行为低电平,则该行线与列线交叉的按键按下。
如果P0.0这一列上没有按键闭合,接着再使P0.1为低电平,其余列线为高电平。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
硬件实验5 键盘接口实验
1.实验目的
1)了解按键的相关基础知识以及抖动、连击、重键等的处理方法。
2)了解按键的几种工作方式与特点。
3)掌握键盘的硬件连接方式及程序设计方法。
2.预习要求
1)了解P0、P1、P2、P3口的准双向接口特点与应用特性。
2)了解独立式键盘的硬件连接方式与特点。
3)了解行列式键盘的硬件连接方式与特点,以及行扫描法和线路反转法两种按键扫描
方法。
4)预习本节实验内容,设计实验的硬件连接,编写实验程序。
3.实验说明
1)键盘的组织形式与工作原理
独立式键盘:当数量较少时(如5个以下),通常采用独立式按键方式,即一条口线连接一个按键;独立式键盘软件简单,定时读取这些口线的电平状态,即可判断按键是否按下,是哪个按键按下;但是当按键较多时,需要消耗的I/O口线多。
矩阵式(行列式)键盘:当按键数量较多时,为了节省I/O口资源,通常采用矩阵式键盘形式,对于n列、m行矩阵连接的n×m个按键,只需要n+m条口线。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
在需要的按键数量较多(如大于6个)时,通常采用矩阵法设计键盘接口。
2)矩阵式键盘的扫描方式
A.行扫描法
行扫描法又称为逐行扫描查询法,是一种最常用的按键识别方法,扫描步骤如下:
Ø按键判断:判断键盘中有无键按下,其过程为将全部行线置低电平,然后检测列线的状态。
只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低
电平线与行线相交叉的按键之中。
若所有列线均为高电平,表示无键按下。
Ø按键识别:在确认有键按下后,则要确定所闭合按键的位置,即确定键值。
其扫描过程为:依次将行线置为低电平并输出(逐行输出0),然后读取各列线的电平状
态,若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
通
过各行的扫描,可以检测到按下的按键。
B.线路反转法
Ø第一步:行作为输出,列作为输入。
行输出全为0,输入各列电平,如果列值全为
1,表示无键按下;若列值不全为1,表示有键按下;
Ø第二步:行列线路反转,即列作为输出,行作为输入。
列输出全0,输入各行电平,此时应有一行为0。
低电平的行和列交点上的按键即为被按下的键。
根据两步得到的列值和行值,构成一个按键的特征码,根据特征码可以确定按下按键的键值。
对于线路反转法要求采用双向(或准双向)I/O接口。
3)键盘的工作方式
A.编程扫描方式
编程扫描方式是利用CPU完成其它工作的空余时间,调用键盘扫描子程序来响应键盘的操作。
在执行其它程序和按键功能程序时,CPU不再响应按键操作,直到CPU 重新调用键盘扫描程序。
该扫描方式简单,缺点是响应速度慢,可能出现按键操作得不到响应的情况。
B.定时扫描方式
定时扫描方式就是每隔一段时间对键盘扫描一次,通常利用微控制器内部的定时器产生一定时时间(例如50ms),在定时中断中调用键盘扫描程序,即进行按键判断和按键识别,再执行该键的功能程序;为避免中断服务程序过长,通常把按键的功能程序转移到主程序中执行。
定时中断扫描的效率较高,但是由于按键操作的频度相当于50ms来说是很低的,大量的中断程序是没有效率的空执行,所以还是存在着浪费CPU时间资源的问题。
C.中断扫描方式
采用上述两种键盘扫描方式时,无论是否按键,CPU都要定时扫描键盘,而微控制器应用系统工作时,并非需要经常操作键盘。
因此,CPU经常处于空扫描状态,为提高CPU工作效率,可采用中断扫描工作方式。
其工作过程如下:当无键按下时,CPU 处理主程序和其他中断等工作,当有键按下时,产生中断请求,CPU转去执行键盘扫描子程序,进行按键识别和功能执行。
中断扫描方式具有响应速度快、占用CPU资源合理等特点,但硬件上需要有外部逻辑电路的支持。
4.设计型实验
1)采用独立式键盘,指定I/O与键盘的连接,设计程序实现对键盘的扫描、按键去抖
动的处理。
当K0~K3键按下时分别对寄存器B赋值0~3,在Keil环境下,调试
运行程序。
独立式按键与电路
【分析】:
Ø设P1口的P1.0-P1.7 八条口线分别连接K1—K8八个按键;
Ø根据从输入口读到的值来判断有无键按下;有键按下时,是哪个键按下,并根据不同的键值分别将1-8赋给A。
Ø在判断有键按下时,需加入延时去抖动,并再进行一次判断,保证是真正的按键操作。
2)采用4*4行列式键盘,指定I/O与键盘的连接,设计程序实现对键盘的扫描、按键
去抖动的处理。
当K0~KF键按下时分别对寄存器A赋值0~F的键值。
【分析】:
Ø行扫描法的过程请看“按键的行扫描法”视频;
Ø4*4行列式键盘硬件连接、键值设置如图所示。
行线输出为P1.7-P1.4,列线输入为P1.3-P1.0。
矩阵式按键电路
5. 探究型实验
用按键输入自己的学号,保存在内存30H 开始的10个单元中。