实验七 单片机键盘LED显示实验

合集下载

键盘显示程序设计实验

键盘显示程序设计实验

实验四键盘显示程序设计实验目的1、理解串行接口键盘单片机汇编语言程序的基本结构2、了解单片机汇编语言程序的设计和调试方法3、掌握几个的基本的传送类、控制类指令的使用方法实验仪器单片机开发板、万利仿真机、稳压电源、计算机实验原理1、键盘接口电路工作原理串行接口键盘盘电路如图4-15所示。

键盘扫描线与显示位选扫描信号共用。

键盘输入只需要一根线,电路简单。

键盘扫描信号从74LS164输出,低电平有效。

当扫描到某个键时,若按键按下,在KEY端得到低电平,否则得到高电平。

通过判断KEY的电平就可以知道相应键盘是否按下。

图4-15 键盘接口电路图2、读键盘程序设计从上面工作原理分析可知,读键程序可以和显示程序结合在一起,也可以单独设计。

这种结构的键盘同样存在抖动问题。

为了减少程序误动作,程序设计时也要考虑去抖动问题。

这里设计一个把键值显示在LED上的程序。

为了简化问题,把读键程序与显示结合起来。

程序流程图如图4-16所示。

图4-16 键盘扫描程序流程图实验内容1、设计程序把键值显示在数码管。

#include<reg52.h>#include"display.h"extern uchar point;extern uchar table[8];uchar t,temp,time;char num;bit flag1;/*void main(){uchar i;table[0]=0x0;for(i=1;i<8;i++)table[i]=0x11;while(1){num=dispkey();if(flag==1)table[0]=num;delay_1ms(2);}}*//************************************************************2、设计程序按不同键时实现不同功能。

