实验八 键盘显示控制实验(1)
键盘显示程序设计实验
实验四键盘显示程序设计实验目的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。
按键显示电路实验报告(3篇)
第1篇一、实验目的1. 熟悉按键电路的基本原理和设计方法。
2. 掌握按键电路的搭建和调试方法。
3. 了解按键电路在实际应用中的重要性。
4. 提高动手实践能力和电路分析能力。
二、实验原理按键显示电路是一种将按键输入转换为数字信号,并通过显示设备进行显示的电路。
本实验主要涉及以下原理:1. 按键原理:按键通过机械触点实现电路的通断,当按键被按下时,电路接通,产生一个低电平信号;当按键释放时,电路断开,产生一个高电平信号。
2. 译码电路:将按键输入的信号转换为相应的数字信号,以便后续处理。
3. 显示电路:将数字信号转换为可视化的信息,如LED灯、数码管等。
三、实验器材1. 电路板2. 按键3. 电阻4. LED灯5. 数码管6. 电源7. 基本工具四、实验步骤1. 按键电路搭建(1)根据电路原理图,在电路板上焊接按键、电阻、LED灯等元器件。
(2)连接电源,确保电路板供电正常。
2. 译码电路搭建(1)根据电路原理图,在电路板上焊接译码电路所需的元器件。
(2)连接译码电路与按键电路,确保信号传输正常。
3. 显示电路搭建(1)根据电路原理图,在电路板上焊接显示电路所需的元器件。
(2)连接显示电路与译码电路,确保信号传输正常。
4. 电路调试(1)检查电路连接是否正确,确保无短路、断路等问题。
(2)按下按键,观察LED灯或数码管显示是否正常。
(3)根据需要调整电路参数,如电阻阻值、电源电压等,以达到最佳显示效果。
五、实验结果与分析1. 实验结果通过实验,成功搭建了一个按键显示电路,按下按键后,LED灯或数码管能够正确显示数字信号。
2. 结果分析(1)按键电路能够正常工作,实现电路通断。
(2)译码电路能够将按键输入转换为相应的数字信号。
(3)显示电路能够将数字信号转换为可视化的信息。
六、实验总结1. 通过本次实验,掌握了按键电路的基本原理和设计方法。
2. 提高了动手实践能力和电路分析能力。
3. 了解了按键电路在实际应用中的重要性。
实验八_LCM1602液晶显示实验
实验九 LCM1602液晶显示实验一、实验目的1.掌握keil C51软件与protues软件联合仿真调试的方法;2.掌握LCM1602液晶模块显示西文的原理及使用方法;3.掌握用8位数据模式驱动LCM1602液晶的C语言编程方法;二、实验内容1.用protues设计一LCM1602液晶显示接口电路。
要求利用P0接LCM1602液晶的数据端,P2.0~P2.2做LCM1602液晶的控制信号输入端。
P3.0~P3.4口扩展4个功能键K1~K4,电路如下2.编写程序,实现字符的静态和动态显示,字符为第一行“姓名全拼”第二行“专业全拼+学号”。
液晶的初始化,字符显示程序可参考官网的程序文件。
3.编写程序,利用功能键实现字符的纵向滚动和横向滚动等效果显示,主程序静态显示“My Informatiom”,显示字符如下:1.姓名全拼2.专业全拼+学号3.MCS-51 EXP84.LCD DISPLAY ”三.实验步骤1.用Protues设计1602液晶显示接口电路;2.在Keil51中编写液晶显示控制程序,编译通过后,与Protues联合调试;3.按功能键,观察字符及效果是否正确显示;四.实验电路2五.实验程序1静态#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code table[]="1.wanglin"; uchar code table1[]="2.tongxin 517"; sbit lcden=P2^2;sbit lcdrs=P2^0;uchar num;void delay(uint z){ uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com){ lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar date) { lcdrs=1;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void init(){ lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80+0x1);}void main(){ init();while(1){write_com(0x80);for(num=0;num<10;num++){write_data(table[num]);delay(300);}write_com(2);write_com(0x80+0x40);for(num=0;num<13;num++){write_data(table1[num]);delay(300);}}}1动态#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code table[]="1.wanglin"; uchar code table1[]="2.tongxin 517"; sbit lcden=P2^2;sbit lcdrs=P2^0;uchar num;void delay(uint z){ uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com){ lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar date){ lcdrs=1;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void init(){ lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80+0x1);}void main(){ init();while(1){write_com(0x80);for(num=0;num<10;num++){write_data(table[num]);delay(300);}write_com(2);write_com(0x80+0x40);for(num=0;num<13;num++){write_data(table1[num]);delay(300);}write_com(1);}}2#include<reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit lcden=P2^2;sbit lcdrs=P2^0;sbit lcdrw=P2^1;sbit busy=P0^7;sbit K1=P3^0;sbit K2=P3^1;bit flag1,flag2,flag3,flag4;uchar num,i;uchar code tab[]="My information!"; uchar code tab1[]="1.wanglin";uchar code tab2[]="2.tongxin 517"; uchar code tab3[]="3.MCS-51 EXP8"; uchar code tab4[]="4.LCD DISPLAY";void LCD_check_busy() {while(1){lcden=0;lcdrs=0;lcdrw=1;P0=0xff;lcden=1;if(busy==0) break;}lcden=0;}void delay(uint x){while(x--);}void delay_ms(uint x){int a,b;for(a=x;a>0;a--)for(b=110;b>0;b--);}void write_com(uchar com) {LCD_check_busy();lcdrs=0;lcden=0;lcdrw=0;P0=com;lcden=1;lcden=0;}void write_dat(uchar dat) {LCD_check_busy();lcdrs=1;P0=dat;delay(5); lcdrw=0;lcden=1;lcden=0;}void lcd_init(){lcden=0;write_com(0x38);write_com(0x0f);write_com(0x06);}void write_str(uchar *str){while(*str!='\0'){while(flag3);if(flag4){ write_com(0x01); break; } write_dat(*str) ;str++;delay_ms(50);}}void main(){uchar *ptr=tab;uchar*p=tab1,*q=tab2,*m=tab3,*n=tab4;TMOD=0x00;TH0=(65536-20000)/256;TL0=(65536-20000)%256;TR0=1;ET0=1;EX0=1;EX1=1;IT0=IT1=1;EA=1;PX1=1;lcd_init();while(1){write_com(01);write_com(0x80+0x00);for(i=0;i<15;i++){if(flag1|flag2) break;write_dat(tab[i]);delay_ms(100);}while(flag1==1){write_com(0x01);write_com(0x80+0x00);write_str(p);if(flag4){ flag4=0; break;}write_com(0xc0+0x00);write_str(q);if(flag4){ flag4=0; break;}delay_ms(800);write_com(0x01);write_com(0x80+0x00);write_str(q);if(flag4){ flag4=0; break;}write_com(0xc0+0x00);write_str(m);if(flag4){ flag4=0; break;}delay_ms(800);write_com(0x01);write_com(0x80+0x00);write_str(m);if(flag4){flag4=0; break;}write_com(0xc0+0x00);write_str(n);if(flag4){flag4=0; break;}delay_ms(800);write_com(0x01);write_com(0x80+0x00);write_str(n);if(flag4){ flag4=0; break;}write_com(0xc0+0x00);write_str(p);if(flag4){ flag4=0; break;}delay_ms(800);}while(flag2==1){write_com(0x01); write_com(0x80+0x00);write_str(p);if(flag4){ flag4=0; break;} write_com(0x80+0x15);write_str(q);if(flag4){ flag4=0; break;} write_com(0xc0+0x00);write_str(m);if(flag4){ flag4=0; break;} write_com(0xc0+0x15);write_str(n);if(flag4){ flag4=0; break;}while(flag2==1){write_com(0x1c);delay_ms(300);while(flag3);}}}}void key12() interrupt 1{TH0=(65536-20000)/256;TL0=(65536-20000)%256;if(K1==0)delay_ms(5);if(K1==0&&flag2==0){TR0=0;flag1=1;}if(K2==0)delay_ms(5);if(K2==0&&flag1==0){TR0=0;flag2=1;}}void key3() interrupt 0{EX1=0; delay_ms(5); EX1=1;if(flag1|flag2==1)flag3=~flag3;}void key4() interrupt 2{EX1=0; delay_ms(5); EX1=1;flag4=1;if(flag1==1|flag2==1){flag1=flag2=flag3=0;TR0=1;}}六、实验总结1. 1602动态显示的原理即先写入要显示的字符,然后写入滚动的命令,从而实现不同的动态效果。
键盘、数码管显示综合实验
实验项目名称:键盘、数码管显示综合实验实验室(中心):电子实验室实验完成时间: 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”,编译源程序。
实验八 独立键盘的使用
实验八独立键盘的使用1.键盘电路的设计方法2. 一种标准的独立按键结构3. 键盘防抖(消抖)概念通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号小型如下图。
由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,如下图。
抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。
这是一个很重要的时间参数,在很多场合都要用到。
按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。
键抖动会引起一次按键被误读多次。
为确保CPU对键的一次闭合仅作一次处理,必须去除键抖动。
在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。
按键的抖动,可用硬件或软件两种方法。
(1) 硬件消抖:在键数较少时可用硬件方法消除键抖动。
下图所示的RS触发器为常用的硬件去抖。
图中两个“与非”门构成一个RS触发器。
当按键未按下时,输出为1;当键按下时,输出为0。
此时即使用按键的机械性能,使按键因弹性抖动而产生瞬时断开(抖动跳开B),只要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。
也就是说,即使B点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。
这一点通过分析RS触发器的工作过程很容易得到验证。
状态表:初始:A=0 1=0 ; B=1 5=1 6=0 2=0 ; 3=1按键:A=1 1=1 ; B=0 5=0 6=1 2=1 ; 3=0抖动:A=1 1=1 ; B=1 5=1 4=0(3=0) 6=1 2=1; 3=0(2) 软件消抖:如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。
当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。
单片机键盘显示实验报告
单片机得键盘与显示实验报告㈠实验目得1.掌握单片机I/O得工作方式;2.掌握单片机以串行口方式0工作得LED显示;3.掌握键盘与LED显示得编程方法.㈡实验器材1.G6W仿真器ﻩ一台2.MCS—51实验板ﻩ一台3.PC机ﻩﻩﻩ一台4.电源一台㈢实验内容及要求实验硬件线路图见附图从线路图可见,8051单片机得P1口作为8个按键得输入端,构成独立式键盘。
四个LED显示器通过四个串/并移位寄存器74LS164接口至8051得串行口,该串行口应工作在方式0发送状态下,RXD端送出要显示得段码数据,TXD则作为发送时钟来对显示数据进行移位操作。
编写一个计算器程序,当某一键按下时可执行相应得加、减、乘、除运算方式,在四个显示器上显示数学算式与最终计算结果。
注:①通过按键来选择加、减、乘、除四种运算方式。
②输入两个数字均为一位十进制数,可预先放在内存中。
㈣实验框图(见下页)㈤思考题1.当键盘采用中断方式时,硬件电路应怎样连接?P1、4~P1、7就是键输出线,P1、0~P1、3就是扫描输入线。
输入与门用于产生按键中断,其输入端与各列线相连,再通过上拉电阻接至+5 V电源,输出端接至8051得外部中断输入端。
2、74LS164移位寄存器得移位速率就是多少?实验中要求计算得式子与结果之间相差一秒,移位寄存器得移位速率应该就是每秒一位吧。
其实这个问题确实不知道怎么回答。
.。
ﻩLED实验代码:ORG0000HAJMPMAINORG 0030HMAIN:MOV 41H,#0BBH;对几个存放地址进行初始化MOV 42H,#0BBHMOV43H,#0BBHMOV44H,#0BBHMOV SCON,#00H ;初始化串行口控制寄存器,设置其为方式0 LCALLDISPLAY ;初始化显示KEY:MOV R3,#08H;用来存放两个数据MOV R4,#02HMOVP1,#0FFH ;初始化P1口MOVA,P1 ;读取按键状态CPL A ;取正逻辑,高电平表示有键按下JZ KEY ;A=0时无键按下,重新扫描键盘LCALL DELAY1 ;消抖MOVA,P1;再次读取按键状态CPL AJZ KEY;再次判别就是否有键按下PUSH AKEY1:MOVA,P1CPL AANL A,#0FH ;判别按键释放JNZKEY1;按键未释放,等待LCALLDELAY1;释放,延时去抖动POPAJB ACC、0,ADD1 ;K1按下转去ADD1JBACC、1,SUB1 ;K1按下转去SUB1JB ACC、2,MUL1 ;K1按下转去MUL1JBACC、3,DIV1;K1按下转去DIV1LJMP KEYADD1:LCALL BUFFER ;显示加数与被加数MOV43H,#049HLCALL DISPLAY;显示加号MOV A,R3ADDA,R4DA AMOV R3,A;相加结果放入R6ANLA,#0FHMOV R4,A ;结果个位放入R7MOV A,R3SWAP A ;半字节交换,高四位放入低四位ANL A,#0FHMOV R3,A ;结果得高位放入R6LCALL Lﻩﻩ;显示缓存区设置LCALLDELAY2 ﻩ;延时一秒后显示LCALL DISPLAYLJMPKEYSUB1:LCALL BUFFER ;显示减数与被减数MOV43H,#40HLCALL DISPLAY;显示减号MOVA,R3CLR CY;CY清零SUBB A,R4;做减法PUSH ARLCA;带进位循环左移,最高位放入CY JC F ;判断最高位,若为1则跳转到负数ZHENG:POP AMOVR4,AMOV R3,#00H ;高位清零SJMP OUTFU:POP ACPL A ;取绝对值INCAMOV R4,AMOV R3,#11H ;显示负号OUT: LCALL L;显示缓存区设置LCALL DELAY2 ;延时1s后显示LCALL DISPLAYLJMP KEYMUL1:LCALL BUFFER ;显示两位乘数MOV43H,#99HLCALLDISPLAY;显示乘号MOV A,R3MOVB,R4MUL AB;结果放入AB,A中就是低8位,B中就是高8位MOV B,#0AHDIV AB ;十进制转换MOV R4,B;结果个位放入R7MOV R3,A ;结果得十位放入R6LCALL LLCALLDELAY2LCALL DISPLAY ;延时1s后显示LJMP KEYDIV1:LCALL BUFFER ;显示除数与被除数MOV43H,#62HLCALLDISPLAY;显示除号MOV A,R3MOV B,R4DIV AB ;A除以BMOV R4,B;余数放在R4中MOV R3,A ;商放在R3中MOV A,R4MOVC A,A+DPTR;调用段选号MOV 41H,A;显示余数MOV A,R3MOVCA,A+DPTRMOV43H,A;显示商MOV42H,#00HMOV44H,#00HLCALL DELAY2;延时1S后显示LCALL DISPLAYLJMP KEYBUFFER: MOV41H,#22H ;显示初始化,在做计算之前显示两个操作数,显示等号MOV DPTR,#TABLMOV A,R4MOVC A,A+DPTRMOV42H,AMOV A,R3MOVC A,A+DPTRMOV 44H,ARETDISPLAY:MOV R5,#04Hﻩ;共四位需要显示MOV R0,#41HDISPLAY1:MOV A,R0MOV SBUF,ADISPLAY2:JNB TI,DISPLAY2ﻩ;就是否传完了CLR TIINC R0DJNZ R5,DISPLAY1RETL:MOVA,R4MOVC A,A+DPTRMOV 41H,A ;R4对应得段码MOV A,R3MOVC A,A+DPTRMOV42H,A ;R3对应得段码MOV43H,#00HMOV44H,#00HRETDELAY1:;普通延时ﻩMOVR1,#20HDS1:ﻩMOV R2,#0FFHDS2:DJNZ R2,DS2ﻩDJNZ R1,DS1RETDELAY2:MOV R6,#14H ;定时1SMOVTMOD,#01HDS3:MOV TH0,#3CHMOV TL0,#0B0H ;50msSETB TR0LOOP:JNB TF0,LOOPCLR TF0CLRTR0DJNZ R6,DS3 ;1s到,中断返回RETTABL:DB 0BBH09H 0EAH 6BH;段码表DB 59H73H0F3H 0BHDB 0FBH7BH 00H 0DBHDB0F1H 0B2H 0E9H0F2HDB0D2H40H实验结果及分析按键1:8+2= 结果:10按键2:8-2=结果: 6按键3:8*2= 结果:16按键4:8/2=结果:4从上面得结果可以瞧出,本次实验基本完成了实验要求。
键盘及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源程序。
实验一--键盘显示实验
实验一键盘显示系统实验1.实验目的:(1)了解8155芯片的工作原理以及应用(2)了解键盘、LED显示器的接口原理以及硬件电路结构(3)掌握非编码键盘的编程方法以及程序设计2.实验内容:将程序输入实验系统后,在运行状态下,按下数字0~9之一,将在数码管上显示相应数字,按下A、B或C之一,将在数码管上显示“0”、“1”或“2”循环3.程序框图:4. 实验程序下面程序有四部分组成,程序的地址码、机器码、程序所在行号(中间)和源程序。
字型码表和关键字表需要同学们自己根据硬件连接填在相应位置。
地址码机器码 1 源程序0000 2 org 0000h0000 90FF20 3 mov dptr,#0ff20h0003 7403 4 mov a,#03h ;方式字0005 F0 5 movx @dptr,a ;A和B口为输出口,C口为输入口0006 753012 6 mov 30h,#12h ;LED共阴极,开始显示“H”,地址偏移量送30h0009 1155 7 dsp: acall disp1 ;调显示子程序000B 11FE 8 acall ds30ms000D 1179 9 acall scan ;调用键盘扫描子程序000F 60F8 10 jz dsp ;若无键按下,则dsp0011 11B7 11 acall kcode ;若有键按下,则kcode0013 B40A00 12 cjne a,#0ah,cont ;是否数字键,若是0-9则是,a-c则否0016 400F 13 cont: jc num ;若是,则num0018 90001F 14 mov dptr,#jtab ;若否,则命令转移表始址送dptr 001B 9409 15 subb a,#09h; 形成jtab表地址偏移量001D 23 16 rl a ;地址偏移量*2001E 73 17 jmp @a+dptr ;转入相应功能键分支程序001F 00 18 jtab: nop0020 00 19 nop0021 8008 20 sjmp k1 ;转入k1子程序0023 800B 21 sjmp k2 ; 转入k2子程序0025 800E 22 sjmp k3 ; 转入k3子程序0027 F530 23 num: mov 30h,a0029 80DE 24 sjmp dsp ; 返回dsp002B 7531C0 25 k1: mov 31h,#0c0h ; "0" 循环显示002E 800A 26 sjmp k40030 7531F9 27 k2: mov 31h,#0f9h ; "1" 循环显示0033 8005 28 sjmp k40035 7531A4 29 k3: mov 31h,#0a4h ; "2" 循环显示0038 8000 30 sjmp k4003A 7B01 31 k4: mov r3,#01h ;显示最末一位,注意共阴极003C EB 32 k5: mov a,r3003D 90FF21 33 mov dptr,#0ff21h0040 F0 34 movx @dptr,a ;字位送81550041 E531 35 mov a,31h0043 90FF22 36 mov dptr,#0ff22h; 字型口0046 F0 37 movx @dptr,a ;字型送8155的B口0047 11EC 38 acall delay ;延时1ms***0049 74FF 39 mov a,#0ffh004B F0 40 movx @dptr,a ;关显示,在此使LED各位显示块都灭004C EB 41 mov a,r3004D 23 42 rl a004E FB 43 mov r3,a004F BB40EA 44 cjne r3,#40h,k5 ;还没有循环玩一遍,则循环继续0052 80E6 45 sjmp k4 ;若循环完一遍则返回k4;又开始新一轮的循环0054 22 46 ret0055 90FF21 47 disp1: mov dptr,#0ff21h; 字位口A,注意led是共阴极接法0058 7401 48 mov a,#01h005A F0 49 movx @dptr,a005B 90FF22 50 mov dptr,#0ff22h;字型口005E E530 51 mov a,30h0060 2402 52 add a,#02h0062 83 53 movc a,@a+pc0063 F0 54 movx @dptr,a ;字型码输入,N1点亮0064 22 55 ret ;下面是0到c的字型码0065 ? 56 db ????0066 ?0067 ?0068 ?0069 ?006A ? 57 db ????006B ?006C ?006D ?006E ?006F ? 58 db ????0070 ?0071 ?0072 ?0073 ?0074 ? 59 db ????0075 ?0076 ?0077 ?0078 ?0079 74FF 60 scan: mov a,#0ffh; 关显示码a007B 90FF22 61 mov dptr,#0ff22h; B口地址送dptr007E F0 62 movx @dptr,a ;关led显示007F 7400 63 mov a,#00h0081 90FF21 64 mov dptr,#0ff21h ;A口地址,字位码0084 F0 65 movx @dptr,a0085 90FF23 66 mov dptr,#0ff23h ;C口地址0088 E0 67 movx a,@dptr0089 540F 68 anl a,#0fh; 取出列值送a008B B40F02 69 cjne a,#0fh,next1;若有键按下,则next1008E 8025 70 sjmp next40090 11F5 71 next1: acall ds10ms ;延时10ms0092 7A00 72 mov r2,#00h ;窜键标志位清零0094 79FE 73 mov r1,#0feh; 行扫描初值送a0096 90FF21 74 loop: mov dptr,#0ff21h ;dptr指向A口0099 E9 75 mov a,r1 ;行扫描值送a009A F0 76 movx @dptr,a009B 90FF23 77 mov dptr,#0ff23h009E E0 78 movx a,@dptr ;读c口009F 540F 79 anl a,#0fh ; 取出列值00A1 B40F02 80 cjne a,#0fh,next2 ;若被按键在本行,则next2 00A4 8007 81 sjmp next3;若不在本行,则next300A6 0A 82 next2: inc r2 ;窜键标志位加100A7 BA010B 83 cjne r2,#01h,next4 ;若为窜键,则返回监控00AA FC 84 mov r4,a ;列值送r400AB E9 85 mov a,r100AC FB 86 mov r3,a ; 行值送r300AD E9 87 next3: mov a,r1 ;行扫描值送a00AE 23 88 rl a ;左移一位00AF F9 89 mov r1,a ;送回r100B0 B47FE3 90 cjne a,#7fh,loop ;若未扫描完一遍,则loop 00B3 01B6 91 ajmp next5 ;若扫描完一遍,则next500B5 E4 92 next4: clr a00B6 22 93 next5: ret00B7 7900 94 kcode: mov r1,#00h00B9 EB 95 mov a,r300BA D3 96 setb c00BB 13 97 loop1: rrc a00BC B4FF02 98 cjne a,#0ffh, next6100BF 8003 99 sjmp next600C1 09 100 next61: inc r100C2 80F7 101 sjmp loop100C4 E9 102 next6: mov a,r100C5 C4 103 swap a00C6 F9 104 mov r1,a00C7 EC 105 mov a,r400C8 540F 106 anl a,#0fh00CA 49 107 orl a,r100CB F5F0 108 mov b,a00CD 9000DF 109 mov dptr,#ktab00D0 7800 110 mov r0,#00h00D2 E4 111 clr a00D3 93 112 pepe: movc a,@a+dptr00D4 B5F002 113 cjne a,b,next700D7 8004 114 sjmp resv00D9 08 115 next7: inc r000DA E8 116 mov a,r000DB 80F6 117 sjmp pepe00DD E8 118 resv: mov a,r000DE 22 119 ret;下面表格存放0到C的关键字00DF ? 120 ktab: db ????00E0 ?00E1 ?00E2 ?00E3 ?00E4 ?00E5 ? 121 db ????00E6 ?00E7 ?00E8 ?00E9 ?00EA ?00EB ? 122 db ?;;表示0到C的关键字00EC 7F02 123 delay: mov r7,#02h ;延时1ms00EE 7EFF 124 delay1: mov r6,#0ffh00F0 DEFE 125 delay2: djnz r6,delay200F2 DFFA 126 djnz r7,delay100F4 22 127 ret00F5 7F14 128 ds10ms: mov r7,#14h ;延时10ms00F7 7EFF 129 dely1: mov r6,#0ffh00F9 DEF5 130 dely2: djnz r6,delay200FB DFF1 131 djnz r7,delay100FD 22 132 ret00FE 7F3C 133 ds30ms: mov r7,#3ch ;延时30ms0100 7EFF 134 dely3: mov r6,#0ffh0102 DEEC 135 dely4: djnz r6,delay20104 DFE8 136 djnz r7,delay10106 22 137 ret138 end5. 实验步骤:(1) 输入程序,本实验系统有两种输入方法. a)可以直接通过系统上的小键盘输入机器码也可以采用b)把实验系统和PC机的串口直接相连,在PC机上通过专用软件编译程序,然后通过串行口把编译后的程序机器码下载到实验系统中.(2) 输入程序首地址,按运行键EX,程序运行,观察此时显示结果.(3) 按下0~9数字键,观察在数码管上显示的结果,按下A,B或C观察显示的结果.(4) 在循环显示程序段中,调不同的时间延时子程序,观察显示效果6. 习题每人应该认真读懂程序,在源程序的基础上根据硬件电路判断其他按键对应的关键字,要求每个人应该至少在原来程序基础上再加一个按键,来显示相应的循环或其他功能.7. 思考题?(1) 思考动态显示的原理.(2) 思考以上程序还有那些不完善的地方,如何改?。
键盘显示板实验报告
课程设计报告实验名称:键盘显示板实验报告学院:电气工程与自动化学院专业班级:自动化113班学号:07号姓名:陈奎指导老师:王祖麟教授2012/7/28目录第一章:器材准备 31.1:所需器材: 31.2:制作过程: 31.3:制作原理: 4 第二章:键盘显示板制作 52.1:原理图 52.2:PCB 62.3:注意事项 62.4:实验目的 7 第三章:总结: 9第一章:器材准备1.1:所需器材铜板(100mm*75mm),开关(8个),电阻500Ω(8个),5KΩ(4个),74HC595(2个) ,打印机,美工刀与直尺,剪刀,玻璃板,塑料饭盒,盐酸,双氧水,盛水桶,木筷或竹筷,台钻,洗板水,热转印机、电烙铁等等,焊锡若干,砂纸。
1.2:制作过程:1:用电脑制作原理图,进而利用自动不限生成PCB,所用软件为AltiumDesignerSummer09、。
2:打印:用电脑将绘制好的PCB图打印出来,由于是双面板,所以要打印两张,可以用热转印纸或者白色广告纸,打印如果断线太多就要重新打印。
3:将铜板用砂纸打磨,然后将打印纸中一张对准板子,贴上去,保持纸张不要移动,让背后包紧,放进热转印机中,热转印机的温度必须在150度以上,但是不要超过200摄氏度,铜板出来后,待其冷却后,小心的拿掉广告纸,在预先画好的四个角上的黑点处打洞,然后用铁丝将另一张也按照黑点和铜板固定好,固定在另一面,这是要注意两变得孔,可以在打两个孔校正一下,准确无误后即可放入热转印机中,同样出来待其冷却后在揭去广告纸。
4:腐蚀铜板,制作电路图。
拿出铜板后,检查是否断线,断线的地方用黑色碳素笔棉花,待墨迹干却后,将其投入双氧水和盐酸3:1配置的腐蚀液中,时时观察,冒气泡时就来回拨动板子,待其上面的铜片腐蚀完以后,夹出板子,用清水冲先干净上面的腐蚀液。
5:钻孔:按照孔的大小用粗细两个钻台分别给板子钻孔,孔要尽量和过孔吻合,差的太远就会给焊接器材带来很大麻烦的。
八段数码管显示
1.七段数码管的字型代码表如下表:2.程序框图:3.实验线路:4.实验步骤:(1)设定工作模式为模式2,即程序空间在仿真器上,数据空间在用户板上。
把第“40”号模块“键盘显示”的片选信号CS40孔接第“36”号模块“片选信号”YS0(08000-08FFFH)孔。
(2)编程并调试。
5.程序清单:八段数码管显示#define LEDLen 6xdata unsigned char OUTBIT _at_ 0x8002; // 位控制口xdata unsigned char OUTSEG _at_ 0x8004; // 段控制口xdata unsigned char IN _at_ 0x8001; // 键盘读入口unsigned char LEDBuf[LEDLen]; // 显示缓冲code unsigned char LEDMAP[] = { // 八段管显示码显示内容0~F 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};void Delay(unsigned char CNT){unsigned char i;while (CNT-- !=0)for (i=100; i !=0; i--);}void DisplayLED(){unsigned char i;unsigned char Pos;unsigned char LED;Pos = 0x20; // 从左边开始显示for (i = 0; i < LEDLen; i++){OUTBIT = 0; // 关所有八段管LED = LEDBuf[i];OUTSEG = LED;OUTBIT = Pos; // 显示一位八段管Delay(5);Pos >>= 1; // 显示下一位}OUTBIT = 0; // 关所有八段管}void main(){unsigned char i = 0;unsigned char j;while(1) {LEDBuf[0] = LEDMAP[ i & 0x0f]; // 数码管显示内容LEDBuf[1] = LEDMAP[(i+1) & 0x0f];LEDBuf[2] = LEDMAP[(i+2) & 0x0f];LEDBuf[3] = LEDMAP[(i+3) & 0x0f];LEDBuf[4] = LEDMAP[(i+4) & 0x0f];LEDBuf[5] = LEDMAP[(i+5) & 0x0f];i++;for(j=0; j<30; j++) // 延时DisplayLED();}}。
实验八键盘实验-10页文档资料
实验八键盘扫描实验一、实验目的1. 掌握中断键盘扫描编程方法。
2. 掌握LED动态显示方法。
二、实验原理及实验内容1. 实验原理无论是单片机控制系统还是单片机测量系统,都需要一个人机对话装置,这种人机对话装置通常采用键盘和显示器。
键盘是单片机应用系统中人机对话常用的输入装置,而显示器是单片机应用系统人机对话中的常用输出装置。
键盘是由若干个按键开关组成,键的多少根据单片机应用系统的用途而定。
键盘由许多键组成,而每个键相当于一个机械开关触点,当键按下时,触点闭合,当键松开时,触点断开。
单片机接收到按键的触点信号后作相应的功能处理。
因此对于单片机系统来说键盘接口信号是输入信号。
单片机的键盘接口分为独立式和矩阵式。
独立式键盘的每个按键都有一个信号线与单片机电路相连,所有按键有一个公共地或公共正端,每个键相互独立互不影响。
如图7-7所示,当按下键1时,无论其它键是否按下,键1的信号线就由1变0;当松开键1时,无论其它键是否按下,键1的信号线就由0变1。
矩阵式键盘的按键触点接于由行、列母线构成的矩阵电路的交叉处,每当一个按键按下时通过该键将相应的行、列母线连通。
若在行、列母线中把行母线逐行置0(一种扫描方式),那么列母线就用来作信号输入线。
矩阵式键盘原理图如图7-8所示。
图7-7 独立式按键原理图图7-8 矩阵式按键原理图针对以上两大类键盘工作方式,单片机又有三种键盘扫描方式:查询方式;定时扫描方式和中断扫描方式。
查询方式是指在程序中用一段专门的扫描和读按键程序不停查询有无按键按下,确定键值。
这种方式电路简单,但需要占用单片机的机器时间。
定时扫描方式是指利用单片机内的定时器来产生定时中断,然后在定时中断的服务程序中扫描,检查有无按键按下,确定键值。
这种方式的电路也比较简单,不占用单片机的机器时间,但需要占用一个定时器,同时定时的时间不能过长,否则可能检测不到相应得按键。
中断扫描方式是指当有键按下时由相应的硬件电路产生中断信号,单片机在中断服务程序中扫描,检查有无按键按下,确定键值。
自动化论文 键盘显示控制器8279应用实验
本科学年实训论文题目键盘显示控制器8279应用实验院系专业名称自动化年级 2008 级学生姓名指导教师2011年07月18日键盘显示控制器8279应用实验摘要在对8279键盘/显示接口分析的基础上,设计实现8位LED七段数码管显示驱动和16键盘输入电路。
利用可编程8279可实现对键盘/显示的自动扫描,以减轻CUP负担,其工作稳定,不会出现误操作,且程序实现简单。
本系统采用8031 单片机与8279 芯片的显示接口组成对LED 数码管应用系统的显示驱动电路。
具有可靠性高、价格低、使用方便等特点,适合数据显示的计算机应用系统使用。
关键词:8279,键盘,LED显示,扫描,接口8279 KEYBOARD DISPLAY CONTROLLER BASED ON THE APPLICATIONABSTRASTIn 8279 keyboard / display interface based on the analysis, design and implementation 8-digit LED seven segment display driver, and keyboard input circuit 16. 8279 can be realized using programmable keyboard / display automatically scans, to reduce the burden of CUP, their job stability, not to misuse, and the procedure simple. The system uses the 8031 and 8279 chip components on the LED display interface applications, digital display drive circuit. High reliability, low price, easy to use features, the computer application for data display system.KEYWORDS: 8279 , keyboard , LED display , scan , interface目录摘要 (II)ABSTRAST ................................................................................................................ I II 第一章引言.. (1)1.1 实验目的 (1)1.2 实验内容 (1)1.2 实验步骤和要求 (1)第二章8279的介绍 (2)2.1 8279功能介绍 (2)2.1.1 数据线 (2)2.1.2 地址线 (2)2.1.3 控制线 (2)2.2 8279的工作方式 (3)2.2.1 键盘工作方式 (3)2.2.2 显示方式 (3)2.2.3 传感器方式 (3)2.3 8279的命令字及其格式 (4)2.3.1 键盘/显示命令 (4)2.3.2 时钟编程命令 (5)2.3.3 读FIFO/传感器RAM命令 (6)2.3.4 读显示RAM命令 (6)2.3.5 写显示RAM命令 (6)2.3.6 显示器禁止写入/熄灭命令 (6)2.3.7 清除(显示RAM和FIFO中的内容)命令 (7)2.3.8 结束中断/出错方式设置命令 (7)2.4 8279的状态字及其格式 (8)2.5 8279数据输入/输出格式 (8)2.5.1 键盘扫描方式数据输入格式 (8)2.5.2 传感器方式及选通方式数据输入格式 (9)2.6 8279译码和编码方式 (9)第三章硬件电路及描述 (11)3.1 74LS138译码器 (11)3.1.1 74LS138集成译码器逻辑图及工作原理 (11)3.1.2 74LS138译码器引脚图和逻辑符号 (12)3.1.3 74LS138译码器的真值表 (13)3.2 74LS244 (14)3.2.1 74LS244引脚图 (14)3.2.2 74LS244的工作极限值 (14)3.2.3 功能表 (14)3.3 4*4矩阵键盘 (14)3.3.1 矩阵键盘的电路 (14)3.3.2 矩阵键盘的工作原理 (15)3.4 数码管动态扫描显示电路 (16)第四章软件设计流程及描述 (17)4.1软件设计流程 (17)4.2 keil软件的介绍和应用 (19)4.2.1 系统概述 (19)4.2.2 Keil C51单片机软件开发系统的整体结构 (19)4.2.3 Keil的优点 (20)第五章总结 (21)参考文献 (22)附录一源程序代码 (23)附录二实验中的软件和硬件记录 (26)第一章引言1.1 实验目的1、掌握8031系统中,扩展8279键盘显示接口的方法。
汇编数码显示及键盘实验实验报告
数码显示及键盘实验【实验内容】1、数码管显示0-72、独立按键识别【需要了解的知识】1、GPIO设定2、数码管动态扫描显示原理,键盘扫描工作原理,输入与输出及其处理【实验预习】仔细预读实验指导电子文档的实验六、七及其前面的实验流程【实验设备】Keil C51软件、ICE52 仿真驱动、MEFlash编程软件、USB驱动程序【实验过程】实验一数码管显示0-7实验任务:1)先将“0-7”数码管的段码值写入存储器中,使8位数码管从右至左显示0-7.实验步骤:1)首先在硬盘上建立一个文件夹;2)启动Keil C51软件;3)执行Keil C51软件的菜单“Project|New Project……”,弹出一个名为“Create New Project”的对话框。
输入工程文件名,选择保存路径uv2后缀,点击“保存”按钮;4)紧接着弹出“Options for Target‘Target 1’”,为刚才的项目选择ATMEL的AT89S52的CPU。
选择之后,点击“确定”按钮;5)接下来弹出一个对话框提示你是否要把标准8051的启动代码添加项目中去,此时,点击“否”按钮;6)执行菜单“File|New……”,出现一个名为“Text1”的文档。
接着执行菜单“File|Save”弹出一个名为“Save As”的对话框,将文件名改为“.asm”后缀,然后保存;7)添加源程序文件到工程中,一个空的源程序文件建成。
单击Keil C51软件左边项目工作窗口“Target1”上的“+”,将其展开。
然后右击“Source Group1”文件夹弹出下拉菜单,单击其中的“Add Files to Group‘Source Group1’”项;8)在弹出的对话框中先选择文件类型为“Asm Source file(*.s*;*.src;*.a*)”,这时对话框内创建的空的源程序文件已经出现在项目工作窗口的“Source Group1”文件夹中;输入源程序代码;9)点击工具栏“Options for target”按钮,弹出一个对话框,定义“Xtal”为11.0592.下面依序是存储模式、程序空间大小等设置,均用默认值即可。
型键盘显示控制器实验板教师实验指导
清华大学微型计算机实验系统三型键盘显示实验板教师用实验指导(汇编部分)清华大学科教仪器厂2008年8月目录实验板介绍................................................ 错误!未定义书签。
实验一8255并行口键盘扫描实验........................... 错误!未定义书签。
实验二8255控制数码管显示实验(一) ..................... 错误!未定义书签。
实验三8255控制数码管显示实验(二) ..................... 错误!未定义书签。
实验四8255控制数码管显示实验(三) ..................... 错误!未定义书签。
实验五8255控制数码管显示实验(四) ..................... 错误!未定义书签。
实验六8255控制键盘、显示综合实验 ....................... 错误!未定义书签。
实验板介绍一、实验板原理:实验板由可编程并行接口8255、6个数码管,16键小键盘组成。
通过一个20芯扁平电缆与主实验台相连。
该实验板可以和TPC-2003A+、TPC-USB+、TTC-2实验系统配套使用。
原理图如下:图1 8255及20芯电缆信号图2 数码显示图3 16键键盘实验板上的20芯接口插座提供数据总线信号D0-D0,控制信号IOR、IOW,低位地址A0、A1等,实验时通过20芯扁平电缆与主实验台相连。
这些信号在实验板上都有插线孔引出,也可以用自锁紧导线直接连到实验台上。
8255与数码管之间的连线已经接好,8255的PA0-PA7接数码管的段码a-dp,PB0-PB5接数码管的位码0-5,实验时不用再接线。
8255的PC0-PC7和键盘的行0-行3、列0-列3分别有插线孔引出,实验时需自己连线。
实验一 8255并行口键盘扫描实验一、实验目的1、掌握8255A编程原理。
微机原理键盘控制与显示实验报告
微机原理键盘控制与显⽰实验报告专业:电⽓⼯程及其⾃动化姓名: _________实验报告学号: _______⽇期: ___ _____地点: ____ ________课程名称: ________微机原理(实验)___________指导⽼师: ____徐习东 _______成绩:__________________实验名称: ______ 键盘控制与显⽰_______实验类型: _____软件实验 ______同组学⽣姓名:__________⼀、实验⽬的和要求(必填)⼆、实验内容和原理(必填)三、主要仪器设备(必填)四、操作⽅法和实验步骤五、实验数据记录和处理六、实验结果与分析(必填)七、讨论、⼼得【实验⽬的】1.通过实验掌握 TMS320F2812 通⽤输⼊ / 输出管脚直接控制外围设备的⽅法2.了解发光⼆极管的控制编程⽅法。
3.了解 SPI 的使⽤。
4.了解如何使⽤ GpioA ⼝进⾏数据的锁存5.通过实验掌握 TMS320F2812 的扩展端⼝接收外围设备信息的⽅法6.了解键盘的使⽤原理及编程⽅法【实验内容】1.按键显⽰程序,对按键记录次数,以⼆进制显⽰在16 个 LED 上。
2.定时器编程,并⽤按键控制各位时分秒,使其能完成加减操作【实验仪器】TMS320F2812数字信号处理器与学⽣⽤集成板。
【实验步骤】1.撰写代码2.调试代码3.实现功能【实验代码】⼀、定时器①宏定义和全局变量定义然后同时定义了全局变量,包括时、分、分析:这段代码是初始宏定义,⽤于定义按键对应的编码与地址,秒,按键编码, LED 编码和控制位。
②共阳字形码分析:由于这次实验要⽤到数码管,所以我们要定义⼀个数码管共阳端字形码,使每⼀个代码对应⼀种显③SPI 初始化⼦程序分析:这⼀段是本次实验的重点,就是SPI 初始化。
1 )SPICCR :⽤于控制SPI 的状态,上下降沿发送,还有⼏位的数据。
其中第7 位,即 SPICCR.6 是控制SPI 在上下沿发送, 1 代表下降沿,2 代表上升沿;第8 位,即 SPICCR.7 是控制复位的,0 代表为复位状态;低 4 位控制数据长度,长度等于n+1 。
实验八 键盘扫描显示实验
实验八键盘扫描显示实验一、实验目的1、了解普通4×4键盘扫描的原理。
2、进一步加深七段码管显示过程的理解。
二、硬件要求1、4×4键盘阵列。
2、FPGA主芯片EP1K30TC144-3。
3、可变时钟源。
4、七段码显示区。
三、实验原理本实验主要完成的实验是完成4×4键盘扫描的,然后获取其键值,并对其进行编码,从而进行按键的识别,并将相应的按键值进行显示。
键盘扫描的实现过程如下:对于4×4键盘,通常连接为4行、4列,因此要识别按键,只需要知道是哪一行和哪一列即可,为了完成这一识别过程,我们的思想是,首先固定输出4行为高电平,然后输出4列为低电平,在读入输出的4行的值,通常高电平会被低电平拉低,如果读入的4行均为高电平,那么肯定没有按键按下,否则,如果读入的4行有一位为低电平,那么对应的该行肯定有一个按键按下,这样便可以获取到按键的行值。
同理,获取列值也是如此,先输出4列为高电平,然后在输出4行为低电平,再读入列值,如果其中有哪一位为低电平,那么肯定对应的那一列有按键按下。
获取到行值和列值以后,组合成一个8位的数据,根据实现不同的编码在对每个按键进行匹配,找到键值后在7段码管显示。
四、实验内容及步骤本实验内容是完成4×4键盘的扫描,然后将正确的键值进行显示,实验步骤如下:1、编写键盘扫描和显示的VHDL代码。
2、用MaxPlusII对其进行编译仿真。
3、在仿真确定无误后,选择芯片ACEX1K EP1K30TC144-3。
4、给芯片进行管脚绑定,在此进行编译。
5、根据自己绑定的管脚,在实验箱上对键盘接口、显示接口和FPGA之间进行正确连线。
6、给目标板下载代码,在4×4键盘输入键值,观看实验结果。
五、实验连线如果是调用的本书提供的VHDL代码,则实验连线如下:Clk:FPGA工作时钟信号,大约位5KHz至50KHz即可。
Kr[0:3]:分别接4×4键盘部分的R1、R2、R3和R4。
实验八 键盘显示控制实验(1)
微机原理与接口技术之实验八键盘显示控制实验专业:计算机科学与技术班级学号:201622235 姓名:龚旭一、实验目的1、掌握8255控制键盘及显示电路的基本功能及编程方法。
2、掌握一般键盘和显示电路的工作原理。
二、实验内容1、编程:在小键盘上每按下一个键,4位数码管上显示出相应字符,他们的对应关系如下:三、编程提示1、设置8255C口键盘输入、A口为数码管段码输出。
2、参考流程图完成编程。
(上右图)四、实验内容与过程代码:a8255 equ 288H ;8255 A口c8255 equ 28aH ;8255 C口k8255 equ 28bH ;8255控制口data segmenttable1 dw 0770h,0B70h,0D70h,0E70h,07B0h,0BB0h,0DB0h,0EB0hdw 07D0h,0BD0h,0DD0h,0ED0h,07E0h,0BE0h,0DE0h,0EE0h ;键盘扫描码表LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CHDB 39h,5EH,79h,71h,0ffh ;LED段码表,0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,fchar db '0123456789ABCDEF' ;字符表mes db 0ah,0dh,'PLAY ANY KEY IN THE SMALL KEYBOARD! ',0ah,0dh db 'IT WILL BE ON THE SCREEN! END WITH E ',0ah,0dh,'$'key_in db 0hdata endsstacks segment stack ;堆栈空间db 100 dup (?)stacks endscode segmentassume cs:code,ds:data,ss:stacks,es:datastart:climov ax,datamov ds,axmov es,axmov ax,stacksmov ss,axmov dx,offset mes ;显示提示信息mov ah,09int 21hmain_key:MOV DX,k8255 ;初始化8255控制字mov al,81hout dx,alcall key ;get a char in (key_in) and display it call disply ;调显示子程序,显示得到的字符cmp byte ptr key_in,'E'jnz main_keymov ax,4c00h ;if (dl)='E' return to EXIT!key proc nearkey_loop:int 21h ;退出mov ah,1int 16hjnz exit ;pc键盘有键按下则退出mov dx,c8255mov al,0fhout dx,alin al,dx ;读行扫描值and al,0fhcmp al,0fhjz key_loop ;未发现有键按下则转call delay ;delay for amomentmov ah,alMOV DX,k8255mov al,88hout dx,almov dx,c8255mov al,ahor al,0f0hout dx,alin al,dx ;读列扫描值and al,0f0hcmp al,0f0hjz key_loop ;未发现有键按下则转mov si,offset table1 ;键盘扫描码表首址mov di,offset char ;字符表首址key_tonext:mov cx,16 ;待查表的表大小cmp ax,[si] ;cmp (col,row) with every word jz key_findkey ;in the tabledec cxjz key_loop ;未找到对应扫描码add si,2inc dijmp key_tonextkey_findkey:mov dl,[di]mov ah,02int 21h ;显示查找到的键盘码mov byte ptr key_in,dlkey_waitup:MOV DX,k8255mov al,81hout dx,almov dx,c8255mov al,0fhout dx,alin al,dx ;读行扫描值and al,0fhcmp al,0fhjnz key_waitup ;按键未抬起转call delay ;delay for amomentretexit: mov byte ptr key_in,'E'key endpretdelay proc nearpush ax ;delay 50ms--100msmov ah,0int 1ahmov bx,dxdelay1:mov ah,0int 1ahcmp bx,dxjz delay1mov bx,dxdelay2:mov ah,0int 1ahcmp bx,dxjz delay2pop axRetdelay endpDISPLY PROC NEARPUSH axMOV BX,OFFSET LEDMOV AL,byte ptr key_inSUB al,30hCMP al,09hJNG DIS2SUB al,07hDIS2: XLATMOV DX,a8255OUT DX,AL ;输出显示数据,段码POP AXRETDISPLY ENDPcode endsend start五、实验分析当在键盘上按下不同的按键时,LED数码管上显示不同的字符。
实验一键盘显示实验
实验一键盘显示实验一、实验目的(1)掌握MCS51 系统中键盘显示接口的方法;(2)掌握中断处理程序的编程方法。
二、硬件原理图2.1 数码管显示原理介绍实验箱上有6个共阴极数码管,图1是其外部特性图,图2是其内部原理图,由图2 可知,每个数码管由8个发光二极管组成,其中a~DP称为数码管的段控信号,K是8个发光二极管的公共端,称为位控信号。
所以为了让数码管显示一个数字,必须将位控信号接低电平,段控信号接高电平。
例如:如要显示数字“1”,b端和c 端应该接高电平,其余各端接低电平。
2.2 键盘扫描原理介绍键盘扫描原理如图3 所示,“K1”和“K2”是按键,按键的两端都接有10k的上拉电阻。
当行扫描端为低电平,同时“K1” 键被按下时,“K1”的列读取端就会出现低电平,由处理器对行扫描信号和列读取信号进行综合判断后,得出“K1”键被按下的结论。
2.3实验连线图实验接线如下图所示:单片机通过8279芯片控制数码管,同时以P1口扫描4*4键盘键值。
三、软件流程图3.1数码管显示实验流程图Y3.2扫描键盘显示实验流程图四、实验步骤⑴参照实验指导书连接杜邦线⑵编写程序,并用KeilC软件调试程序⑶程序编译无错后使用S51ISP 下载软件将程序下载到单片机中⑷观察实验现象,如果实验现象与预期不符则可以使用KeilC的软件仿真调试功能,通过软件仿真使程序单步运行,从中找到编程错误⑸向实验指导老师讲解程序原理,整理仪器离开实验室五、软件源码5.1数码管显示5.1.1C语言#include <reg52.h> //89C52 寄存器定义头文件#define DataPort P0sbit LATCH1=P2^2;//定义锁存使能端口段锁存sbit LATCH2=P2^3;// 位锁存unsigned chartable[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79, 0x71}; //段码表,从0到9,从A到Funsigned char code ID1[]={1,1,0,3,1,0,5,2};unsigned char code ID2[]={1,1,0,8,1,1,6,2};//学号unsigned char code location[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码void Delay(unsigned int t); //延时函数声明/*------------------------------------------------主函数------------------------------------------------*/main(){unsigned char i=0;int a=0;while(1){for(a=0;a<1000;a++){P0=location[i]; //取位码LATCH2=1; //位锁存LATCH2=0;P0=table[ID1[i]]; //取显示数据,段码LATCH1=1; //段锁存LATCH1=0;Delay(200); //扫描间隙延时,时间太长会闪烁,太短会造成重影i++;if(8==i) //检测8位扫描完全结束?如扫描完成则从第一个开始再次扫描8位i=0;} //ID1显示结束for(a=0;a<1000;a++){P0=location[i]; //取位码LATCH2=1; //位锁存LATCH2=0;P0=table[ID2[i]]; //取显示数据,段码LATCH1=1; //段锁存LATCH1=0;Delay(200);//扫描间隙延时,时间太长会闪烁,太短会造成重影i++;if(8==i) //检测8位扫描完全结束?如扫描完成则从第一个开始再次扫描8位i=0;}}} //ID2显示结束/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量-----------------------------------------------------------------------------,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}5.1.2汇编;态扫描数码显示程序;P0口接J3,数据端口;P2.2接J2 B端子,表示段码锁存;P2.3接J2 A端子,标志位码锁存ORG 00HMOV 20H,#06H ;1MOV 21H,#06H ;1MOV 22H,#3FH ;0MOV 23H,#4FH ;3MOV 24H,#06H ;1MOV 25H,#3FH ;0MOV 26H,# 6D H ;5MOV 27H,# 5B H ;2 学号LATCH1 BIT P2.2LATCH2 BIT P2.3 ;定义段锁存与位锁存START:CALL SCANJMP STARTSCAN:MOV A,#0FEH ;扫描子程序MOV R0,#20HSETB CMOV R2,#08HLOOP:MOV P0,ASETB LATCH2CLR LATCH2MOV P0,@R0SETB LATCH1CLR LATCH1INC R0CALL DELAYRLC ADJNZ R2,LOOPMOV R2,#08HRETDELAY:MOV R3,#1 ;扫描延时D1:MOV R4,#2D2:MOV R5,#248DJNZ R5,$DJNZ R4,D2DJNZ R3,D1RETEND5.2扫描键盘显示#include<reg52.h> //包含头文件#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换#define KeyPort P1 //定义按键端口程序中遇到KeyPort 则用P1 替换sbit LATCH1=P2^2;//定义锁存使能端口段锁存sbit LATCH2=P2^3;// 位锁存unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~9 A~Funsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsigned char TempData[8]; //存储显示值的全局变量void DelayUs2x(unsigned char t);//us级延时函数声明void DelayMs(unsigned char t); //ms级延时void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数unsigned char KeyScan(void);//键盘扫描unsigned char KeyPro(void);// 按键值处理函数,返回扫键值void Init_Timer0(void);//定时器初始化/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char num,i,j;unsigned char temp[8];Init_Timer0();while (1) //主循环{num=KeyPro();if(num!=0xff){if(i<8){temp[i]=dofly_DuanMa[num];if(num==14){temp[i]=dofly_DuanMa[num];i++;temp[i]=dofly_DuanMa[6];}for(j=0;j<=i;j++)TempData[7-i+j]=temp[j];}i++;if(i==9)//多出一个按键输入为了清屏原本应该为8{i=0;}}if(num==16){i=0;for(j=0;j<8;j++)//清屏TempData[j]=dofly_DuanMa[0];}Display(0,8); //显示全部8位//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------显示函数,用于动态扫描数码管输入参数FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。
实现特定功能的键盘及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. 通过实验掌握TMS320F2812 通用输入/输出管脚直接控制外围设备的方法2. 了解发光二极管的控制编程方法。
3. 了解SPI 的使用。
4. 了解如何使用GpioA 口进行数据的锁存5. 通过实验掌握TMS320F2812 的扩展端口接收外围设备信息的方法6.了解键盘的使用原理及编程方法【实验内容】1. 按键显示程序,对按键记录次数,以二进制显示在16个LED 上。
2.定时器编程,并用按键控制各位时分秒,使其能完成加减操作【实验仪器】TMS320F2812 数字信号处理器与学生用集成板。
【实验步骤】1. 撰写代码2. 调试代码3.实现功能別f 尹丿占实验报告专业: 姓名:学号: 日期: 地点:电气工程及其自动化 一、实验目的和要求(必填) 三、主要仪器设备(必填) 五、实验数据记录和处理 二、实验内容和原理(必填) 四、操作方法和实验步骤 六、实验结果与分析(必填)【实验代码】 、疋时器① 宏定义和全局变量定义R 犍蛊控制曲钟nclude "DSP281x_De (vic« .h" 卍枝键对应值Uint16 LEEReg;UintlS KeyReg 1:Uitit321 = 0;Uint16Ctrl ; int 16Sec=0;1 Tltl6M IL =0;int 16 Hor-Cl ; UintlSLight[3];秒,按键编码,LED 编码和控制位。
② 共阳字形码O K jOOO.Oxf 900, OxA4OO J .0iBDOO,0x9900,0x5200, OMfl^OD^OxFSOD, O K B000y0x9000.0zBBOO,Oz3300,OxcEDO,Oxa IDO,OxB&OD^OssEciOO , 0x5G (J0,Uxbf DU,Osa7UQ,OzffOa,0x4000,CK79Da,DM240D r Dx^ 000, 0 itl900, O K ISOQ, 0s DEOO,Oz 7000,030000,0x1000);分析:由于这次实验要用到数码管,所以我们要定义一个数码管共阳端字形码,使每一个代码对应一种显 示状态。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微机原理与接口技术之实验八键盘显示控制实验
专业:计算机科学与技术班级学号:201622235 姓名:龚旭
一、实验目的
1、掌握8255控制键盘及显示电路的基本功能及编程方法。
2、掌握一般键盘和显示电路的工作原理。
二、实验内容
1、编程:在小键盘上每按下一个键,4位数码管上显示出相应字符,他们的对应关系如下:
三、编程提示
1、设置8255C口键盘输入、A口为数码管段码输出。
2、参考流程图完成编程。
(上右图)
四、实验内容与过程
代码:
a8255 equ 288H ;8255 A口
c8255 equ 28aH ;8255 C口
k8255 equ 28bH ;8255控制口
data segment
table1 dw 0770h,0B70h,0D70h,0E70h,07B0h,0BB0h,0DB0h,0EB0h
dw 07D0h,0BD0h,0DD0h,0ED0h,07E0h,0BE0h,0DE0h,0EE0h ;键盘扫描码表LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH
DB 39h,5EH,79h,71h,0ffh ;LED段码表,
0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
char db '0123456789ABCDEF' ;字符表
mes db 0ah,0dh,'PLAY ANY KEY IN THE SMALL KEYBOARD! ',0ah,0dh
db 'IT WILL BE ON THE SCREEN! END WITH E ',0ah,0dh,'$'
key_in db 0h
data ends
stacks segment stack ;堆栈空间
db 100 dup (?)
stacks ends
code segment
assume cs:code,ds:data,ss:stacks,es:data
start:
cli
mov ax,data
mov ds,ax
mov es,ax
mov ax,stacks
mov ss,ax
mov dx,offset mes ;显示提示信息
mov ah,09
int 21h
main_key:
MOV DX,k8255 ;初始化8255控制字
mov al,81h
out dx,al
call key ;get a char in (key_in) and display it
call disply ;调显示子程序,显示得到的字符
cmp byte ptr key_in,'E'
jnz main_key
mov ax,4c00h ;if (dl)='E' return to EXIT!
key proc near
key_loop:
int 21h ;退出
mov ah,1
int 16h
jnz exit ;pc键盘有键按下则退出
mov dx,c8255
mov al,0fh
out dx,al
in al,dx ;读行扫描值
and al,0fh
cmp al,0fh
jz key_loop ;未发现有键按下则转
call delay ;delay for amoment
mov ah,al
MOV DX,k8255
mov al,88h
out dx,al
mov dx,c8255
mov al,ah
or al,0f0h
out dx,al
in al,dx ;读列扫描值
and al,0f0h
cmp al,0f0h
jz key_loop ;未发现有键按下则转
mov si,offset table1 ;键盘扫描码表首址
mov di,offset char ;字符表首址
key_tonext:
mov cx,16 ;待查表的表大小
cmp ax,[si] ;cmp (col,row) with every word jz key_findkey ;in the table
dec cx
jz key_loop ;未找到对应扫描码
add si,2
inc di
jmp key_tonext
key_findkey:
mov dl,[di]
mov ah,02
int 21h ;显示查找到的键盘码
mov byte ptr key_in,dl
key_waitup:
MOV DX,k8255
mov al,81h
out dx,al
mov dx,c8255
mov al,0fh
out dx,al
in al,dx ;读行扫描值
and al,0fh
cmp al,0fh
jnz key_waitup ;按键未抬起转
call delay ;delay for amoment
ret
exit: mov byte ptr key_in,'E'
key endp
ret
delay proc near
push ax ;delay 50ms--100ms
mov ah,0
int 1ah
mov bx,dx
delay1:
mov ah,0
int 1ah
cmp bx,dx
jz delay1
mov bx,dx
delay2:
mov ah,0
int 1ah
cmp bx,dx
jz delay2
pop ax
Ret
delay endp
DISPLY PROC NEAR
PUSH ax
MOV BX,OFFSET LED
MOV AL,byte ptr key_in
SUB al,30h
CMP al,09h
JNG DIS2
SUB al,07h
DIS2: XLAT
MOV DX,a8255
OUT DX,AL ;输出显示数据,段码
POP AX
RET
DISPLY ENDP
code ends
end start
五、实验分析
当在键盘上按下不同的按键时,LED数码管上显示不同的字符。
通过这次实验掌握了8255控制键盘及显示电路的工作原理及编程方法,键盘与8255以及数码管的连接原理。
进一步的掌握了8255中各个端口的使用方法,以及按键的识别方法和按键扫描的方法。