实验报告七 键盘扫描及显示实验

合集下载

实验3——键盘与显示

实验3——键盘与显示

计算机学院学院计算机科学与技术专业10班__组学号10姓名协作者______________ 教师评定_______________实验题目键盘与显示一、实验目的1. 学习并掌握行列式键盘的设计方法和工作原理。

2. 掌握单片机系统行列式键盘驱动程序的编写方法。

3. 学习并掌握LED数码管的接口设计。

4. 掌握多位LED数码管动态扫描显示驱动程序的编写方法。

二、实验内容1. 打开ISIS 7 Professional,参照“二、实验电路”设计仿真电路原理图。

2. 编写程序实现:(1). 两步扫描判别法识别16个按键,并将获取的键值在数码管上显示。

(2). 将16个键盘的13个定义为:0~9、取消、设置|却仍。

设单片机所用晶振为12MHz,编写程序实现电子钟,上电启动后初始始终为09年3月20日。

用户可自由修改始终,写该方法如下:按【设置】键,然后依次输入时分秒(HHMMSS)。

按【确认】键确认修改,之前任何一步按【取消】键,退出修改。

三、实验电路4、实验源程序#include<reg51.h>#include"code.h"#define uint unsigned int#define uchar unsigned charuchar date[]={2,0,1,2,1,2,0,2};//定义日期uchar code extra_date[]={2,0,1,2,1,2,0,2};//辅助日期数组uint i,j = 0,key = 16,label = 0;//--------------------------//延时函数xms//--------------------------void delayms(uint xms){uint i,j;for(i = xms;i > 0;i--)for(j = 110;j > 0;j--);}//--------------------------//年月日显示函数//--------------------------void display_date(uint i,uint num){ unsigned chartable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};P2 = table[i];P0 = table[num];delayms(5);}//---------------------------//键盘控制函数//---------------------------void key_scan() //定位每一个按键值{uchar temp;//列扫描P1 = 0xf0;delayms(1);temp = P1 >> 4 ^ 0x0f;switch(temp){case 1: key = 0;break;case 2: key = 1;break;case 4: key = 2;break;case 8: key = 3;break;default: key = 16;}//行扫描P1 = 0x0f;delayms(1);temp = P1 ^ 0x0f;switch(temp){case 1: key += 0;break;case 2: key += 4;break;case 4: key += 8;break;case 8: key += 12;break;}}//---------------------------//主函数//---------------------------void main(){while(1){//数码管显示for(i = 0;i< 8;i++){display_date(i,date[i]);}//扫描键盘获取按键序号keyP1 = 0xf0;if(P1 != 0xf0) key_scan();switch(key){case 0: if(label == 1) date[j++] = 7;delayms(200);break;case 1: if(label == 1) date[j++] = 8;delayms(200);break;case 2: if(label == 1) date[j++] = 9;delayms(200);break;case 4: if(label == 1) date[j++] = 4;delayms(200);break;case 5: if(label == 1) date[j++] = 5;delayms(200);break;case 6: if(label == 1) date[j++] = 6;delayms(200);break;case 7 : if(j == 0) { date[0] = extra_date[0];}else {date[j--] = extra_date[j];date[j] = 10;} delayms(200);break;case 8: if(label == 1) date[j++] = 1; delayms(200);break;case 9: if(label == 1) date[j++] = 2; delayms(200);break;case 10: if(label == 1) date[j++] = 3; delayms(200);break;case 11: date[j] = 10;j = 0;label = 1; delayms(200);break;case 12: if(label == 1) date[j++] = 0; delayms(200);break;case 15: j = 0;label = 0;delayms(200);break;}if(label==1 && j != 0) date[j] = 10;key = 16;}}五、实验总结通过这次实验,我掌握了行列式键盘的工作原理和数码管的接口设计,掌握了多位LED数码管动态扫描显示驱动程序的编写,不过,在这次实验中,编写代码时还是花费了很长时间,通过与同学们一起讨论调试,后来,终于成功的完成了实验,我发现我在这方面还有欠缺,以后一定要继续学习,不断进步。