功能:按向上键:最右边一位数码管数值加1(0-9),到9时加1回到0 按向下键:最右边一位数码管数值减加1(9-0),到0时减1回到9按向左键:显示数字左移一位按向右键:显示数字右移一位keypointr:短按小数点右移,长按显示学号;接口:上下左右keypointrkeypointl**************************************************************/ void main(){uchar i,j=7,k=0;for(i=0;i<8;i++)table[i]=0x11;TMOD=0x01;EA=1;TH0=(65536-20000)/256;TL0=(65536-20000)%256;ET0=1;TR0=1;table[7]=0x1;while(1){delay_1ms(5);temp=dispkey();switch(temp){case 5: if ( flag==0){num=++table[j];//加1if(num==10)num=0;table[j]=num;delay_1ms(1);}; flag=1; break;case 4:if ( flag==0){num=--table[j];//减1if(num==-1)num=9;table[j]=num;delay_1ms(1);};flag=1;break;case 2: if ( flag==0) //右移{if(j==7){table[0]=table[7];table[7]=0x11;j=0;continue;}table[j+1]=table[j];//左边赋给右边j++;table[j-1]=0x11;delay_1ms(1);//关闭左一位};flag=1;break;case 8:if ( flag==0){ //左移if(j==0){table[7]=table[0];table[0]=0x11;j=7;continue;}table[j-1]=table[j];//右边赋给左边j--;table[j+1]=0x11;delay_1ms(1);//关闭右一位};flag=1;break;case 1:if ( flag==0) //小数点右移{if(flag1==1){table[0]=0x9;table[1]=0x4;table[2]=0x0;table[3]=0x8;table[4]=0x1;table[5]=0x0;table[6]=0x3;table[7]=0x1;}else{if(k==7){ point=tablepoint[7];k=0;continue;}point=tablepoint[k];k++;delay_1ms(1);}};flag=1;break;default:flag=0; break;}}}void timer0() interrupt 1{TH0=(65536-20000)/256;TL0=(65536-20000)%256;t++;time++;if(temp==1){if(time==50){if(temp==1)flag1=1;time=0;}}}/*******************************************************显示函数*******************************************************///#define __DISPLAY_H__#include"display.h"uchar code disptable[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0x71,0xfe,0xff};//0~F数码代码uchar code tablepoint[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 }; uchar point;uchar table[8];void delay_1ms(uchar z){uint x,y;for(x=z;x>0;x--)for(y=123;y>0;y--);}uchar dispkey(void){uchar i,keynum=0;i=8;DA T=disptable[table[i-1]];if(point&tablepoint[i-1])DA T=DA T&0xfe; //加入小数点DISPDIN =0;DISPCLK =0;DISPCLK =1;DISPDIN =1;delay_1ms(1);if(!key){delay_1ms(5);if(!key) keynum=i;}for (i=7;i>0;i--){DA T =0xff;DA T =disptable[table[i-1]];if(point&tablepoint[i-1])DA T=DA T&0xfe; //加入小数点DISPCLK =0;DISPCLK =1;delay_1ms(1);if(!key){delay_1ms(5);if(!key) keynum=i;}}DA T=0xff;return keynum;}思考题1、当按加1键时,每按一次数码管值变化可能超过1,是什么原因?答:原因是机械按键会有抖动现象,所以每按一次数码管值变化可能超过1。

单片机独立按键控制led灯实验原理

单片机独立按键控制led灯实验原理

主题:单片机独立按键控制LED灯实验原理目录1. 概述2. 单片机独立按键控制LED灯实验原理3. 实验步骤4. 结语1. 概述单片机在现代电子设备中起着至关重要的作用,它可以通过编程实现各种功能。

其中,控制LED灯是单片机实验中常见的任务之一。

本文将介绍单片机独立按键控制LED灯的实验原理及实验步骤,希望对初学者有所帮助。

2. 单片机独立按键控制LED灯实验原理单片机独立按键控制LED灯的实验原理主要涉及到单片机的输入输出端口及按键和LED的连接方式。

在单片机实验中,按键与单片机的输入端口相连,LED与单片机的输出端口相连。

通过按键的按下和松开来改变单片机输出端口电平,从而控制LED的亮灭。

3. 实验步骤为了完成单片机独立按键控制LED灯的实验,需要按照以下步骤进行操作:步骤一:准备材料- 单片机板- 按键- LED灯- 连线- 电源步骤二:搭建电路- 将按键与单片机的输入端口相连- 将LED与单片机的输出端口相连- 连接电源步骤三:编写程序- 使用相应的单片机开发软件编写程序- 程序中需要包括按键状态检测和LED控制的部分步骤四:烧录程序- 将编写好的程序烧录到单片机中步骤五:运行实验- 按下按键,观察LED的亮灭情况- 确保按键可以正确控制LED的亮灭4. 结语通过上述实验步骤,我们可以实现单片机独立按键控制LED灯的功能。

这个实验不仅可以帮助学习者了解单片机的输入输出端口控制,还可以培养动手能力和程序设计能力。

希望本文对单片机实验初学者有所帮助,谢谢阅读!实验步骤在进行单片机独立按键控制LED灯实验时,需要按照一定的步骤进行操作,以确保实验能够顺利进行并取得预期的效果。

下面将详细介绍实验步骤,帮助读者更好地理解和掌握这一实验过程。

1. 准备材料在进行单片机独立按键控制LED灯实验前,首先需要准备相应的材料。

这些材料包括单片机板、按键、LED灯、连线和电源。

在选择单片机板时,需要根据具体的实验需求来确定,常见的有51单片机、Arduino等,不同的单片机板具有不同的特性和使用方法,因此需要根据实验要求来选择适合的单片机板。

键盘与数码管静态显示实验-单片机-程序

键盘与数码管静态显示实验-单片机-程序

键盘与数码管静态显示实验实验内容:1、根据电路图图1和图2编写按键程序,左侧第一位数码管显示独立式按键编号“1”、“2”、“3”、“4”,哪一个按下,对应的编号显示在左侧第一位数码管(左侧第二个数码管为全灭状态),右侧二位数码管显示“00--15”的十进制键值,无键按下时数码管为全灭状态。

图1 动态显示电路图图2 键盘接口电路图评分表unsigned char code led_code[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09 ,0x11,0xc1,0x63,0x85,0x61,0x71,0xff}; unsigned char dis_buf[4];unsigned char i;unsigned char aa,bb,cc,lie;sbit key1=P2^0;sbit key2=P2^1;sbit key3=P2^2;sbit key4=P2^3;sbit led_clk= P1^6 ;sbit led_data = P1^7 ;void delay_ms(unsigned int i){unsigned char j;for(i;i>0;i--){for(j=110;j>0; j-- );}}void key_scan(void){P3=0Xf0;if((P3&0xf0)!=0xf0){aa=0xfe;for(lie=0;lie<4;lie++){P3=aa;aa=(aa<<1)|0x01;if((P3&0xf0)!=0xf0){bb=P3&0Xf0;switch(bb){case 0xe0:cc=lie;break;case 0xd0:cc=lie+4;break;case 0xb0:cc=lie+8;break;case 0x70:cc=lie+12;break;default :cc=16;break;}}}}else cc=16;}void led_display ( ){unsigned char t,i;unsigned char input_code;for(i=0;i<4;i++){input_code=led_code[dis_buf[i]];for (t=0;t<8;t++){if( input_code & 0x01 ){led_data=1;}else{led_data=0;}led_clk=0;input_code>>=1;led_clk=1;}}}void main (){unsigned char num;while(1){key_scan();if(key1==0){delay_ms(10);if(key1==0){num=1;}}else if(key2==0){delay_ms(10);if(key2==0){num=2;}}else if(key3==0){delay_ms(10);if(key3==0){num=3;}}else if(key4==0){delay_ms(10);if(key4==0){num=4;}}else {num=16;}dis_buf[2]=16;dis_buf[3]=num;if(cc!=16){dis_buf[1]=cc/10;dis_buf[0]=cc%10;}else{dis_buf[1]=16;dis_buf[0]=16;}led_display ();delay_ms(300);}}[文档可能无法思考全面,请浏览后下载,另外祝您生活愉快,工作顺利,万事如意!]。

按键输入和LED数码管扫描显示实验

按键输入和LED数码管扫描显示实验

按键输入和LED数码管扫描显示实验设计内容:给8个按键键盘的每个键定义一个功能,从左到右按键一次按下时,分别显示数字1-8,当有两个及以上的按键按下时,显示数字9。

LCD初始显示个人学号,当有按键按下时,最后一位显示对应的数字。

实验程序:#include <reg51.h>sbit key=P0^6; //键盘公共线,见原理图sbit ls1=P0^2; //千位公共极sbit ls2=P0^3; //百位公共极sbit ls3=P0^4; //十位公共极sbit ls4=P0^5; //个位公共极unsigned char keyval; //读取的键值#define Dat P1 //数据输出端char a;char b[4]={0,3,3,0}; //初始值为学号后四位unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//延时----------------------------Delay(unsigned int t){ while(t--); }//显示----------------------------void Display(unsigned char mun){ unsigned char j;for(j=0;j<50;j++){ Dat=a;Dat=tab[b[0]]; //把得到7段显示码数据送P1端口ls1=0; //点亮千位Delay(100); //显示一会ls1=1; //关闭,显示下一位Dat=tab[b[1]];ls2=0; //点亮百位Delay(100);ls2=1;Dat=tab[b[2]];ls3=0; //点亮十位Delay(100);ls3=1; //个位Dat=tab[b[3]];ls4=0;Delay(100);ls4=1;}}Dat=0xff; //P1恢复为0xff}//--键盘扫描程序-------------------------------------- Scankey(){ unsigned char i;key=0; //拉低键盘公共线if(Dat!=0xff) //有键按下{ Delay(1000); //消抖动if(Dat!=0xff) //有键按下{ i=~Dat;a=Dat; //读取键盘状态,switch(i){ case 0x01: keyval=0x01;break; //K1case 0x02: keyval=0x02;break; //K2case 0x04: keyval=0x03;break; //K3case 0x08: keyval=0x04;break; //K4case 0x10: keyval=0x05;break; //K5case 0x20: keyval=0x06;break; //K6case 0x40: keyval=0x07;break; //K7case 0x80: keyval=0x08;break; //K8default: keyval=0x09;break; } //其它双键按下不处理,均为9 b[3]=b[2];b[2]=b[1];b[1]=b[0];b[0]=keyval;while(Dat!=0xff){key=1; //暂时关闭键盘,不干扰显示Display(keyval); //等待按键抬起key=0; //开启键盘检测}}}key=1; //释放键盘公共线}//--主程序--------------------------------------------------------- main(){while(1){ Display(keyval); //显示Scankey(); //键盘扫描}}。

七段数码显示器显示实验报告

七段数码显示器显示实验报告

七段数码显示器显示实验报告单片机原理及接口技术实验报告实验项目:姓名:专业:班级:学号:一、实验名称七段数码显示器显示实验(SPI通信方式)二、实验设备PC机1台,CEPARK畅学系列实验装置1套三、实验目的1.熟悉I/O口作为数字量输出的初始化;2.熟悉共阳极与共阴极两种数码管的工作原理;3.学会软硬件的设计和调试方法;4.根据七段数码管的特性,对应出每个数字引脚输出的16进制码,然后编写程序。

四、实验要求1.将0-9这十个数字按顺序依次在数码管上显示出来,时间间隔为0.5S;2.熟悉延时函数的使用(可用for循环自己写一个延时函数);3.掌握PIC16F877A芯片及电子元件的使用方法;4.实现单片机软件与硬件的结合,将理论知识应用于实践。

五、理论原理1.LED七段数码显示器由8个发光二极管组成显示字段,根据内部发光二极管的连接形式不同,LED有共阴极和共阳极两种(原理图如下图1所示)。

(实验板采用的LED为共阳极的连接方式)图1.单个共阳极数码管原理图2.接口说明:接口编号为JP44,需要一个8位端口(A~G、DP)去控制,因此提供给LED的字形码也是8位的。

数码管各段编号如下图2所示:图2.数码管各段编号3.LED七段数码显示器各字段与控制端口位的对应关系如下表1所示:表1. 七段数码显示器各字段与控制端口位的对应关系控制端口位D7 D6 D5 D4 D3 D2 D1 D0 字段名dp g f e d c b a 4.共阳极LED七段数码显示器字形代码如下表2所示:字形显示编码字形显示编码0 C0H 9 90H1 F9H A 88H2 A4H b 83H3 B0H C C6H4 99H d A1H5 92H E 86H6 82H F 8EH7 F8H .(小数点)7FH8 80H -(负号)BFH六、实验内容步骤1.接线说明核心板RD口接底板JP15,具体为:RD0-A,RD1-B,RD2-C,RD3-D,RD4-E,RD5-F,RD6-G,RD7-DP2.创建项目打开MPLAB IDE v8.90 →选择Project,进入Project Wizard,进入下面的界面,单击下一步。

键盘、数码管显示综合实验

键盘、数码管显示综合实验

实验项目名称:键盘、数码管显示综合实验实验室(中心):电子实验室实验完成时间: 09 年11 月 5 日1一.实验目的与要求通过实验,掌握单片机在输入输出口线不够用时,怎样扩展接口的方法来支持8位LED 显示和16键盘集成实现。

熟悉8155、8279等芯片性能;掌握其编程方法。

掌握键盘子程序调试方法,掌握按一个键并将键值显示出来的编程方法,这是诊断硬件、测试硬件、产品开发、软件编程必须掌握的方法。

二.实验原理及实验线路(1)通过8155芯片的扩展功能,建立描述线与数据线同步功能,如图三.实验内容①编写并调试出一个键盘实验子程序;②用子程序调用方法,分别调用键盘子程序和显示子程序,将按一个键的键值(0-F),在数码管上显示出来。

四.实验器材表2.4.5(1):以8155为扩展方式的器件80C51.BUS CRYSTAL PHYC0402NP022P7404 7SEG-MPX6-CC-BLUE RESPACK-88155 HITEMP10U50VBUTTON MINRES10K五、实验程序流程图六.实验步骤1)仿真实验过程:打开Keil程序,执行菜单命令“Project”→“New Project”创建“键盘数码管显示综合实验”项目,并选择单片机型号为AT89C52.BUS。

执行菜单命令“File”→“New”创建文件,输入源程序,保存为“键盘数码管显示综合实验.A51或键盘数码管显示综合实验.c”。

在“Project”栏的File项目管理窗口中右击文件组,选择“Add Files to Group ‘Source Group1’”将源程序“键盘数码管显示综合实验.A51或键盘数码管显示综合实验.c”添加到项目中。

执行菜单命令“Project”→“Options for Target ‘Target 1’”,在弹出的对话框中选择“Output”选项卡,选中“Greate HEX File”。

执行菜单命令“Project”→“Build Target”,编译源程序。

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

六、实验原理图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;//延时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源程序。

单片机工程实践完成蜂鸣器、键盘、七段LED_显示器的自检程序设计。概要

单片机工程实践完成蜂鸣器、键盘、七段LED_显示器的自检程序设计。概要

学校代码: 10128(第11组)题目:电子秒表(任务一)组长:雷小宇指导教师:刘伟、刘海伦、裴岩、杨传颖、斯日古楞、高鹏、韩海波、陈宇(研)设计时间:2013年6月17日~2013年6月28日一、设计目的:(题目四号宋体字)通过一个以8 位单片机为核心的模拟量数字表的硬件调试过程,掌握具有A/D、七段LED 显示、RS-485 通信、Watchdog 等接口电路的单片机应用系统的设计思想和方法。

学习应用系统软件的模块化设计方法,通过源程序的编辑、汇编或编译、链接、仿真调试,完成给定的任务。

通过上述过程提高学生工程实践能力和素质。

二、设计任务:要求明确设计任务内容及任务分工等;(内容小四号宋体字)★基本任务:完成蜂鸣器、键盘、七段LED 显示器的自检程序设计。

(1)蜂鸣器自检要求:利用程序实现两种以上声音。

(2)键盘自检要求:确定键盘正确。

(3)七段LED 显示器自检要求:确定LED 显示器每一段均正确。

框图(包括自检和任务的框图):1、硬件编程框图及相关说明2、主程序框图、子程序框图及相关说明三、程序清单:要求有明确的程序注解、程序清单可分两栏打印(1)蜂鸣器自检程序BEEP:setb p2.3 ;关喇叭acall delay1 ;调用延时1clr p2.3 ;开喇叭acall DELAY2 ;调用延时2setb p2.3 ;关喇叭acall DELAY2 ;调用延时2clr p2.3 ;开喇叭acall DELAY3 ;调用延时3setb p2.3 ;关喇叭acall DELAY3 ;调用延时3sjmp BEEP ;跳到beepRETDELAY1: ;延时子程序MOV R1,#0FFHCX0: MOV R2,#0FFHCX: DJNZ R2,CXDJNZ R1,CX0RETDELAY2: 延时子程序MOV R1,#0FAHCX1: MOV R2,#0FAHCX2: DJNZ R2,CX2DJNZ R1,CX1RETDELAY3: 延时子程序MOV R1,#0FAHCX3: MOV R2,#0FAHCX4: DJNZ R2,CX4DJNZ R1,CX3RET(2)键盘自检程序BEEP:MOV R1,#4H ;设置移位次数LCALL SEL8 ;打开三态门MOV P1 ,#0FFH ;将P1口设置成I/OMOV A,P1 ;采样LCALL SEL7 ;关闭三态门SJMP CXW1RETCXW1: RRC A ;把键的值放到进位位JNC CXW2 ;如果键合上,跳到CXW2,发音子程序DJNZ R1,CXW1 ;(K1没闭合,就看K2是否闭合;K2没闭合,就看K3是否闭合;K3没闭合,就看K4是否闭合)SJMP BEEP ;四个键都没闭合,就重新采样RETCXW2: CLR P2.3 ;开喇叭LCALL DELAY ;调用延时SETB P2.3 ;关喇叭SJMP BEEP ;发音完毕,跳转到BEEP,重新采样RETSEL7: CLR P2.7 ;(关闭三态门子程序)SETB P2.6SETB P2.5RETSEL8: SETB P2.7 ;(打开三态门子程序)SETB P2.6SETB P2.5RETDELAY: MOV R6,#0AH ;(延时子程序)CXW3: MOV R7,#0F8HCXW4: DJNZ R7,CXW4DJNZ R6,CXW3RET(3)七段LED 显示器自检程序DT1: CLR P2.5 ;(使第一位LED 有效,并显示从1到9) CLR P2.6 CLR P2.7 LCALL cc1 RETDT2: CLR P2.5 ;(使第二位LED 有效,并显示从1到9) CLR P2.6 SETB P2.7 LCALL cc1RET设置移位次数打开三态门采样关三态门K1闭合?K2闭合?K4闭合?峰鸣器发音K3闭合?YNNNYYNY调用延时程序DT3: CLR P2.5 ;(使第三位LED有效,并显示从1到9) SETB P2.6CLR P2.7LCALL cc1RETDT4: CLR P2.5 ;(使第四位LED有效,并显示从1到9) SETB P2.6SETB P2.7LCALL cc1RETDT5: SETB P2.5 ;(使第五位LED有效,并显示从1到9) CLR P2.6CLR P2.7LCALL cc1LJMP DT1RETcc1: LCALL SEL0 ;(调用送字型的子程序,使LED显示0到9) LCALL DELAYLCALL SEL1LCALL DELAYLCALL SEL2LCALL DELAYLCALL SEL3LCALL DELAYLCALL SEL4LCALL DELAYLCALL SEL5LCALL DELAYLCALL SEL6LCALL DELAYLCALL SEL7LCALL DELAYLCALL SEL8LCALL DELAYLCALL SEL9LCALL DELAYLCALL SEL10LCALL DELAYRETSEL0: MOV A,#7EH ;SEL1到SEL10是送字型子程序,SEL0是送0子程序MOV P0,ALCALL DELAYRETSEL1: MOV A,#0CH ;(SEL 1是送1子程序)MOV P0,ALCALL DELAYRETSEL2: MOV A,#0B6HMOV P0,A(SEL 2是送2子程序)LCALL DELAYRETSEL3: MOV A,#9EH(SEL3是送3子程序)MOV P0,ALCALL DELAYRETSEL4: MOV A,#0CCH(SEL 4是送4子程序)MOV P0,ALCALL DELAYRET(SEL 5是送5子程序)SEL5: MOV A,#0DAHMOV P0, ALCALL DELAYRET(SEL 6是送6子程序)SEL6: MOV A,#0FAHMOV P0,ALCALL DELAYRET(SEL 7是送7子程序)SEL7: MOV A,#0EHMOV P0,ALCALL DELAYRET(SEL8是送8子程序)SEL8: MOV A,#0FEHMOV P0,ALCALL DELAYRET(SEL9是送9子程序)SEL9: MOV A,#0DEHMOV P0,ALCALL DELAYRET(SEL 10是送小数点子程序,即使小数点亮)SEL10: MOV A,#01HMOV P0,ALCALL DELAYRETDELAY: MOV R6,#9fH(延时子程序)CXW3: MOV R7,#9fHCXW4: DJNZ R7,CXW4DJNZ R6,CXW3RET(4)一首歌的程序编程思路:歌曲是由音调和节拍有机组合而成。

按键输入和LED数码管扫描显示实验

按键输入和LED数码管扫描显示实验

按键输入和LED数码管扫描显示实验设计内容:给8个按键键盘的每个键定义一个功能,从左到右按键一次按下时,分别显示数字1-8,当有两个及以上的按键按下时,显示数字9。

LCD初始显示个人学号,当有按键按下时,最后一位显示对应的数字。

实验程序:#include <reg51.h>sbit key=P0^6; //键盘公共线,见原理图sbit ls1=P0^2; //千位公共极sbit ls2=P0^3; //百位公共极sbit ls3=P0^4; //十位公共极sbit ls4=P0^5; //个位公共极unsigned char keyval; //读取的键值#define Dat P1 //数据输出端char a;char b[4]={0,3,3,0}; //初始值为学号后四位unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//延时----------------------------Delay(unsigned int t){ while(t--); }//显示----------------------------void Display(unsigned char mun){ unsigned char j;for(j=0;j<50;j++){ Dat=a;Dat=tab[b[0]]; //把得到7段显示码数据送P1端口ls1=0; //点亮千位Delay(100); //显示一会ls1=1; //关闭,显示下一位Dat=tab[b[1]];ls2=0; //点亮百位Delay(100);ls2=1;Dat=tab[b[2]];ls3=0; //点亮十位Delay(100);ls3=1; //个位Dat=tab[b[3]];ls4=0;Delay(100);ls4=1;}}Dat=0xff; //P1恢复为0xff}//--键盘扫描程序-------------------------------------- Scankey(){ unsigned char i;key=0; //拉低键盘公共线if(Dat!=0xff) //有键按下{ Delay(1000); //消抖动if(Dat!=0xff) //有键按下{ i=~Dat;a=Dat; //读取键盘状态,switch(i){ case 0x01: keyval=0x01;break; //K1case 0x02: keyval=0x02;break; //K2case 0x04: keyval=0x03;break; //K3case 0x08: keyval=0x04;break; //K4case 0x10: keyval=0x05;break; //K5case 0x20: keyval=0x06;break; //K6case 0x40: keyval=0x07;break; //K7case 0x80: keyval=0x08;break; //K8default: keyval=0x09;break; } //其它双键按下不处理,均为9 b[3]=b[2];b[2]=b[1];b[1]=b[0];b[0]=keyval;while(Dat!=0xff){key=1; //暂时关闭键盘,不干扰显示Display(keyval); //等待按键抬起key=0; //开启键盘检测}}}key=1; //释放键盘公共线}//--主程序--------------------------------------------------------- main(){while(1){ Display(keyval); //显示Scankey(); //键盘扫描}}。

键盘扫描显示实验报告

键盘扫描显示实验报告

一、实验目的1. 理解键盘扫描的基本原理,掌握键盘扫描的方法。

2. 掌握数码管显示的基本原理,实现键盘扫描信息的实时显示。

3. 熟悉8255并行接口芯片在键盘扫描和数码管显示中的应用。

二、实验原理1. 键盘扫描原理:键盘扫描是指通过硬件电路对键盘按键进行检测,并将按键信息转换为可识别的数字信号的过程。

本实验采用行列式键盘,通过扫描键盘的行线和列线,判断按键是否被按下。

2. 数码管显示原理:数码管是一种用来显示数字和字符的显示器,由多个发光二极管(LED)组成。

本实验采用七段数码管,通过控制各个段(A、B、C、D、E、F、G)的亮灭,显示相应的数字或字符。

3. 8255并行接口芯片:8255是一款通用的并行接口芯片,具有三个8位并行I/O口(PA、PB、PC),可用于键盘扫描和数码管显示的控制。

三、实验设备1. 实验平台:PC机、8255并行接口芯片、行列式键盘、七段数码管、面包板、导线等。

2. 软件环境:汇编语言编程软件、仿真软件等。

四、实验步骤1. 硬件连接:将8255并行接口芯片、行列式键盘、七段数码管连接到实验平台上,按照电路图进行连线。

2. 编写程序:使用汇编语言编写键盘扫描和数码管显示的程序。

(1)初始化8255并行接口芯片:设置PA口为输出端口,PB口为输出端口,PC口为输入端口。

(2)扫描键盘:通过PC口读取键盘的行线状态,判断是否有按键被按下。

若检测到按键被按下,读取对应的列线状态,确定按键的位置。

(3)数码管显示:根据按键的位置,控制数码管的段(A、B、C、D、E、F、G)的亮灭,显示相应的数字。

3. 仿真调试:使用仿真软件对程序进行调试,确保程序能够正确扫描键盘和显示数字。

五、实验结果与分析1. 实验结果:成功实现了键盘扫描和数码管显示的功能。

当按下键盘上的任意按键时,数码管上会显示对应的数字。

2. 分析:(1)键盘扫描部分:通过读取PC口的行线状态,判断是否有按键被按下。

当检测到按键被按下时,读取PB口的列线状态,确定按键的位置。

键盘、LED发光实验报告

键盘、LED发光实验报告

EDA设计课程实验报告实验题目:键盘、LED发光实验学院名称:专业:班级:姓名:高胜学号小组成员:指导教师:一、实验目的通过实验让同学们进一步了解、熟悉和掌握FPGA开发软件的使用方法及Verilog HDL 的编程方法,并熟悉以Verilog HDL文件为顶层模块的设计;学会和体会分支条件语句case 的使用方法及FPGA I/O口的输出控制。

二、设计任务及要求smartSOPC试验箱上有八个按键KEY1~KEY8和八个发光二极管LED1~LED8。

在smartSOPC试验箱上有KEY1~KEY8通过跳线JP6的KEY1~KEY8分别与芯片的121~124、143、141、158、和156引脚相连(QuickSOPC芯片板上的KEY1~KEY4与SmartSOPC试验箱上KEY1~KEY4是并接的)。

本试验的内容是要求在SmartSOPC试验箱上完成对8个键盘KEY1~KEY8进行监控,一旦有键输入则判断其键值,并点亮相应个发光二极管。

三、系统设计1、整体设计方案FPGA的所有I/O控制块允许每个I/O引脚单独配置为输入口,不过这种配置是系统自动完成的。

当这种I/O口被设置为输入口使用时(如定义key0为输入引脚:input key0;),该I/O控制模块将直接使三态缓冲区的控制端接地,使得该I/O引脚对外呈高阻态,这样该I/O引脚可作为专用输入引脚。

正确分配并锁定引脚后,一旦在KEY1~KEY8中有键输入,即可判断其键值并作出相应的处理。

2、功能模块电路设计(1)输入输出模块框图(见图1)图1(键盘led发光模块图)(2)模块逻辑表达(见表1)表1(按键led发光真值表)(3)算法流程图(见图2)(4)Verilog源代码module ledkey(key,led); //模块名ledkeyinput [7:0]key; //输入按键状态output [7:0]led; //输出led发光状态reg [7:0]k; //定义8位按键状态寄存器k reg [7:0]l; //定义8位led状态寄存器lassign led=l; //输出led发光状态选择always @(key) //定义按键信号变化触发begink=key; //按键状态选择case (k)8'b11111110:l=8'b11111110; //亮一盏led8'b11111101:l=8'b11111100; //亮二盏led8'b11111011:l=8'b11111000; //亮三盏led8'b11110111:l=8'b11110000; //亮四盏led8'b11101111:l=8'b11100000; //亮五盏led8'b11011111:l=8'b11000000; //亮六盏led8'b10111111:l=8'b10000000; //亮七盏led8'b01111111:l=8'b00000000; //亮八盏leddefault:l=8'b11111111; //不亮endcaseendendmodule四、系统调试1、仿真调试(1)仿真代码`timescale 1ns/1nsmodule ledkey_tp;reg [7:0]key;wire [7:0]led;ledkey u1(key,led);initialbegin#100 key=8'b11111110;#100 key=8'b11111101;#100 key=8'b11111011;#100 key=8'b11110111;#100 key=8'b11101111;#100 key=8'b11011111;#100 key=8'b10111111;#100 key=8'b01111111;#100 key=8'b00111111;#100 $finish;endinitial $monitor($time,,,"%b,%b",key,led);endmodulemodule ledkey(key,led);input [7:0]key;output [7:0]led;reg [7:0]k;reg [7:0]l;assign led=l;always @(key)begink=key;case (k)8'b11111110:l=8'b11111110;8'b11111101:l=8'b11111100;8'b11111011:l=8'b11111000;8'b11110111:l=8'b11110000;8'b11101111:l=8'b11100000;8'b11011111:l=8'b11000000;8'b10111111:l=8'b10000000;8'b01111111:l=8'b00000000;default:l=8'b11111111;endcaseendendmodule(2)仿真波形图(见图3)图3(3)波形分析# 0 xxxxxxxx,xxxxxxxx # 100 11111110,11111110 # 200 11111101,11111100# 300 11111011,11111000 # 400 11110111,11110000 # 500 11101111,11100000 # 600 11011111,11000000 # 700 10111111,10000000 # 800 01111111,00000000 # 900 00111111,11111111 (4)引脚图表2-1 引脚锁定方法五、实验感想。

键盘显示单片机实习报告

键盘显示单片机实习报告

电子信息工程专业单片机课程设计报告题目键盘显示模块姓名学号班级指导教师2010年6 月30 日课程设计任务书课程设计题目键盘显示模块课程设计起止日期 6月13日至 6月30日实习地点实验楼106课程设计内容与要求(包括:设计任务及要求、设计原理、所需仪器设备、验收标准)(一)设计任务及要求及格:键盘能识别并能显示键号,即按不同的键后能在对应的位置显示按键的值。

中:能实现按键后能从左到右移动显示。

良:应用单片机定时器完成时钟设计,并能动态循环显示时、分、秒。

优:在良的基础之上,能够对时间进行校准。

(二)设计原理利用单片机扫描键盘来确定行列式2*2键盘是否有键按下,若有键按下则判断是哪个键按下然后在数码管相应位置输出。

(三)所需仪器设备单片机最小系统pc机、伟福仿真器、电源、导线若干指导教师田悦新2010 年 6月 30 日课程设计报告一、设计原理与技术方法:包括:电路工作分析原理与原理图、元器件选择、电路调试方法与结果说明;软件设计说明书与流程图、软件源程序代码、软件调试方法与运行结果说明。

1.电路原理图见附录2.电路工作分析1)键盘工作电路:键盘为2*2的键盘,与单片机的p1.3-p1.6口连接。

工作时先判断有无键按下,检查行输出是否由高电平变成低电平。

然后再判断是哪个键按下。

最后在相应的位置输出对应的信息。

2)数码管显示电路:数码管有四个,前面和一个373锁存器相连,用来锁存显示信息。

373通过一个138三八译码器连接在单片机的p2口,其地址可以算出为6000H,数码管COM1,COM2,COM3,COM4,也通过138译码器和单片机的p2口相连,地址分别为8000H,0A000H,0C000H,0E000H。

数码管显示相应键按下的信息,单片机读入键盘的状态,锁存于373中,然后输出在数码管中。

数码管显示时钟,单片机内部的定时器来完成时钟设计在数码管中显示出来。

3.元器件选择、电路调试方法与结果说明1)元器选择:74ls138、74ls373、74ls138、74ls04、74ls02、74ls08、数码管、2*2键盘、晶振、电阻、电容、二极管等。

