键盘及LED显示实验

  • 格式:doc
  • 大小:79.50 KB
  • 文档页数:9

下载文档原格式

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

实验三键盘及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

}