1.通过采用行扫描法或行反转法,识别键盘上的闭合键。
行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如果列值中有某位为低电平,则表明行列交点处的键被按下;否则扫描下一行,直到扫完全部的行线为止.
行反转法识别闭合键时,要将行线接一个并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作在输入方式。程序使CPU通过输出端口往各行线上全部送低电平,然后读入列线值,如果此时有某一键被按下,则必定会使某一列线值为0。然后,程序再对两个并行端口进行方式设置,使行线上工作在输入方式,列线工作在输出方式,并且将刚才读得的列线值从列线所接的并行端口输出,再读行线上的输入值,那么,在闭合键所在的行线上的值必定为0。这样,当一个键被按下时,必定可以读得一对唯一的行值和列值,在我们提供的程序中就采用行反转法来识别键盘按键。
2.在程序设计时,将各个键对应的代码(列值,行值)放在一个表中。程序通过查表来确定具体按下的为哪一个键。 四、程序清单 PA55 EQU 218H ;8255A的A口地址 PB55 EQU 219H ;8255A的B口地址 P55CTL EQU 21BH ;8255A的控制口地址 DATA SEGMENT TABIE DW 0101H,0102H,0104H,0108H,0110H,0120H,0140H,0180H
DW 0201H,0202H,0204H,0208H,0210H,0220H,0240H,0280H DW 0401H,0402H,0404H,0408H,0410H,0420H,0440H,0480H
CHAR DB ‘CDEFBA9845673210 RPMG’ ;字符码表 MES DB ‘PLAY ANY KEY IN THE SMALL KEYBOARD!’, 0AH,0DH
DB ‘IT WILL BE ON THE SCREEN! END WITH R’,
0AH,0DH,’$’
DATA ENDS
CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA START: MOV AX,DATA
MOV DS,AX ;DS指向数据段
MOV DX,OFFSET MES MOV AH,09 ;显示提示信息 INT 21 H KY: CALL KEY ;调键盘扫描子程序,健入 字符的ASCII码在DL中 CMP DL,‘R’ ;键入的字符不是结束字符
11
MAIN KEY KST: WAIT1: DLY: TT:
JNZ KY MOV AX,4C00H INT 21 H
RET ENDP PROC NEAR
MOV AL,82H MOV DX,P55CTL OUT DX,AL MOV AL,00
MOV DX,PA55 OUT DX,AL
MOV DX,PB55 IN AL,DX
CMP AL,0FFH JZ WAIT1 PUSH AX
PUSH AX
MOV CX,1000H LOOP DLY MOV DX,P55CTL MOV AL,90H OUT DX,AL
MOV DX,PB55 POP AX OUT DX,AL
MOV DX,PA55 IN AL,DX POP BX MOV AH,BL NOT AX MOV SI,OFFSET TABLE MOV DI,OFFSET CHAR MOV CX,24 CMP AX,[SI] JZ NN
DEC
CX
12
‘R’, 则转 KY继续 ;返回 DOS
;键盘扫描子程序,键人字 符的ASCII码送 DL中 ;设置8255A的控制字,均 工作于方式0,端口A为 输出,B为输入 ;端口 A输出全0 ;从端口B读入列值 ;若为0FFH,则说明无键 按下,转 WAIT1 ;入栈保存列值
;延时去抖动
;设置8255A的控制字,均 工作于方式0,端口A为 输入,B为输出 ;从端口B输出列值 ;从端口A读进行值 ;列值送 AH中 ;行、列值取反 ;扫描码表首址 ;字符码表首址
;小键盘共3×8=24健 ;扫描码相符则转 NN ;计数值减1
JZ KST ADD SI,2 INC DI JMP TT NN: MOV DL,[DI] MOV AH,02 INT 21 H PUSH DX MOV AL,82H MOV DX,P55CTL OUT DX,AL WAIT2: MOV AL,00 MOV DX,PA55 OUT DX,AL MOV DX,PB55 IN AL,DX CMP AL,0FFH JNZ WAIT2 POP DX
RET KEY ENDP CODE ENDS END START 五、 实验报告要求:
1.参考实验程序画出流程图。
2.用行扫描法编写实验程序,并进行调试。 3.写出实验心得体会。
13
;已全部比较完,仍不相符 则转 KST ;修改指针 ;继续比较
;显示该扫描 码对应字符 ;字符 ASCII码入栈保存 ;设置8255A控制字,均工 作于方式0,端口A为输 出,B为输人 ;端口A输出全0 ;从端口 B读进列值 ;有键按下则转WAIT2等 待释放
;退栈
实验三 8255A 并行口实验< 二 >
一、实验目的:
掌握通过8255并行口传输数据的方法,读取开关的数据,控制LED发光二极管的亮灭。
二、实验内容:
编写一个开关量控制程序。
1.输入开关状态全为0时,PA口上发光二极管循环轮流点亮。
2.当开关处于非全0时,则直接把开关状态在发光二极管上显示出来。 三、实验步骤:
1.将8255的PA0~PA7与LED1~LED8,PC4~PC7与LED9~LED12相连。 将8255的PB0~PB7与KEY1~KEY8,PC0~PC3与KEY9~KEY12相连。 2.编写程序,为8255初始化,使三个端口均工作在方式0,设A组为输出状态,B组为输入状态,根据实验内容调试程序,完成实验要求。
四、编程提示:
各LED为共阳极发光二极管,使其点亮应使8255相应端口的相应位清0。 五、实验报告要求:
1.画出实验线路图。
2.编写程序并绘制流程图。
3.通过实验总结8255的三种工作方式。
14
实验四 A/D 实验
一、实验目的:
了解模/数转换的基本原理,掌握ADC0809的使用方法。 二、实验内容:
将一个由电位器供给的电压模拟量转换为数字量,存入PC机内存。 1.硬件线路图如下:
2.编制程序,按中断方式采样A/D转换数据,结果送内存6000H段。采样点取300个。
3.编制程序,按中断方式采样 A/D转换数据,并将结果在PC机上动态显示出来。设置 PC机的显示方式为640×200图形方式。 三、编程提示:
1.ADC0809的START端为A/D转换启动信号,ALE端为通道选择地址的锁存信号,实验电路中将其相连,以便同时锁存通道地址并开始A/D采样转换,其输入控制信号为CS和IOW,故启动A/D转换只须如下两条指令:
MOV DX,PORTADC ;ADC0809的端口地址送DX OUT DX,AL ;发CS及IOW信号 至于AL中具体为什么内容是不重要的,这是一次虚拟写。 2.在中断方式下,当A/D转换结束后就会自动产生EOC信号,此信号接IRQ2从而引起一次硬中断,在中断处理程序中,使用如下指令即可读取A/D转换的结果。
MOV DX,PORTADC IN AL,DX
3.PC机系统中IRQ2硬中断是为用户保留的。编程时首先应将IRQ2对应的中断向量(中断号为0AH)保存起来,然后设置新的中断向量以指向中断处理程序。另外,还要将中断屏蔽寄存器的相应位开放。典型的程序段如下:
15