8051硬件实验5 键盘接口实验

合集下载

单片机IO口应用及键盘实验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单片机键盘接口电路(含源程序)

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编程)单片机的开关检测、键盘输入 与显示的接口设计

第2章已介绍,P0口作通用I/O用,由于漏极开路,需 外接上拉电阻。而P1~P3口内部有30kΩ左右上拉电阻。
下面讨论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. **参考资料**:列出在撰写实验报告过程中所参考的相关书籍、网络资料或者其他
来源。

以上内容仅供参考,实验报告的具体内容可以根据你的实际实验情况和要求进行适当
调整和扩展。

希望这些信息能对你撰写实验报告有所帮助!。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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个单元中。

相关文档
最新文档