基于单片机的矩阵键盘操作实验

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

实验十二基于单片机的矩阵键盘操作实验

12.1 实验目的

1. 掌握单片机AT89C52与矩阵键盘的接口技术。

2. 用protues实现该接口的电路设计和程序设计,并进行实时交互仿真。

3. AT89C52单片机对4×4矩阵键盘进行动态扫描,当按完一次键盘时,可

将相应按键值(0-F)实时显示在数码管上。

12.2 PROTUES电路设计

单片机与矩阵键盘的接口电路原理图如图12-1所示。

图12-1 单片机与矩阵键盘的接口电路原理图

12.3 实验内容

键盘分编码键盘和非编码键盘。键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘。在单片机组成的各种系统中,用的最多的是非编码键盘,也有用到编码键盘的。

1.从PROTUES库中选取元器件

① AT89C52:单片机;

② RES:电阻;

③ 7SEG-MPX2-CC-BLUE:七段共阴绿色数码管;

④ CAP/CAP-ELEC:电容、电解电容;

⑤ CRYSTAL:晶振;

⑥ BUTTON:按键。

2.放置元器件

3.放置电源和地(终端)

4.连线

5.元器件属性设置

6.电气检测

12.4 程序设计

1. 流程图

矩阵键盘操作程序流程图如图12-2所示。

图12-2 矩阵键盘操作程序流程图

2.源程序设计

C程序设计:

#include

#define uint unsigned int

#define uchar unsigned char

sbit we1=P1^0;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71,0};

uchar num,temp,num1;

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

uchar keyscan();

void display(uchar aa);

void main()

{

num=17;

while(1)

{

display(keyscan());

}

}

void display(uchar aa)

{

P2=table[aa-1];

we1=0;

}

uchar keyscan()

{

P3=0xfe;

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay(5);

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xee:num=1;

break;

case 0xde:num=2;

break;

case 0xbe:num=3;

break;

case 0x7e:num=4;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

P3=0xfd;

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay(5);

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xed:num=5;

break;

case 0xdd:num=6;

break;

case 0xbd:num=7;

break;

case 0x7d:num=8;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

P3=0xfb;

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay(5);

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xeb:num=9;

break;

case 0xdb:num=10;

break;

case 0xbb:num=11;

break;

case 0x7b:num=12;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

P3=0xf7;

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay(5);

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xe7:num=13;

break;

case 0xd7:num=14;

break;

case 0xb7:num=15;

break;

case 0x77:num=16;

break;

}

while(temp!=0xf0)

{

相关文档
最新文档