单片机实验键盘显示

单片机实验键盘显示

实验七8255 键盘显示实验【实验目的】1.熟悉8255与单片机的接线和I/O编程方法;2.熟悉数码管的显示原理与编程;3.熟悉8255扫描键盘与读取键值的编程。

【实验内容】使用单片机、8255模块和数码管显示电路,编程实现在数码管上从右至左显示0-5,当有键按下时在数码管最右1位显示按键的键码。

【实验原理与设计】1.硬件电路设计本次实验使用实验箱上的E1、E3和F6模块电路。

如图7.1所示。

E1E3F6图7.1 实验箱(1)8255模块(E3区)PA口作为位扫描口(键扫描口),PB口输出字形码,PC口作为键值读入口,与数码管显示电路和矩阵键盘模块电路(F6区)相应接口连接,8255的数据总线D0-D7、读(/RD)、写(/WR)、端口选择A0、A1和片选/CS已和单片机接好。

各端口地址如下:PA口:0FF28H;PB口:0FF29H;PC口:0FF2AH;控制口:0FF2BH单片机与8255模块电路连接图如图7.2所示。

图7.2 单片机与8255的电路连接(2)数码管显示电路(F6区)实验箱上提供的数码管显示电路如图7.3所示。

实验时需将数码管显示电路中的JLED与8255的PB口相连,JS与8255的PA口相连,JLED和JS分别位于E6区,同时E6区SW3、SW4和SW4红色拨码开关打在“OFF”位置。