实验五 键盘扫描实验 实验报告

实验五 键盘扫描实验 实验报告

键盘扫描实验实验报告一、实验目的1. 掌握线反转法键盘扫描原理。

2. 了解单片机的输入和输出过程,理解单片机的数据采集过程。

二、实验内容单片机外接4x4键盘,通过线反转法判断按下的键,并在数码管上显示按键对应的数字。

第一行从左到右分别是开关K0, K1, K2, K3,第二行从左到右分别是K4, K5, K6, K7以此类推。

当按下Kn时,在数码管上显示数字n。

三、实验原理线翻转法:先对行(R0-R3)置0,对列(R4-R7)置1。

当有键被按下时,会把按键所在的列的电位从1变0,记录下位置;然后再将行列翻转,记录下按下键的所在行,两数进行或运算,就可以得到一个唯一表示按下键的数字。

例如:假定R0-R7分别与单片机的P2.0-P2.7相连。

先把R4-R7置1,R0-R3置0(通过指令MOV P2, #0F0H实现)。

当键K5被按下时,R5电位被拉低为低电平。

此时,P2口表示的数为:1101 0000(0xD0);然后再置R4-R7为0,R0-R3为1,此时,R1电位被拉低为低电平,此时,P2口表示的数为:0000 1101(0x0D)。

将两数相与取反,得到:0010 0010。

四、实验过程1. 连接好单片机及其外围设备电路2. 编写汇编程序ORG LJMP KeyLJMP K7: CJNE R2, #82H, K8ORG 0100H MOV P0, #0F8H Init: CLR P1.3 LJMP KeyMOV P0, #0C0H K8: CJNE R2, #14H, K9 Key: MOV P2, #0F0H MOV P0, #080HMOV A, P2 LJMP KeyMOV R1, A K9: CJNE R2, #24H, K10MOV P2, #0FH MOV P0, #090HMOV A, P2 LJMP KeyORL A, R1 K10: CJNE R2, #44H, K11CPL A MOV P0, #088HMOV R2, A LJMP KeyJNZ KeyPro K11: CJNE R2, #84H, K12LJMP Key MOV P0, #083H KeyPro: CJNE R2, #11H, K1 LJMP KeyMOV P0, #0C0H K12: CJNE R2, #18H, K13LJMP Key MOV P0, #0C6H K1: CJNE R2, #21H, K2 LJMP KeyMOV P0, #0F9H K13: CJNE R2, #28H, K14LJMP Key MOV P0, #0A1H K2: CJNE R2, #41H, K3 LJMP KeyMOV P0, #0A4H K14: CJNE R2, #48H, K15LJMP Key MOV P0, #086H K3: CJNE R2, #81H, K4 LJMP KeyMOV P0, #0B0H K15: CJNE R2, #88H, K16LJMP Key MOV P0, #08EH K4: CJNE R2, #12H, K5 LJMP KeyMOV P0, #099H K16: LJMP KeyLJMP Key ENDK5: CJNE R2, #22H, K6MOV P0, #092HLJMP KeyK6: CJNE R2, #42H, K7MOV P0, #082H五、实验结果1. 当按下开关Kn时,数码管能够显示对应的数字。

实验六、键盘与显示编程

实验六、键盘与显示编程

实验六、键盘与显示编程
一、实验目的
1、掌握数码管显示程序的设计。

2、掌握键盘扫描程序的设计。

二、实验内容
设计单片机程序,读取键盘的按键值(键值为1~16),并将键值在数码管上以10进制进行显示。

三、实验原理
数码管动态扫描显示的基本原理是,单片机依次向每个数码管发出段选码和对应的位选码,对数码管逐个循环点亮,选择适当的扫描速度,利用人眼的视觉暂留效应,使得虽然每个时刻只有一个数码管在显示,但得看上去好像同时显示,动态扫描在定时中断中调用,以保证准确的扫描速度。

需要显示的数字必须先进行译码变成能显示的段码才能进行显示,译码可以通过查表来实现。

键盘扫描的基本原理是,列线逐列输出低电平,同时检测行线的电平,如其中有低电平时,表明当位于前行列位置上的键被按下,然后由行和列确定键值。

在按键处理操作中,键被按下再被释放为一次按键操作,另外还进行键盘去抖动处理,用软件延时方法解决。

四、电路接线图
四、实验预习
1、学习有关数码管扫描显示和键盘扫描的知识。

2、提前编写程序,写出预习报告。

五、实验报告
1、总结出实验的详细步骤。

2、写出调试正确的程序及框图。

键盘扫描实验说明

键盘扫描实验说明

实验二、键盘扫描实验
一、实验目的
1.掌握TMS320VC5509 DSP的硬件基础知识。

2.掌握CCS软件安装、编译、连接仿真器、装载程序的方法。

3.掌握TMS320VC5509 DSP编写程序的方法和调试步骤。

4.掌握键盘的工作原理,读懂程序,编译,连接仿真器,装载程序,观看实验效果。

二、实验内容
1.查找相关资料,结合原理图,读懂DSP模块的原理图,掌握其工作原理。

2.按照实验指导书的步骤进行操作,观看实验效果,并填写实验报告。

三、实验仪器
1.3G移动互联网实验箱DSP模块。

2.XDS100v2 DSP仿真器。

四、实验原理
1、硬件原理图
2、编程要求及程序流程图
编程要求:按下DSP模块上的S1——S4,对应在CCS5.2软件中显示所按的按键。

五、实验步骤
第一步:打开电源
上电顺序:先连接仿真器到电脑的USB接口上,然后将仿真器的14PIN JTAG仿真头按照上图的方向插入到DSP模块的“DSP_JTAG”上,注意仿真头里有堵孔,堵孔的那个管脚对应“DSP_JTAG”的剪脚。

最后打开实验箱箱体左侧的船型开关,将DSP模块上电。

第二步:导入工程Key
第三步:编译Build
第四步:Debug
第五步:运行程序,查看实验效果。

实验报告 实验七 八段数码管显示实验

实验报告      实验七   八段数码管显示实验

实验报告实验七八段数码管显示实验----b46086b6-6eaf-11ec-8071-7cb59b590d7d实验报告--实验七-八段数码管显示实验EDA实验报告七段或八段数码管显示实验1、实验目的1)了解数码管动态显示的原理。

