三型键盘显示控制器实验板教师实验指导汇编.docx
《三型键盘显示控制器实验板教师实验指导汇编.docx》由会员分享,可在线阅读,更多相关《三型键盘显示控制器实验板教师实验指导汇编.docx(70页珍藏版)》请在冰豆网上搜索。
三型键盘显示控制器实验板教师实验指导汇编
清华大学微型计算机实验系统
三型键盘显示实验板
教师用实验指导
(汇编部分)
清华大学科教仪器厂
2008年8月
实验板介绍
一、实验板原理:
实验板由可编程并行接口8255、6个数码管,16键小键盘组成。
通过一个20芯扁平电缆与主实验台相连。
该实验板可以和TPC-2003A+、TPC-USB+、TTC-2实验系统配套使用。
原理图如下:
图18255及20芯电缆信号
图2数码显示
图316键键盘
实验板上的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编程原理。
2、了解键盘阵列结构,学会读取按键的方法。
二、实验容
按图4接线,8255C口接键盘(8255的C0~C3接键盘的列0~列3,C4~C7接键盘的行0~行3),片选CS接大板上地址译码输出的288h~28fh。
用20芯扁平电缆连接实验板与主实验台上的20芯扩展插座。
图4键盘扫描实验原理图
8255端口A地址为:
288H
端口C地址为:
28AH
控制口地址为:
28BH
编程使得在键盘阵列上每按一个键后,微机屏幕上有相应字符显示出来,按“E”退出程序。
三、编程指南
1.识别键盘上的闭合键,通过采用行扫描法或行翻转法:
★行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值;如果列值中有某位为低电平,则表明行列交点处的键被按下;否则扫描下一行,直到扫完全部的行线为止。
★行反转法识别闭合键时,要将行线接一个并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作在输入方式;程序通过输出端口向全部行线上送低电平,然后读取列线的值;如果此时有某一键被按下,则必定会使某一列线值为零,程序再对两个并行端口进行方式设置,使行线工作在输入方式,列线工作在输出方式,并且将刚才读到的列线值从列线所接的并行端口输出,再读取行线上的值;那么,在闭合键所在的行线上的值必定为零。
这样,当一个键被按下时,必定可以读到一对唯一的行值和列值。
在我们提供的程序中就采用行反转法来识别键盘按键。
2.在程序设计时,将各个键对应的代码(列值,行值)放在一个表中,程序通过查表来确定具体按下的为哪一个键。
四、参考流程
主程序流程图:
键盘扫描子程序流程图:
(见下页图)
五.参考程序:
key.asm
;********************;
;*8255薄膜按键实验*;
;********************;
ioportequ0cc00H-280H
a8255equioport+288H;8255A口
b8255equioport+289H;8255B口
c8255equioport+28aH;8255C口
k8255equioport+28bH;8255控制口
datasegment
table1dw0770h,0B70h,0D70h,0E70h,07B0h,0BB0h,0DB0h,0EB0h
dw07D0h,0BD0h,0DD0h,0ED0h,07E0h,0BE0h,0DE0h,0EE0h;键盘扫描码表
chardb'0123456789ABCDEF';字符表
mesdb0ah,0dh,'PLAYANYKEYINTHESMALLKEYBOARD!
',0ah,0dh
db'ITWILLBEONTHESCREEN!
ENDWITHE',0ah,0dh,'$'
key_indb0h
dataends
stackssegmentstack;堆栈空间
db100dup(?
)
stacksends
codesegment
assumecs:
code,ds:
data,ss:
stacks,es:
data
start:
cli
movax,data
movds,ax
moves,ax
参考程序:
(接上页)
movax,stacks
movss,ax
movdx,offsetmes;显示提示信息
movah,09
int21h
main_key:
callkey;getacharin(key_in)anddisplayit
cmpbyteptrkey_in,'E'
jnzmain_key
movax,4c00h;if(dl)='E'returntoEXIT!
int21h;退出
keyprocnear
key_loop:
movah,1
int16h
jnzexit;pc键盘有键按下则退出
MOVDX,k8255
moval,81h
outdx,al
movdx,c8255
moval,0fh
outdx,al
inal,dx;读行扫描值
andal,0fh
cmpal,0fh
jzkey_loop;未发现有键按下则转
calldelay;delayforamoment
movah,al
MOVDX,k8255
moval,88h
outdx,al
movdx,c8255
moval,ah
oral,0f0h
outdx,al
inal,dx;读列扫描值
andal,0f0h
cmpal,0f0h
jzkey_loop;未发现有键按下则转
movsi,offsettable1;键盘扫描码表首址
movdi,offsetchar;字符表首址
movcx,16;待查表的表大小
key_tonext:
cmpax,[si];cmp(col,row)witheveryword
jzkey_findkey;inthetable
deccx
jzkey_loop;未找到对应扫描码
addsi,2
incdi
jmpkey_tonext
key_findkey:
movdl,[di]
movah,02
int21h;显示查找到的键盘码
movbyteptrkey_in,dl
key_waitup:
MOVDX,k8255
moval,81h
outdx,al
movdx,c8255
moval,0fh
outdx,al
inal,dx;读行扫描值
andal,0fh
cmpal,0fh
jnzkey_waitup;按键未抬起转
calldelay;delayforamoment
ret
exit:
movbyteptrkey_in,'E'
ret
keyendp
delayprocnear
pushax;delay50ms--100ms
movah,0
int1ah
movbx,dx
delay1:
movah,0
int1ah
cmpbx,dx
jzdelay1
movbx,dx
delay2:
movah,0
int1ah
cmpbx,dx
jzdelay2
popax
ret
delayendp
codeends
endstart
实验二8255控制数码管显示实验
(一)
一、实验目的
1、了解七段数码管(LED)显示数字的原理。
2、掌握用一个8255控制数码管显示数字的技术。
二、实验容
静态显示:
电路原理如图5。
8255CS接地址译码输出的288h~28fh。
用20芯扁平电缆连接实验板与主实验台上的20芯扩展插座。
8255的A口(PA0~PA6)与七段数码管的段码输入端a~g,8255的B口(PB0~PB5)与位码驱动输入端已连好,不用再接线。
编程从主机键盘输入一位十进制数字(0~9),在七段数码管上显示出来。
图5数码管显示
4.
三、编程提示
1、实验台上的七段数码管为共阴型,段码采用同相驱动,输入端加高电平,选中的相应段亮,位码加反相驱动器,位码输入端高电平选中。
2、七段数码管的字型代码表如下表:
显示字形
g
e
f
d
c
b
a
段码
0
0
1
1
1
1
1
1
3fh
1
0
0
0
0
1
1
0
06h
2
1
0
1
1
0
1
1
5bh
3
1
0
0
1
1
1
1
4fh
4
1
1
0
0
1
1
0
66h
5
1
1
0
1
1
0
1
6dh
6
1
1
1
1
1
0
1
7dh
7
0
0
0
0
1
1
1
07h
8
1
1
1
1
1
1
1
7fh
9
1
1
0
1
1
1
1
6fh
3、静态显示参考流程图
4、静态显示参考程序:
(程序名:
LED1.ASM)
;**************************************
;*键盘输入数据(0-9)控制LED数码管显示*
;*2008年8月为三型键盘显示板修改*
;**************************************
datasegment
ioportequ0cc00h-0280h
io8255aequioport+288h
io8255bequioport+289h
io8255cequioport+28ah
io8255kequioport+28bh
leddb3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
mesg1db0dh,0ah,'Inputanum(0--9),otherkeyisexit:
',0dh,0ah,'$'
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movdx,io8255k;使8255的A口B口为输出方式
movax,80h
outdx,al
movdx,io8255b
moval,0ffh
outdx,al
sss:
movdx,offsetmesg1;显示提示信息
movah,09h
int21h
movah,01;从键盘接收字符
int21h
cmpal,'0';是否小于0
jlexit;若是则退出
cmpal,'9';是否大于9
jgexit;若是则退出
subal,30h;将所得字符的ASCII码减30H
movbx,offsetled;bx为数码表的起始地址
xlat;求出相应的段码
movdx,io8255a;从8255的A口输出段码
outdx,al
jmpsss;转SSS
exit:
movah,4ch;返回
int21h
codeends
endstart
实验三8255控制数码管显示实验
(二)
一、实验目的
1、了解七段数码管(LED)显示数字的原理。
2、掌握只用一个8255控制同时显示多位数字的技术。
二、实验容
动态显示1:
接线同实验二,编程在数码管上显示5、6两位数字。
三、动态显示1参考流程
四、动态显示1参考程序:
(程序名:
LED2.ASM)
;**************************************
;*LED数码管实验*
;*动态显示“56”*
;**************************************
datasegment
ioportequ0cc00h-0280h
io8255bequioport+289h;8255B口
io8255kequioport+28bh;8255控制口
io8255aequioport+288h;8255A口
leddb3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;段码
buffer1db6,5;存放要显示的个位和十位
bzdw?
;位码
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movdx,io8255k;将8255设为A口输出
moval,80h
outdx,al
movdi,offsetbuffer1;设di为显示缓冲区
loop2:
movbh,02
lll:
movbyteptrbz,bh
pushdi
decdi
adddi,bz
movbl,[di];bl为要显示的数
popdi
moval,0
movdx,io8255b
outdx,al
movbh,0
movsi,offsetled;置led数码表偏移地址为SI
addsi,bx;求出对应的led数码
moval,byteptr[si]
movdx,io8255a;自8255A的口输出
outdx,al
moval,byteptrbz;使相应的数码管亮
movdx,io8255b
outdx,al
movcx,3000
delay:
loopdelay;延时
movbh,byteptrbz
shrbh,1
jnzlll
movdx,0ffh
movah,06
int21h
jeloop2;有键按下则退出
movdx,io8255b
moval,0;关掉数码管显示
outdx,al
movah,4ch;返回
int21h
codeends
endstart
实验四8255控制数码管显示实验(三)
一、实验目的
1、了解七段数码管(LED)显示数字的原理。
2、掌握只用一个8255控制同时显示多位数字的技术。
二、实验容
动态显示2:
接线不变,编程在数码管上循环显示000000-999999计数值。
三、动态显示2参考流程
四、动态显示2参考程序LED.ASM
;****************************;
;*LED段位控制显示实验(I/O)*;
;****************************;
ioportequ0cc00h-280h
PORTSEGEQUioport+289H;数码管端口地址,段码地址
PORTBITEQUioport+288H;数码管端口地址,位码地址
P8255EQUioport+28bH
datasegment
BIT1DB0;1段显示数字
BIT2DB0;2段显示数字
BIT3DB0;3段显示数字
BIT4DB0;4段显示数字
BIT5DB0;5段显示数字
BIT6DB0;6段显示数字
LEDDB3FH,06,5BH,4FH,66H,6DH,7DH,07,7FH,6FH;LED段码表,1,2,3,4,5,6,7,8,9,0
MESDB'DISPLAYTHELEDS,PRESSANYKEYTOEXIT!
',0AH,0DH,'$'
dataends
stackssegmentstack;堆栈空间
db100dup(?
)
stacksends
codesegment
assumecs:
code,ds:
data,ss:
stacks,es:
data
start:
.386
cli
movax,data
movds,ax
moves,ax
movax,stacks
movss,ax
MOVDX,OFFSETMES;显示提示
MOVAH,09
INT21H
loop1:
movdx,p8255
moval,80h
outdx,al;设置8255A口、B口为输出方式
movcx,300
loop2:
callDISP_proc;调用显示程序
looploop2
callCHG_proc;调用计数子程序
movah,1
int16h
jzloop1;按任意键退出
movax,4c00h
int21h;退出
DISP_procprocnear;显示子程序
pusha
pushds;保存寄存器值
MOVAX,DATA
MOVDS,AX
MOVDI,OFFSETBIT1;获取显示段起始地址
MOVCL,01;设置显示位码
DIS1:
MOVAL,[DI];获取显示数字
MOVBX,OFFSETLED;获取段码表起始地址
XLAT;获取待显示数字的段码
MOVDX,PORTSEG
OUTDX,AL;输出显示数据,段码
MOVAL,CL
MOVDX,PORTBIT
OUTDX,AL;输出显示数据,位码,打开显示
PUSHCX
MOVCX,65500;显示时间延迟
DELAY:
LOOPDELAY
POPCX
CMPCL,20H;段码显示完否,6位
JZexit
INCDI
SHLCL,1
MOVAL,00
OUTDX,AL;关闭显示
JMPDIS1;显示下一段码
exit:
MOVDX,PORTBIT
MOVAL,00
OUTDX,AL;关闭显示
popds
popa;恢复寄存器值
ret
DISP_procendp
CHG_procprocnear
pushcx
INCBIT1;1段数字自增
CMPBIT1,10;进位否
JLQUIT;不进位则退出
MOVBIT1,0;进位,1段数字清零
INCBIT2;进位,2段数字自增
CMPBIT2,10
JLQUIT
MOVBIT2,0;进位,2段数字清零
INCBIT3;进位,3段数字自增
CMPBIT3,10
JLQUIT
MOVBIT3,0;进位,3段数字清零
INCBIT4;进位,4段数字自增
CMPBIT4,10
JLQUIT
MOVBIT4,0;进位,4段数字清零
INCBIT5;进位,5段数字自增
CMPBIT5,10
JLQUIT
MOVBIT5,0;进位,5段数字清零
INCBIT6;进位,6段数字自增
CMPBIT6,10
JLQUIT
MOVBIT6,0;进位,6段数字清零
QUIT:
popcx;恢复寄存器值
ret
CHG_procendp
codeends
endstart
实验五8255控制数码管显示实验(四)
一、实验目的
1、了解七段数码管(LED)显示数字的原理。
2、掌握只用一个8255控制同时显示多位数字的技术。
3、学习用8253(4)中断定时的方法。
二、实验容
动态显示3:
实验板接线不变,利用主实验台上8253定时中断制作电子钟,在数码管上显示分、秒。
增加8253接线如图6:
将主实验台上8253(4)CLK0接1MHZ,GATE0和GATE1接+5V,OUT0接CLK1,OUT1接IRQ,8253CS接280H~287H。
图68253接线图
三、动态显示3参考流程:
四、动态显示3参考程序LED3.ASM
;386以上微机适用
;纯dos下才能使用
;tasm4.1或以上编译
;***********************************;
;*LED段位控制计时显示实验(中断)*;
;***********************************;
ioportequ0cc00h-280H
TIM_CTLEQUioport+283H;8253端口地址,控制端口
TIMER0EQUioport+280H
TIMER1EQUioport+281H
MODE03EQU36H;8253端口数据
MODE12EQU74H
io8255kEQUioport+28bH;8255端口地址,控制端口
PORTSEGEQUioport+288H;8255B口,段码地址
PORTBITEQUioport+289H;8255A口,位码地址
int_vectEQU73H;中断0-7的向量为:
08h-0fh,中断8-15的向为:
70h-77h
irq_mask_2_7EQU011111011b;中断掩码,中断0-7时从低至高相应位为零,中断8-15时
;第2位为零
irq_mask_9_15equ011110111b;中断0-7时全一,中断8-15时从低至高相应位为零
ioport_centequ0d000h;tpc卡中9054芯片的io地址
datasegment
csregdw?
ipregdw?
;旧中断向量保存空间
MESSDB'8253ATIMER0INMOD