当前位置:文档之家› 键盘与LED显示实验

键盘与LED显示实验

实验三键盘及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 显示器,只要按地址输出相应的数据,就可以显示所需数码。

显示字形123456789AbCdEF段 码 0xfc 0x60 0xda 0xf2 0x66 0xb6 0xbe 0xe0 0xfe 0xf6 0xee 0x3e 0x9c 0x7a 0x9e 0x8e六、实验原理图01e 1d 2dp3c 4g 56b 789a b c g d dpf 10a b f cg dedpa 11GND3ab fc g dedp12GND4a b f c g dedpGND1GND2DS29LG4041AH23456789A B C D E Fe 1d 2dp3c 4g 56b 789a b c g d dpf 10a b f cg dedpa 11GND3ab fc g dedp12GND4a b f c g d edpGND1GND2DS30LG4041AH12345678JP4112345678JP4712345678JP42SEGA SEGB SEGC SEGD SEGE SEGG SEGF SEGHSEGA SEGB SEGC SEGD SEGE SEGG SEGF SEGHACB12345678JP92D5.1K R1625.1KR163VCC VCC D034D133D232D331D430D529D628D727PA04PA13PA22PA31PA440PA539PA638PA737PB018PB119PB220PB321PB422PB523PB624PB725PC014PC115PC216PC317PC413PC512PC611PC710RD 5WR 36A09A18RESET 35CS6U368255D0D1D2D3D4D5D6D7WRRD RSTA0A1PC5PC6PC7PC2PC3PC4PC0PC1CS12345678JP5612345678JP5312345678JP52PA0PA1PA2PA3PA4PA5PA6PA7PB0PB1PB2PB3PB4PB5PB6PB7(8255 PB7)(8255 PB6)(8255 PB5)(8255 PB4)(8255 PB3)(8255 PB2)(8255 PB1)(8255 PB0)(8255 PC7)(8255 PC6)(8255 PC5)(8255 PC4)(8255 PC3)(8255 PC2)(8255 PC1)(8255 PC0)(8255 PA0)(8255 PA1)(8255 PA2)(8255 PA3)(8255 PA4)(8255 PA5)(8255 PA6)(PA7)I N T 0(P 3.2)I N T 0(P 3.3)七、连线说明F4区:CS、A0、A1 ——A3区:CS1、A0、A1B6区:JP56(PA口)——F4区:JP41(C)B6区:JP53(PB口)——F4区:JP42(B)B6区:JP52(PC口)——F4区:JP47(A)A3区:JP51 ——F4区:JP92(D)A3区:P1.6、P1.7 ——A3区:INT0、INT1注:F4的D无法与INT0(P3.2)、INT1(P3.3)直接连接,所以使用P1口桥接。

八、实验参考流程图1.主程序流程图Y按键标志=1开始0->按键标志8255初始化(PA, PB, PC 口作输出) 0->8255PC 口定时器0:方式一 允许定时器0中断 允许外部中断0(行线0) 允许外部中断1(行线1) 外部中断0、1边沿触发 允许中断0->按键标志 显示缓冲区左移一次 键值->最低位显示缓冲区调用显示N0x10填充显示缓冲区(消隐)2.外中断服务程序流程图外部中断0外部中断1Y清外部中断0 允许外部中断0有键按下开始8255PC 口改为输入 关外部中断00->P3.2(键的行线0)读8255PC 口转化为0..7的键值->变量08255的PC 口改为输出 1->P3.2 0->8255PC 口 设置定时器0初值(50ms 定时) 开定时器0 键值变量=变量0N定时器0中断程序,用于消抖动:Y1->按键标志P3.2=0开始 N中断返回键值变量<8P3.3=0键值变量>=8N YNNYYY清外部中断1 允许外部中断1有键按下开始8255PC 口改为输入 关外部中断10->P3.3(键的行线1)读8255PC 口转化为8..F 的键值->变量08255的PC 口改为输出 1->P3.3 0->8255PC 口 设置定时器0初值(50ms 定时) 开定时器0 键值变量=变量0N中断返回3.LED 显示程序流程图九、C51语言参考源程序#include "reg52.h"unsigned char KeyResult; //存放键值 unsigned char buffer[8]; //显示缓冲区 bit bKey;//是否有键按下xdata unsigned char P_8255 _at_ 0xf003;//8255的控制口7FH->数码块选择变量 8->计数器数码块选择变量->8255PA 口 显示缓冲区中对应数据转化为段码 段码->8255PB 口数码块选择变量循环右移一次 延时1ms开始计数器 – 1 = 0返回YNxdata 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;//延时1msvoid 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; //关外部中断0P_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; //定时50msTR0 = 1;KeyResult = KeyResult0;}IE0 = 0; //清除中断EX0 = 1; //开外部中断0}void Int1Int() interrupt 2{unsigned char i = 0x80;unsigned char KeyResult0 = 8;EX1 = 0; //关外部中断0P_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; //定时50msTR0 = 1;KeyResult = KeyResult0;}IE1 = 0; //清除中断EX1 = 1; //开外部中断0}//50ms中断服务程序void INT_Timer0(void) interrupt 1{if (((KeyResult < 8) && !bLine0) ||((KeyResult >= 8) && !bLine1)){bKey = 1; //有键按下,键值在KeyResult中}TR0 = 0;}void main(){char i;bKey = 0; //没有键按下TMOD = 1; //定时器0:方式一P_8255 = 0x80; //8255的PA、PB、PC口全作输出口PC_8255 = 0x0;ET0 = 1; //开定时器0中断EX0 = 1; //开外部中断0EX1 = 1; //开外部中断1IT0 = 1; //边沿触发IT1 = 1; //边沿触发EA = 1; //允许中断for (i = 0; i < 8; i++)buffer[i] = 0x10;// TR0 = 1; //开定时器T0// bRefurbish = 1;while (1){if (bKey){bKey = 0;RefurbishData();}Display(); //调用显示}}十、实验实施步骤1.仔细阅读实验内容及要求,编写C51源程序。

相关主题