2)了解如何通过总线控制数码管显示器2、实验要求:利用实验仪提供的显示电路,动态显示一行数据.提示:显示显示缓冲区的内容(例如,可以使用60H~65h作为缓冲区)。

修改显示缓冲区的内容时,可以显示修改后的内容(为键盘扫描和显示实验做准备)。

3、实验说明实验仪器提供了一个6位8段编码的LED显示电路。

学生可以控制显示,只要他们根据地址输出相应的数据。

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

8位段码和6位码由两个74ls374芯片输出。

位代码由mc1413或uln2022反相驱动后,选择相应的显示位。

本实验仪中8位段码输出地址为0x004h,位码输出地址为0x002h。

此处x是由key/ledcs决定,参见地址译码。

在进行键盘和led实验时,需要将按键/LEDC连接到相应的地址解码。

以便使用相应的地址进行访问。

例如,如果钥匙/ledcs连接到CS0,则段代码地址为08004h,位代码地址为08002h。

七段数码管的字型代码表如下表:a-----f | | b | |------| g | e | c-----d。

h显示字体gfedcba段代码001111113FH100011006H210110115BH3100111114FH41100111066H51016DH61111017DH70000 1107H81111117FH911011116fha111011177hb11111007chc011100139hd10111105ehe111100179hf111000171h4.原理图和接线5、实验内容1)使用仪器和仪表开发平台模型本实验用到了wave6000软件平台,电脑一台,lab6000实验箱,示波器,若干连线,串行数据线。