图7.3数码管模块连接电路(3)矩阵键盘模块电路(F6区)实验箱上提供的矩阵键盘模块电路如图7.4所示,实验时将该电路中的JR(位于E6区)与8255的PC口相连。

图7.4矩阵键盘模块电路2.程序设计根据实验内容程序主流程图如图7.5所示。

图7.5 主程序流程图(1)初始化MOV A, #81H ;PA口(位扫描口)和PB口(字形码)做输出,PC口(键扫描口)做输入MOV DPTR, #0FF2BH ;实验箱接线决定8255的控制口地址为FF2BHMOVX @DPTR, A ;将命令字82H送给8255控制口确定各口工作方式(2)显示数据子程序显示数据子程序流程图如图7.6所示。

单片机实训报告键盘和数码管显示(WORD档)

单片机实训报告键盘和数码管显示(WORD档)

单片机实训报告(一)班级:测控 9 0 1学号:姓名实验名称:键盘和数码管显示实验目的:熟悉掌握ZLG7289的功能和特性,ZLG7289芯片各引脚名称及功能和ZLG7289与微控制器的接口,ZLG7289的SPI接口和控制指令。

同时进一步熟悉掌握keil软件的操作和编程。

实验原理:ZLG7289是一款数码显示驱动和键盘扫描管理的芯片。

