单片机-矩阵式键盘接口实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

安徽文达信息工程学院学生实验报告

一、【实验目的】

1.掌握单片机按键的使用和编程方法;

2.掌握矩阵式键盘的编程方法。

二、【实验原理及内容】

按照代码转换方式,键盘可以分为编码式和非编码式两种。编码式键盘是通过数字电路直接产生对应于按键的ASCⅡ码,这种方式目前很少使用。非编码式键盘将按键排列成矩阵的形势,由硬件或软件随时对矩阵扫描,一旦某一键被按下,该键的行列信息即被转换为位置码并送入主机,再由键盘驱动程序查表,从而得到按键的ASCⅡ码,最后送入内存中的键盘缓冲区供主机分析执行。非编码式键盘由于结构简单,按键重定义方便而成为目前最常采用的键盘类型。

非编码键盘又分为独立式键盘和矩阵式键盘。因为独立式键盘较为简单,此次实验以矩阵键盘的查询扫描方式为主。

矩阵式(行列式)键盘的接口电路

对上图矩阵式键盘,编写查询式的键盘处理程序。

先判有无键按下,即把所有行线P1.0~P1.3均置为低,然后检测各列线状态,若列线不全为高电平,则表示键盘中有键被按下;若所有列线列均为高电平,说明键盘中无键按下。

在确认有键按下后,即可查找具体闭合键位置,其方法是依次将行线置为低电平,再逐行检查各列线的电平状态。若某列为低,则该列线与行线交叉处键就是闭合键。

三、【实验器材】

1.PC机

2.Proteus仿真软件

3.Keilc51仿真软件

四、【实验步骤】

1、基础实验

数码管显示4×4矩阵键盘键号。单片机的P1口的P1.0~P1.7连接4×4矩阵键盘,矩阵

中各键编号见下图。

数码管显示由P0口控制,当4×4矩阵键盘中的某一按键按下时,数码管上显示对应键号。例如,1号键按下时,数码管显示“1”;E键按下时,数码管显示“E”等等。

数码管显示4×4矩阵键盘键号的原理电路

2、扩展实验

在P3.0~p3.3口各连接一个LED小灯,每当按下一个按键,数码管显示数字之后,小灯也以亮灭来表示数字,例如按键为5,则小灯依次“亮灭亮灭”。

五、【实验过程原始记录】(可附页)

1.基础实验:

#include

#define uchar unsigned char

sbit L1=P1^0;

sbit L2=P1^1;

sbit L3=P1^2;

sbit L4=P1^3;

uchar

dis[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf 8,0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86, 0x8e };

unsigned int time;

Void delay(time)

{

unsigned int j;

for(j=0;j

{}

}

main()

{

uchar temp;

uchar i;

while(1)

{

P1=0xef;

for(i=0;i<=3;i=i++)

{

if (L1==0) P0= dis [i*4+0];

if (L2==0) P0= dis [i*4+1];

if (L3==0) P0= dis [i*4+2];

if (L4==0) P0= dis [i*4+3];

delay(500);

temp=P1;

temp=temp|0x0f;

temp=temp<<1;

temp=temp|0X0f;

P1=temp;

}

}

}

2.扩展实验:

#include

#define uchar unsigned char

sbit L1=P1^0;

sbit L2=P1^1;

sbit L3=P1^2;

sbit L4=P1^3;

uchar

dis[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf 8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86, 0x8e }; uchar

led[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x 07,0x08,0x09,0x0a,0x0b,0x0c,

0x0d,0x0e,0x0f};

unsigned int time;

void delay(time)

{

unsigned int j;

for(j=0;j

{}

}

main()

{

uchar temp;

uchar i;

while(1)

{

P1=0xef;

for(i=0;i<=3;i=i++)

{

if (L1==0) {P0= dis [i*4+0];P3=led[i*4+0];}

if (L2==0) {P0= dis [i*4+1];P3=led[i*4+1];}

if (L3==0) {P0= dis [i*4+2];P3=led[i*4+2];}

if (L4==0) {P0= dis [i*4+3];P3=led[i*4+3];}

delay(500);

temp=P1;

temp=temp|0x0f;

temp=temp<<1;

temp=temp|0X0f;

P1=temp;

}

}

}

相关文档
最新文档