键盘及LED显示实验
- 格式:doc
- 大小:79.50 KB
- 文档页数:9
实验三键盘及LED显示实验
一、实验内容
利用8255可编程并行接口控制键盘及显示器,当有按键按下时向单片机发送外部中断请求(INT0,INT1),单片机扫描键盘,并把按键输入的键码一位LED 显示器显示出来。
二、实验目的及要求
(一)实验目的
通过该综合性实验,使学生掌握8255扩展键盘和显示器的接口方法及C51语言的编程方法,进一步掌握键盘扫描和LED显示器的工作原理;培养学生一定的动手能力。
(二)实验要求
1.学生在实验课前必须认真预习教科书与指导书中的相关内容,绘制流程图,编写C51语言源程序,为实验做好充分准备。
2.该实验要求学生综合利用前期课程及本门课程中所学的相关知识点,充分发挥自己的个性及创造力,独立操作完成实验内容,并写出实验报告。
三、实验条件及要求
计算机,C51语言编辑、调试仿真软件及实验箱50台套。
四、实验相关知识点
1.C51编程、调试。
2.扩展8255芯片的原理及应用。
3.键盘扫描原理及应用。
4.LED显示器原理及应用。
5.外部中断的应用。
五、实验说明
本实验仪提供了8位8段LED显示器,学生可选用任一位LED显示器,只要按地址输出相应的数据,就可以显示所需数码。
六、实验原理图
P1口桥接。
八、实验参考流程图
1.主程序流程图
2.外中断服务程序流程图
外部中断0 外部中断1
定时器0中断程序,用于消抖动:
3.LED显示程序流程图
九、C51语言参考源程序
#include "reg52.h"
unsigned char KeyResult; //存放键值
unsigned char buffer[8]; //显示缓冲区
bit bKey; //是否有键按下
xdata unsigned char P_8255 _at_ 0xf003; //8255的控制口
xdata unsigned char PA_8255 _at_ 0xf000; //8255的PA口
xdata unsigned char PB_8255 _at_ 0xf001; //8255的PB口
xdata unsigned char PC_8255 _at_ 0xf002; //8255的PC口
code unsigned char SEG_TAB[] = { //段码
0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x0};
sbit bLine0 = P3^2;
sbit bLine1 = P3^3;
//延时1ms
void Delay1ms()
{
unsigned char i;
i = 0;
while (--i);
}
//显示
void Display()
{
unsigned char i = 0x7f;
unsigned char 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; //关外部中断0
P_8255 = 0x89; //PC口输入
bLine0 = 0; //P3.2作行输出
while (i)
{
if ((PC_8255 & i) == 0)
break;
KeyResult0++;
i >>= 1;
}
P_8255 = 0x80; //8255的PA、PB、PC口全作输出口PC_8255 = 0;
bLine0 = 1;
if (i)
{
TH0 = 60; //定时中断计数器初值
TL0 = 176; //定时50ms
TR0 = 1;
KeyResult = KeyResult0;
}
IE0 = 0; //清除中断
EX0 = 1; //开外部中断0
}
void Int1Int() interrupt 2
{
unsigned char i = 0x80;
unsigned char KeyResult0 = 8;
EX1 = 0; //关外部中断0
P_8255 = 0x89; //PC口输入
bLine1 = 0; //P3.2作行输出
while (i)
{
if ((PC_8255 & i) == 0)
break;
KeyResult0++;
i >>= 1;
}
P_8255 = 0x80; //8255的PA、PB、PC口全作输出口PC_8255 = 0;
bLine1 = 1;
if (i)
{
TH0 = 60; //定时中断计数器初值
TL0 = 176; //定时50ms
TR0 = 1;
KeyResult = KeyResult0;
}
IE1 = 0; //清除中断
EX1 = 1; //开外部中断0
}