主要有如下的特性:1.直接驱动8位共阴式数码管或64只独立的LED;2.管理多达64只按键,自动消除抖动;3.段电流可达15mA以上,位电流可达100mA;4.具有左移、右移、闪烁、消隐、段点亮等多种功能;5.与微控制器之间采用三线SPI总线接口,占用I/O资源少。

电路主要由芯片ZLG7289、8位共阴极数码管、64键的键盘矩阵以及单片机构成。

ZLG7289的控制电路图:电路的工作原理:当ZLG7289接收到单片机发出的指令(包括纯指令)后,经过读取、分析和处理,将会在数码管上显示相对应的操作指令。

当ZLG7289检测到有效的按键时,KEY脚将从高电平变为低电平,并一直保持到按键结束。

在此期间,如果ZLG7289接收到“读键盘数据指令”,则输出当前按键的键盘代码。

ZLG7289芯片各引脚名称及功能:引脚名称说明1、2 RTCC、Vcc 接电源3、5 NC 悬空4 Vss 接地6 /CS 片选输入端,低电平时,可向其发指令或读键盘。

ZLG7289使用SPI串行总线与微控制器接口。

SPI接口SPI串行总线是Motorola公司推出的一种同步串行接口。

通常它需要四条线,就可与微控制器之间实现全双工的同步串行通讯。

