当前位置:文档之家› 《单片机原理及应用》“实验五 按键及显示实验”任务书

《单片机原理及应用》“实验五 按键及显示实验”任务书

单片机原理及应用
随堂实验报告
实验五按键与显示实验
学院计算机与电子信息学院
专业电子信息工程班级电信12 -1 班
姓名许锐佳学号
指导教师左敬龙
实验报告评分:_______
一、实验原理及电路
实验原理:单片机80c51的P2口接一矩阵键盘,P0和P3口接两个数码管,P1口通过接两个3-8译码器控制16个灯。

刚开始时,电路处于扫描按键是否按下的状态,当有某个键按下时,在扫描函数作用下,会有一小段消抖时间,确定没抖动的情况下再次判断是否真的有按键按下,如果真的有按下,通过先检查行,再检查列的方法判断是哪个键按下,判断完后执行对应case后面的语句,即实现相应的功能。

下图为实验原理电路图
(此时按下的是第10个按键):
二、功能说明
16个开关形成矩阵键盘,当按下第一个键时,数码管显示1,第一个led灯亮;当按下第二个键时,数码管显示2,第二个led灯亮;当按下第三个键时,数码管显
示3,第三个led灯亮···依次类推,按下第几号键,数码管显示对应号数,对应led灯亮。

三、实验框图:
四、实验代码
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar
table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07 ,0x7f,0x6f,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d}; uchar num;
void delay(uchar time)
{
uchar i,j;
for(i=0;i<time;i++)
for(j=0;j<110;j++);
}
void display1(uchar num)
{
P0=table[0];
P3=table[num];
}
void display2(uchar num)
{
P0=table[1];
P3=table[num];
}
void keyscan()
{
uchar t,key;
P2=0xfe;
t=P2;
t=t&0xf0;
if(t!=0xf0)
{
delay(10);
t=P2;
t=t&0xf0;
if(t!=0xf0)
{
t=P2;
switch(t)
{
case
0xee:key=1;display1(key);P1=0x80;break;
case
0xde:key=2;display1(key);P1=0x81;break;
case
0xbe:key=3;display1(key);P1=0x82;break;
case
}
}
}
P2=0xfd;
t=P2;
t=t&0xf0;
if(t!=0xf0)
{
delay(10);
t=P2;
t=t&0xf0;
if(t!=0xf0)
{
t=P2;
switch(t)
{
case
0xed:key=5;display1(key);P1=0x84;break;
case
0xdd:key=6;display1(key);P1=0x85;break;
case
case
0x7d:key=8;display1(key);P1=0x87;break;
}
}
}
P2=0xfb;
t=P2;
t=t&0xf0;
if(t!=0xf0)
{
delay(10);
t=P2;
t=t&0xf0;
if(t!=0xf0)
{
t=P2;
switch(t)
{
case
0xeb:key=9;display1(key);P1=0x40;break;
case
case
0xbb:key=11;display2(key);P1=0x50;break;
case
0x7b:key=12;display2(key);P1=0x58;break;
}
}
}
P2=0xf7;
t=P2;
t=t&0xf0;
if(t!=0xf0)
{
delay(10);
t=P2;
t=t&0xf0;
if(t!=0xf0)
{
t=P2;
switch(t)
{
case
case
0xd7:key=14;display2(key);P1=0x68;break;
case
0xb7:key=15;display2(key);P1=0x70;break;
case
0x77:key=16;display2(key);P1=0x78;break;
}
}
}
}
void main()
{
P1=0x00;
P0=0x3f;
P3=0x3f;
while(1)
{
keyscan();
}
}
五、实验过程
一开始实验时,16个led灯不知要怎么接,因为每个灯接一个接口太浪费,后来想到可以用3-8译码器,这样就能节省很多接口,只需占用P1六个接口就能实现对16个灯的控制。

但是后来又发现,译码器E1给高电平,E2非、E3非给低电平虽然能实现译码,但是没法独立控制16个灯,只能控制一排8个灯,另一排的显示结果与前一排相似,于是,再次查看3-8译码器各引脚功能,发现E1给低电平时能保持原有结果,而且P1口剩两个接口,因此我立马将两个译码器的E1口接到P1口剩下的两个接口,通过给E1高低电平实现对第一排8个led灯和第二排8个led灯的独立控制。

六、实验小结
本次按键与显示实验难度适中,虽然成功完成实验,但是个人感觉自己做的这个功能比较简单,而且程序也编的比较繁琐,不够简洁,编程方面还得多练,自己也得尝试做一些功能更为复杂的,不能满足于现状。

相关主题