实验报告模板

实验报告模板

《电子设计入门2》实验报告实验名称:设计及制作——电子时钟班级:电气1403姓名:黄海荣学号:3141901304日期:2015-11-3指导教师:吴忠强老师一、实验目的1. 学习并掌握七段数码管动态扫描显示原理。

2. 学习并掌握PIC单片机定时器0设置及中断编程。

3. 学习并掌握按键输入设置电子时钟的编程方法。

4. 学习并掌握Protues与MPLAB IED联合调试方法。

二、实验内容1. 学习MPLAB IED开发环境的使用,并掌握Protues软件的操作,完成实验仿真,并描述本仿真实验的基本功能;2.学习并掌握七段数码管动态扫描原理,将Protues中的共阴极数码管(CC)替换成共阳极数码管(CA),修改程序中的显示代码数组,实现共阳极数码管的时钟显示;3.学习并掌握PIC单片机定时器0的设置,及其在PICC编译器环境下的中断编程方法,通过阅读代码,将定时器0由原来的1ms定时设置为5ms定时,并实现准确的时钟计数和显示;4. 学习并掌握按键输入功能程序的编写,并将原程序中的按键弹起有效改成按键按下有效。

三、实验过程1.MPLAB IED开发环境的使用,及Protues软件的操作;(1).打开Protues工程,工程名称为:VSM_FOR_TIMER.DSN,进入原理图界面,单片机PB口为数码管数据输出管脚,PC口为数码管位选管脚,PD口的低4位用作按键输入。

设置Protues的仿真方式为远程调试;(2).打开MPLAB工程,工程名称为:TIMER.MCP,进入IDE开发界面的工程导航窗口,观察到工程由3个C文件和3个H文件组成,display.c为数码管动态扫描并显示子程序;key_scan.c为按键功能子程序,提供键盘按下弹起的扫描码;main.c为主程序,在主程序里提供了定时器0的初始化和定时器0中断子程序。

(3).在MPLAB IED开发环境中,对工程进行编译,生成单片机可执行的HEX 文件,并在Protues的工程中,将单片机的可执行目标文件指定为MPLAB IED 编译生成的HEX文件。

行列式键盘扫描

行列式键盘扫描

实验二 行列式键盘扫描一. 实验内容与目的1. 实验内容利用行列式键盘,当按下键盘中的一个键子时会在数码管上显示出相应的键值,要求键盘有去抖功能,数码管显示的键值能进行移位。

2,实验目的学会行列式键盘扫描的原理与方法,进一步强化对MSP430I/O 口使用方法的掌握,加强msp430C 语言编程的能力。

二. 方法与结果键盘扫描:利用P3口进行键盘扫描,如图,令P3.0~P3.3为输出端口,P3.4~P3.7为输入端口,由于P3.4~P3,7接了上拉电阻,所以当没有键子按下时P3.4~P3.7都为‘1’,当有键子按下时P3.4~P3.7就有可能发生变化。

所以键盘扫描式先让P3.0~P3.3都为‘0’,当有键子按下时P3.4~P3.7就会有一个由‘1’变为‘0’,根据哪一个变为‘0’就能判断出相应的列有键子按下,再让P3.0~p3.3逐个变为‘1’判断出哪一行有键子按下进而确定出哪一个键子按下。

11221112221122311224112251122611227112281122911221122#1122*1122A 1122B1122C1122DR2510k R2610kR2710kR2810kP_30P_31P_32P_33P_34P_35P_36P_37P3.0~p3.3为‘0’P3.4~p3.7都为‘1’P3.4~P3.7不都为‘1’ 令P3.0~p3.3逐个为‘1’ 确定列确定行当P3.4~p3.7都为‘1’确定键值数码管显示:数码管位选与段选共用P1.0~P1.3,利用锁存器74HC373分时进行段选和位选,P6.1和P6.2控制74HC373,从而使相应数码管显示相应数。