SPI串行总线主要有如下的特性:1.采用主从模式(Master Slave)架构,支持多Slave模式,一般只支持单Master,Master 控制时钟。

2.采用四线,实现全双工通信。

图1 SPI接口连线示意图SPI的数据传输时序模式SPI接口定义了四种数据传输的时序模式。

实现特定功能的键盘及LED显示

实现特定功能的键盘及LED显示

实现特定功能的键盘及LED显⽰⽬录⼀、实验⽬的 (2)⼆、实验内容 (2)三、总体设计 (2)四、实验电路 (2)五、实验框图 (4)六、实验程序 (5)七、实验⼼得 (10)实现特定功能的键盘及LED显⽰⼀、实验⽬的1、掌握键盘和显⽰器的接⼝⽅法和编程⽅法。

2、掌握键盘扫描和LED⼋段码显⽰器的⼯作原理。

⼆、实验内容1、了解键盘及LED显⽰接⼝设计,绘制出原理图。

2、根据实验箱上提供的硬件资源完成:a、按1键显⽰年b、按2键显⽰⽉⽇c、按3键显⽰GOODd、按4键数码管由左到右8字循环显⽰。

3、设计电路并在实验台上连接线路。

三、总体设计1、选通键盘以及LED数字显⽰控制区2、主要利⽤软件编程,实现实验要求中的各项四、实验电路使⽤PC机与伟福lab8000实验箱连接起来,安装好相应驱动,做好接线分析,由于lab8000实验箱已经将部分电路接线内置,所以接线仅需要将KEY/LED_CS选通端⼝与CS0相连即可,但作为学习过程,应更加详细的将实现电路了解,现已将实验箱所⽤实验器件的内部电路给出,详细电路见下页图1图1:键盘及LED 显⽰电路五、实验框图主程序框图读键输⼊⼦程序框图显⽰程序框图六、实验程序OUTBIT equ 08002h ; 位控制⼝OUTSEG equ 08004h ; 段控制⼝IN_KEY equ 08001h ; 键盘读⼊⼝data segmentLEDBuf db 6 dup(?) ; 显⽰缓冲Num db 1 dup(?) ; 显⽰的数据DelayT db 1 dup(?)LEDMAP: ; ⼋段管显⽰码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h KeyTable: ; 键码定义db 16h, 15h, 14h, 0ffhdb 13h, 12h, 11h, 10hdb 0dh, 0ch, 0bh, 0ahdb 0eh, 03h, 06h, 09hdb 0fh, 02h, 05h, 08hdb 00h, 01h, 04h, 07hdata endscode segmentassume cs:code, ds:dataDelay proc nearpush ax ; 延时⼦程序push cxmov al, 0mov cx,axloop $pop cxpop axretDelay endpDelay1 proc nearpush ax ; 延时⼦程序push cxmov cx,38000loop $pop cxpop axretDelay1 endpDisplayLED proc nearmov bx, offset LEDBufmov cl, 6 ; 共6个⼋段管mov ah, 00100000b ; 从左边开始显⽰DLoop: mov dx, OUTBITmov al, 0out dx,al ; 关所有⼋段管mov al, [bx]mov dx, OUTSEGout dx,almov dx, OUTBITmov al, ahout dx, al ; 显⽰⼀位⼋段管push axmov ah, 1call Delaypop axshr ah, 1inc bxdec cljnz DLoopmov dx, OUTBITmov al, 0out dx,al ; 关所有⼋段管retDisplayLED endpTestKey proc nearmov dx, OUTBITout dx, al ; 输出线置为0mov dx, IN_KEYin al, dx ; 读⼊键状态not aland al, 0fh ; ⾼四位不⽤retTestKey endpGetKey proc nearmov ch, 00100000bmov cl, 6KLoop:mov dx, OUTBITmov al, ch ; 找出键所在列not alout dx, alshr ch, 1mov dx, IN_KEYin al, dxnot aland al, 0fhjne Goon_ ; 该列有键⼊dec cljnz KLoopmov cl, 0ffh ; 没有键按下, 返回0ffh jmp Exit1Goon_:dec clshl cl, 2 ; 键值= 列X 4 + ⾏mov ch, 4LoopC:test al, 1jnz Exit1shr al, 1inc cljnz LoopCExit1:mov dx, OUTBITmov al, 0out dx, almov ch, 0mov bx, offset KeyTable add bx, cxmov al, [bx] ; 取出键码mov bl, al WaitRelease:mov dx, OUTBITmov al, 0out dx, al ; 等键释放mov ah, 10call Delaycall TestKeyjne WaitReleasemov al, blretGetKey endpStart proc nearmov ax, datamov ds, axmov di,offset LEDBufp1: mov di,offset LEDBuf mov [di], 05bh ; 显⽰2008. mov [di+1], 03fhmov [di+2], 03fhmov [di+3], 0ffhmov [di+4], 0mov [di+5], 06hjmp MLoopp2: mov di,offset LEDBufmov [di], 03fh ; 显⽰08.08. mov [di+1], 0ffhmov [di+2], 03fhmov [di+3], 0ffhmov [di+4], 0mov [di+5], 5bhjmp MLoopp3: mov di,offset LEDBuf mov [di],6fh ;显⽰good mov [di+1],5chmov [di+2],5chmov [di+3],0dehmov [di+4],0mov [di+5],4fhjmp MLoopp4: push cxmov cx,08hmov bx,offset LEDBufp4l: mov [bx],00inc bxloop p4lpop cxmov [di], 7fh ; 显⽰8inc dicmp di,offset LEDBuf + 06h jnz nextmov di,offset LEDBuf next: call delay1call DisplayLED ; 显⽰call TestKeyjne MLoopjmp p4MLoop:call DisplayLED ; 显⽰call TestKey ; 有键⼊?je MLoop ; ⽆键⼊, 继续显⽰call GetKey ; 读⼊键码and al, 0fh ; 显⽰键码cmp al,01hjz mmpp1cmp al,02hjz mmpp2cmp al,03hjz p3cmp al,04hjz p4mov ah, 0mov bx, offset LEDMAP add bx, axmov al, [bx]mov LEDBuf+5, aljmp MLoopmmpp1: jmp p1mmpp2: jmp p2Start endpcode endsend start。

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

实验七单片机键盘LED显示实验一、实验目的1、掌握键盘和LED显示器的接口方法和编程方法。

2、掌握键盘扫描和LED八段码显示器的工作原理。

3、学习并口扩展的程序编写方法。

二、实验说明利用实验仪提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显示实验,把按键输入的键码在六位数码管上显示出来。

实验程序可分成三个模块。

①键输入模块:扫描键盘、读取一次键盘并将键值存入键值缓冲单元。

②显示模块:将显示单元的内容在显示器上动态显示。

③主程序:调用键输入模块和显示模块。

三、实验仪器计算机伟福实验箱(lab2000P )四、实验内容1、本实验仪提供了一个6×4的小键盘,向列扫描码地址(0X002H)逐列输出低电平,然后从行码地址(0X001H)读回。

如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高。

这样就可以通过输出的列码和读取的行码来判断按下的是什么键。

在判断有键按下后,要有一定的延时,防止键盘抖动。

地址中的X是由KEY/LED CS 决定,参见地址译码。

做键盘和LED实验时,需将KEY/LED CS 接到相应的地址译码上。

以便用相应的地址来访问。

例如将KEY/LED CS信号接CS0上,则列扫描地址为08002H,行码地址为08001H。

列扫描码还可以分时用作LED的位选通信号。