电路图如下:e 1d 2d p3c 4g 546b 73829f 10a 11112seg4O E 1Q 02D 03D 14Q 15Q 26D 27D 38Q 39G N D 10L E11Q 412D 413D 514Q 515Q 616D 617D 718Q 719V C C 2074HC373_174HC373O E 1Q 02D 03D 14Q 15Q 26D 27D 38Q 39G N D 10L E11Q 412D 413D 514Q 515Q 616D 617D 718Q 719V C C 2074HC373_274HC373R19100R20100R21100R22100R2310k R2410k P_61P_62VCCVCCGND GNDGND GND GNDGNDP_10P_11P_12P_13P_14P_15P_16P_17三. 实验程序#include<msp430.h> void KEYSCAN(); void TUBESCAN();void KEYSLOVE( unsigned int key); unsigned char const table[]={0xff,0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //0~F 码值 unsigned int s1=0,s2=0,s3=0,s4=0; //s1~s4保存相应键值,进行显示 unsigned int key;void delay1(unsigned int i) {while(i--); }void main() {WDTCTL=WDTPW+WDTHOLD; P1DIR=0xff; P1SEL=0x00; P3SEL=0x00; P3DIR=0x0f;P6DIR=BIT1+BIT2; TUBESCAN(); P3OUT=0xf0; while(1)KEYSCAN();TUBESCAN();}}void KEYSCAN(){P3OUT=0xf0;if(P3IN!=0xf0){switch(P3IN){case (0xe0):P3OUT=0x01;if(P3IN==0xf1) {key=16;break;}P3OUT=0x02;if(P3IN==0xf2) {key=12;break;}P3OUT=0x04;if(P3IN==0xf4) {key=8;break;}P3OUT=0x08;if(P3IN==0xf8) {key=4;break;}case (0xd0):P3OUT=0x01;if(P3IN==0xf1) {key=15;break;}P3OUT=0x02;if(P3IN==0xf2) {key=11;break;}P3OUT=0x04;if(P3IN==0xf4) {key=7;break;}P3OUT=0x08;if(P3IN==0xf8) {key=3;break;}case (0xb0):P3OUT=0x01;if(P3IN==0xf1) {key=14;break;}P3OUT=0x02;if(P3IN==0xf2) {key=10;break;}P3OUT=0x04;if(P3IN==0xf4) {key=6;break;}P3OUT=0x08;if(P3IN==0xf8) {key=2;break;}case (0x70):P3OUT=0x01;if(P3IN==0xf1) {key=13;break;}P3OUT=0x02;if(P3IN==0xf2) {key=9;break;}P3OUT=0x04;if(P3IN==0xf4) {key=5;break;}P3OUT=0x08;if(P3IN==0xf8) {key=1;break;}}P3OUT=0xf0;KEYSLOVE(key);} //键盘扫描函数,得到相应的键值key }void KEYSLOVE( unsigned int key){delay1(200);if(P3IN!=0xf0){while(P3IN!=0xf0) TUBESCAN(); //键盘去抖,保证当手松开时读取键值if(s4==0)s4=s3;s3=s2;s2=s1;s1=key;}else{if(key==16){s1=0;s2=0;s3=0;s4=0;key=0;}}}} //将得到的键值进行处理:移位/重置void TUBESCAN(){P6OUT=0x02;P1OUT=table[s4];P6OUT=0x04;P1OUT=0x01;delay1(400);P6OUT=0x02;P1OUT=table[s3];P6OUT=0x04;P1OUT=0x02;delay1(400);P6OUT=0x02;P1OUT=table[s2];P6OUT=0x04;P1OUT=0x04;delay1(400);P6OUT=0x02;P1OUT=table[s1];P6OUT=0x04;P1OUT=0x08;delay1(400);} //数码管扫描,使数码管保持四.行列式键盘实验总结①做行列是键盘重点是键盘扫描确定键值,键盘扫描也有多种方式,要多思考确定最优方式,采用本实验中的键盘扫描方式当没有键子按下时不必执行键盘扫描的其他程序,将更多的时间给了数码管扫描,挺优的,在着手写程序之前一定要筹划如何去写,要寻求简单易行的方法,写程序规划挺重要的。

键盘扫描显示实验程序

键盘扫描显示实验程序

OUTBIT equ 0e101h CLK164 equ 0e102h DAT164 equ 0e102h IN equ 0e103h LEDBuf equ 60h ljmp Start LEDMAP: db 3 , 06h, 5bh, 4 , 66h, 6dh, 7dh, 07h db 7 , 6 , 77h, 7ch, 39h, 5eh, 79h, 71h db 00H Delay: mov r7, #0 DelayLoop: djnz r7, DelayLoop djnz r6, DelayLoop ret DisplayLED: mov r0, #LEDBuf mov r1, #6 mov r2, #00100000b Loop: mov dptr, #OUTBIT mov a, #0 movx @dptr, a mov a, @r0 mov B, #8 DLP: rlc a mov r3, a mov acc.0, c mov dptr, #DAT164 anl a,#0fdh movx @dptr, a mov dptr, #CLK164 orl a,#02h movx @dptr, a anl a,#0fdh movx @dptr, a mov a, r3 djnz B, DLP mov dptr, #OUTBIT mov a, r2 movx @dptr, a mov r6, #1 call Delay mov a, r2 rr a mov r2, a inc r0 djnz r1, Loop ret TestKey: mov dptr, #OUTBIT mov a, #0 movx @dptr, a mov dptr, #IN movx a, @dptr cpl a anl a, #0 ret KeyTable: db 00h, 01h, 04h, 07h db 0 , 02h, 05h, 08h db 0eh, 03h, 06h, 09h db 0dh, 0ch, 0bh, 0ah db 10H,10H,10H,10H,10H, db 10H,10H,10H,10H,10H GetKey: mov dptr, #OUTBIT mov P2, dph mov r0, #Low(IN) mov r1, #00100000b mov r2, #6 KLoop: mov a, r1 cpl a movx @dptr, a cpl a rr a mov r1, a movx a, @r0 cpl a anl a, #0 jnz Goon1 djnz r2, KLoop mov r2, #0 sjmp Exit Goon1: mov r1, a mov a, r2 dec a rl a rl a mov r2, a mov a, r1 mov r1, #4 LoopC: rrc a jc Exit inc r2 djnz r1, LoopC Exit: mov a, r2 mov dptr, #KeyTable movc a, @a+dptr mov r2, a WaitRelease: mov dptr, #OUTBIT clr a movx @dptr, a mov r6, #10 call Delay call TestKey jnz WaitRelease mov a, r2 ret Start: mov sp, #40h mov dptr,#0e100h mov a,#03h movx @dptr,a mov LEDBuf, #0 mov LEDBuf+1, #0 mov LEDBuf+2, #0 mov LEDBuf+3, #0 mov LEDBuf+4, #0 mov LEDBuf+5, #0 MLoop: call DisplayLED call TestKey jz MLoop call GetKey anl a, #1 mov dptr, #LEDMap movc a, @a+dptr mov LEDBuf+5, a ljmp MLoop end 。

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

第 1 页 共 1 页 信息工程学院实验报告 课程名称:微机原理与接口技术 实验项目名称:键盘扫描及显示实验 实验时间:2017.1.6 班级: 姓名: 学号:

一、实 验 目 的 1. 掌握 8254 的工作方式及应用编程。 2. 掌握 8254 典型应用电路的接法。 二、实 验 设 备 了解键盘扫描及数码显示的基本原理,熟悉 8255 的编程。 三、实 验 原 理 将 8255 单元与键盘及数码管显示单元连接,编写实验程序,扫描键盘输入,并将扫描结果送数码管显示。键盘采用 4×4 键盘,每个数码管显示值可为 0~F 共 16 个数。实验具体内容如下:将键盘进行编号,记作 0~F,当按下其中一个按键时,将该按键对应的编号在一个数码管上显示出来,当再按下一个按键时,便将这个按键的编号在下一个数码管上显示出来,数码管上可以显示最近 6 次按下的按键编号。 键盘及数码管显示单元电路图如图 7-1 和 7-2 所示。8255 键盘及显示实验参考接线图如图 7-3 所示。

图 7-1 键盘及数码管显示单元 4×4 键盘矩阵电路图

成 绩: 指导老师(签名): 第 2 页 共 2 页 图 7-2 键盘及数码管显示单元 6 组数码管电路图 图 7-3 8255 键盘扫描及数码管显示实验线路图 四、实 验 内 容 与 步 骤 1. 实验接线图如图 7-3 所示,按图连接实验线路图。 第 3 页 共 3 页

图 7-4 8255 键盘扫描及数码管显示实验实物连接图 2. 运行 Tdpit 集成操作软件,根据实验内容,编写实验程序,编译、链接。

图 7-5 8255 键盘扫描及数码管显示实验程序编辑界面 3. 运行程序,按下按键,观察数码管的显示,验证程序功能。

五、实 验 结 果 及 分 析: 1. 运行程序,按下按键,观察数码管的显示。 第 4 页 共 4 页

图7-6 实验结果 分析:当按下键盘其中一个按键时,将该按键对应的编号在一个数码管上显示出来,当再按下一个按键时,便将这个按键的编号在下一个数码管上显示出来,数码管上可以显示最近 6 次按下的按键编号。

六、实 验 总 结: 通过本实验,我了解键盘扫描及数码显示的基本原理,以及熟悉 8255 的编程。通过本次实验加深了对理论编程的知识的理解,巩固了我的理论知识。

附 录: ;Keyscan.asm ;键盘扫描及数码管显示实验

;查看端口资源分配情况,记录实验系统I/O端口始地址 IOY0 EQU 0D000H ;片选IOY0对应的端口始地址 第 5 页 共 5 页

MY8255_A EQU IOY0+00H*4 ;8255的A口地址 MY8255_B EQU IOY0+01H*4 ;8255的B口地址 MY8255_C EQU IOY0+02H*4 ;8255的C口地址 MY8255_MODE EQU IOY0+03H*4 ;8255的控制寄存器地址

STACK1 SEGMENT STACK DW 256 DUP(?) STACK1 ENDS

DATA SEGMENT DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H DATA ENDS ;键值表,0~F对应的7段数码管的段位值

CODE SEGMENT ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA MOV DS,AX

MOV SI,3000H ;建立缓冲区,存放要显示的键值 MOV AL,00H ;先初始化键值为0 MOV [SI],AL MOV [SI+1],AL MOV [SI+2],AL MOV [SI+3],AL MOV [SI+4],AL MOV [SI+5],AL MOV DI,3005H

MOV DX,MY8255_MODE ;初始化8255工作方式 MOV AL,81H ;方式0,A口、B口输出,C口低4位输入 OUT DX,AL MOV CX,0040h BEGIN1: PUSH CX

BEGIN: CALL DIS ;显示刷新 CALL CLEAR ;清屏 CALL CCSCAN ;扫描按键

JNZ GETKEY1 ;有键按下则跳置GETKEY1 POP CX LOOP BEGIN1 MOV CX,0040h MOV AH,01h ;判断PC键盘是否有按键按下 INT 16H 第 6 页 共 6 页

JZ BEGIN1 ;无按键则跳回继续循环,有则退出 QUIT: MOV AX,4C00H ;返回到DOS INT 21H

GETKEY1:CALL DIS ;显示刷新 CALL DALLY CALL DALLY CALL CLEAR ;清屏 CALL CCSCAN ;再次扫描按键 JNZ GETKEY2 ;有键按下则跳置GETKEY2 JMP BEGIN ;否则跳回开始继续循环