2、本实验仪提供了6 位8段码LED显示电路,只要按地址输出相应数据,就可以实现对显示器的控制。

显示共有6位,用动态方式显示。

8位段码、6位位码是由两片74LS374输出。

位码经MC1413或ULN2003倒相驱动后,选择相应显示位。

3、本实验仪中8位段码输出地址为0X004H,位码输出地址为0X002H。

此处X是由KEY/LED CS 决定,参见地址译码。

做键盘和LED实验时,需将KEY/LED CS 接到相应的地址译码上。

以便用相应的地址来访问。

例如,将KEY/LED CS 接到CS0上,则段码地址为08004H,位码地址为08002H。

五、思考题1、按键接收到的数据加1显示出来;2、实现第2功能键,即按下A后,再按下0-9键为加1显示;3、保存前一个接收到的数据,数据向前推动显示。

六、源程序修改原理及其仿真结果原程序:OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口IN equ 08001h ; 键盘读入口LEDBuf equ 60h ; 显示缓冲ljmp StartLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hdb 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h Delay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED:mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov a, @r0mov dptr, #OUTSEGmovx @dptr, amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #1call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, LoopretTestKey:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 输出线置为0mov dptr, #INmovx a, @dptr ; 读入键状态cpl aanl a, #0fh ; 高四位不用retKeyTable: ; 键码定义db 16h, 15h, 14h, 0ffhdb 13h, 12h, 11h, 10hdb 0dh, 0ch, 0bh, 0ahdb 0eh, 03h, 06h, 09hdb 0fh, 02h, 05h, 08hdb 00h, 01h, 04h, 07hGetKey:mov dptr, #OUTBITmov P2, dphmov r0, #Low(IN)mov r1, #00100000bmov r2, #6KLoop:mov a, r1 ; 找出键所在列cpl amovx @dptr, acpl arr amov r1, a ; 下一列movx a, @r0cpl aanl a, #0fhjnz Goon1 ; 该列有键入djnz r2, KLoopmov r2, #0ffh ; 没有键按下, 返回0ffhsjmp ExitGoon1:mov r1, a ; 键值= 列X 4 + 行mov a, r2dec arl arl amov r2, a ; r2 = (r2-1)*4mov a, r1 ; r1中为读入的行值mov r1, #4LoopC:rrc a ; 移位找出所在行jc Exitinc r2 ; r2 = r2+ 行值djnz r1, LoopCExit:mov a, r2 ; 取出键码mov dptr, #KeyTablemovc a, @a+dptrmov r2, aWaitRelease:mov dptr, #OUTBIT ; 等键释放clr amovx @dptr, amov r6, #10call Delaycall TestKeyjnz WaitReleasemov a, r2retStart:mov sp, #40hmov LEDBuf+0, #0ffh ; 显示8.8.8.8.mov LEDBuf+1, #0ffhmov LEDBuf+2, #0ffhmov LEDBuf+3, #0ffhmov LEDBuf+4, #0mov LEDBuf+5, #0MLoop:call DisplayLED ; 显示call TestKey ; 有键入?jz MLoop ; 无键入, 继续显示call GetKey ; 读入键码anl a, #0fh ; 显示键码mov dptr, #LEDMapmovc a, @a+dptrmov LEDBuf+5, aljmp MLoopend修改:将思考题中的三个问题写在一个程序中。

只有部分需要修改,因此下面只写出修改部分的程序。

GetKey:mov ledbuf,ledbuf+1mov ledbuf+1,ledbuf+2mov ledbuf+2,ledbuf+3mov ledbuf+3,ledbuf+4mov ledbuf+4,ledbuf+5 ;;实现数据的左移显示mov dptr, #OUTBITmov P2, dphmov r0, #Low(IN)mov r1, #00100000bmov r2, #6MLoop:call DisplayLED ; 显示call TestKey ; 有键入?jz MLoop ; 无键入, 继续显示call GetKey ; 读入键码,且将上一个码左移mov r3,a ;;保存a中的值cjne a,#0ah,NEXT1 ;;判断键入的是否是a,不是就跳到NEXT1正; 常显示jmp NEXT2 ;;是a则跳到NEXT2第二功能子程序NEXT1: mov a,r3anl a, #0fh ; 显示键码mov dptr, #LEDMapmovc a, @a+dptrmov LEDBuf+5, aljmp MLoopMLOOP2:call DisplayLED ; 显示call TestKey ; 有键入?jz MLoop2 ; 无键入, 继续显示call GetKey ; 读入键码mov r3,a ;;判断前先保存a中的值cjne a,#0ah,NEXT2 ;判断键入的是否是a,这一次判断是在第二; 功能子程序中判断,不是a就到next2,继; 续第二功能,加2显示jmp NEXT1 ;是a则应该跳到next1关闭第二功能NEXT2: mov a,r3anl a, #0fh ; 显示键码mov dptr, #LEDMapadd a,#2 ;将a自加2实现第二功能movc a, @a+dptrmov LEDBuf+5, aljmp MLoop2 ;开启第二功能后在mloop2内部循环使之后; 键入的非a数据都加2后再显示End。

相关文档
最新文档