GETKEY2:MOV CH,0FEH MOV CL,00H ;设置当前检测的是第几列 COLUM: MOV AL,CH ;选取一列,将X1~X4中一个置0 MOV DX,MY8255_A OUT DX,AL MOV DX,MY8255_C ;读Y1~Y4,用于判断是哪一行按键闭合 IN AL,DX

L1: TEST AL,01H ;是否为第1行 JNZ L2 ;不是则继续判断 MOV AL,00H ;设置第1行第1列的对应的键值 JMP KCODE

L2: TEST AL,02H ;是否为第2行 JNZ L3 ;不是则继续判断 MOV AL,04H ;设置第2行第1列的对应的键值 JMP KCODE

L3: TEST AL,04H ;是否为第3行 JNZ L4 ;不是则继续判断 MOV AL,08H ;设置第3行第1列的对应的键值 JMP KCODE

L4: TEST AL,08H ;是否为第4行 JNZ NEXT ;不是则继续判断 MOV AL,0CH ;设置第4行第1列的对应的键值

KCODE: ADD AL,CL ;将第1列的值加上当前列数,确定按键值 CALL PUTBUF ;保存按键值

PUSH AX KON: CALL DIS ;显示刷新 CALL CLEAR ;清屏 CALL CCSCAN ;扫描按键,判断按键是否弹起 第 7 页 共 7 页

JNZ KON ;未弹起则继续循环等待弹起 POP AX

NEXT: INC CL ;当前检测的列数递增 MOV AL,CH TEST AL,08H ;检测是否扫描到第4列 JZ KERR ;是则跳回到开始处

ROL AL,1 ;没检测到第4列则准备检测下一列 MOV CH,AL JMP COLUM KERR: JMP BEGIN CCSCAN PROC NEAR ;扫描是否有按键闭合子程序 MOV AL,00H MOV DX,MY8255_A ;将4列全选通,X1~X4置0 OUT DX,AL MOV DX,MY8255_C IN AL,DX ;读Y1~Y4 NOT AL AND AL,0FH ;取出Y1~Y4的反值 RET CCSCAN ENDP

CLEAR PROC NEAR ;清除数码管显示子程序 MOV DX,MY8255_B ;段位置0即可清除数码管显示 MOV AL,00H OUT DX,AL RET CLEAR ENDP

DIS PROC NEAR ;显示键值子程序 PUSH AX ;以缓冲区存放的键值为键值表偏移找到键值并显示 MOV SI,3000H MOV DL,0DFH MOV AL,DL AGAIN: PUSH DX MOV DX,MY8255_A OUT DX,AL ;设置X1~X4,选通一个数码管 MOV AL,[SI] ;取出缓冲区中存放键值 MOV BX,OFFSET DTABLE AND AX,00FFH ADD BX,AX MOV AL,[BX] ;将键值作为偏移和键值基地址相加得到相应的键值 MOV DX,MY8255_B OUT DX,AL ;写入数码管A~Dp CALL DALLY 第 8 页 共 8 页

INC SI ;取下一个键值 POP DX MOV AL,DL TEST AL,01H ;判断是否显示完? JZ OUT1 ;显示完,返回 ROR AL,1 MOV DL,AL JMP AGAIN ;未显示完,跳回继续 OUT1: POP AX RET DIS ENDP

PUTBUF PROC NEAR ;保存键值子程序 MOV SI,DI MOV [SI],AL DEC DI CMP DI,2FFFH JNZ GOBACK MOV DI,3005H GOBACK: RET PUTBUF ENDP

DALLY PROC NEAR ;软件延时子程序 PUSH CX MOV CX,0fffH D1: MOV AX,00FFH D2: DEC AX JNZ D2 LOOP D1 POP CX RET DALLY ENDP

CODE ENDS END START

相关文档
最新文档