扩展键盘实验及微机课设
目的与任务
1、理解可编程并行接口8255的基本工作原理;
2、熟悉8255的初始化编程方法;
3、掌握8255方式0的工作原理及使用。
基本原理
利用开发板KB-C中的18个按钮(SW0,SW1,…SW17)中的前16个作为代码键,即代表:0、1、2、…9、A、b、C、d、E、F,最后2个键,1个为删除键(SW16),一个为回车键(SW17),实现以下功能:每按1个键,则在屏幕上显示相应该键代表的字符,按SW17键结束输入。开发板通过20芯的扁平线与试验箱的J5连接。电路原理图如下:
在KB-C板上,端口A负责发按键扫描信息,端口C的低3位,即PC0、PC1、PC2,负责接收扫描结果,如下图所示,先定时通过端口A(PA0,PA1,PA2,PA3,PA4,PA5)扫描各按钮,即先PA0=0,其它为1发信号,然后PA1=0,其它为1…,端口发出1个信号后,即读端口C,如果PC0,PC1,PC2全为高电平,说明无按钮按下,如果PC0为低电平(PC1,PC2肯定为高电平),且此时,端口扫描的情况是:PA0=1,PA1=0,PA2=1,…则说明SW1被按下。
内容
每按1个键,则在屏幕上显示相应该键代表的字符,按SW17键结束输入。
可编程并行接口8255的地址分配:
A口 300H
B口 301H
C口 302H
控制寄存器端口 303H
端口A为方式0输出,端口C低4位为方式0输入。
在屏幕上显示一个字符的DOS功能调用:
MOV DL,该字符的ASCII码
MOV AH,2
INT 21H
来来来:
;定义按键‘0-9,A-F’0Ah,0Dh,当按下某键时,屏幕上显示这个键;
DATA SEGMENT
STR1 DB '012345'
STR2 DB '6789AB'
STR3 DB 'CDEF',0AH,0DH ;0AH表示换行,0DH表示回车符号,两者用表示回车换行!
S DB 'This is producted by zhengqian and his team!',13,10,'Watch and test the keyboard on experiment platform.Press any key to end...',0dh,0ah,'$' ;程序功能提示
PORTA EQU 408H ;A口地址
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
GO: MOV AX,DATA
MOV DS,AX
MOV AX,OFFSET S ;改变一行文字颜色
MOV AH,09H
MOV BX,0002h ;表示绿色。
MOV CX,44
INT 10H
MOV DX,OFFSET S ;显示提示
MOV AH,9
INT 21h
MOV DX,PORTA+3 ;控制口 A为方式0输出,端口C低4位为方式0输入 控制字为81H
MOV AL,10000010B
OUT DX,AL
P0: MOV CL,6 ;6个
MOV CH,11111110B ;先PA0=0,其它为1发信号
P1: MOV AL,CH
MOV DX,PORTA ;A口输出1111 1110 发按键扫描信息 即0FEH
OUT DX,AL
MOV DX,PORTA+1 ;B口收扫描结果
IN AL,DX
NOT AL ;接收结果取反,便于TEST
MOV BX,OFFSET STR1 ;键名字符0-5
TEST AL,00000001B ;判断位于哪一行 BX存首地址;
JNZ Q ;AL中测试位为0,因为取反,变为1时,跳转显示
MOV BX,OFFSET STR2 ;键名字符6-B
TEST AL,00000010B
JNZ Q
MOV BX,OFFSET STR3 ;键名字符C-F
TEST AL,00000100B
JNZ Q
ROL CH,1 ;循环左移一位,改值 CH=11111101B 继续判断下一列
DEC CL ;每循环一次减一 记录
JNZ P1
MOV AH,0BH ;0bh字符功能调用检测输入状态
INT 21H ;检测有无按键,返回AL=0FFh(有按键)或0(无按键)
CMP AL,0FFH
JNZ P0 ;有按键则退出,没有则继续 ;6个都无 则再次初始化
P2: MOV AH,4CH
INT 21H
Q: MOV AL,6 ;判断在表中的第几位
SUB AL,CL
XLAT ;AL<--BX+AL
;DL=0AH回删一个显示字符 DL=0DH回车;
CMP AL,0DH ;判断是否为0DH;
JZ P2
CMP AL,0AH ;DL=0AH回删一个显示字符
JZ BAC
MOV DL,AL ;显示相应字符
MOV AH,2
INT 21H
PUSH CX ;延时输入
PUSH BX
MOV CX,100
D1: MOV BX,4000
D2: DEC BX
JNZ D2 ;bx不等于0则继续循环
LOOP D1 ;循环cx次
POP BX
POP CX
JMP P0
BAC:
MOV AL,00H
MOV DX,PORTA+1
OUT DX,AL
JMP P0
CODE ENDS
END GO
换个键盘布局类型试试:
Data segment
PortA equ 408H ; 8255的PA口地址
table db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h,41h,42h,43h,44h,45h,46h
S DB 'This is producted by zhengqian and his team!',13,10,'Watch and test the keyboard on experiment platform.',0dh,0ah,'$' ;程序功能提示
Data ends
Code segment
assume cs:code,ds:data
Start:mov ax,data
mov ds,ax
mov dx,offset s ;显示提示
mov ah,9
int 21h
mov dx, PortA+3
mov al,82H ; PA输出 PB输入
out dx,al ;
L0:mov si,0 ;SI是源变址寄存器,用于存放源操作数的偏移地址。并且SI的内容有自动修改的功能,故称为源变址寄存器。
mov al,0feh ;;先PA0=0,其它为1发信号
mov bx,04h ;4行4列
L1:mov dx,PortA ;从a口出 al=1111 1110b
out dx,al
push ax ;AX=09feh,压入堆栈保存al=1111 1110b
mov dx,portA+1 ;从b口读
in al,dx
mov cx,04h
mov di,0 ;DI 是“目的变址寄存器”,bx 作为基址指针
L2:shr al,1 ;把从b口读的al右移一位 逻辑右移指令shr在任何情况下都会把最右边的一位(就是被移出的那位)放到CF里面去。
jc L3 ;即CF=1时,跳转到目标程序处
call disp ;假如b口读的是1111 1110b,右移后cf为0,则调用disp显示0
;假如b口读的是1111 1011b,右移后cf为1,则跳转到L3 最后显示2
L3:inc di ;DI加1
loop L2 ;重新回到L2,再次判断,最多判断4次,因为4*4
;假如b口读的是1111 1111b,右移后cf为1
pop ax ;AX=09feh,弹出数据al=1111 1110b
rol al,1 ;al循环左移一位,al=1111 1101b 此时pa1输出0,其他为1
inc si ;si相应加一
dec bx ;BX减一,因为只有4行,如果不等于0则循环检查,全检查完则退出程序
jnz L1
mov ah,0bh
int 21h ; 检测有无按键,返回AL=0FFh(有按键)或0(无按键)
cmp al,0FFh
jnz L0 ;有按键则退出,没有则继续
mov ah,4ch
int 21h
disp proc near
push bx
push si
push di
push ax
push dx
lea bx,table ;TABLE对应ASCII码值 取偏移地址到bx
add si,si ;刚开始si为0,di也为0
add si,si
add di,si
mov ax,di ;ax得0
xlat ;AL<--(BX+AL)
mov dl,al ;显示单个字符
mov ah,02h
int 21h
push cx ;延时输入
push bx
mov cx,100
d1: mov bx,4000
d2: dec bx
jnz d2 ;bx不等于0则继续循环
loop d1 ;循环cx次
pop bx
pop cx
pop dx
pop ax
pop di
pop si
pop bx
ret
disp endp
Code ends
end Start
程序一实现在屏幕上显示对应按键的功能。
本实验使用的8255A芯片,它有三个8位的端口A、B、C。在方式0下工作的时候,都是基本的输入输出口,且为单向传输。
8255A 的控制字如下图所示
D6、D5 是 A 组方式选择, 00 为方式 0 , 01 为方式 1 , 1 ×为方式 2 ;
D4 表端口A工作方式, 0 为输出, 1 为输入;
D3 表示 PC7-PC4 , 1 为输入, 0 为输出;
D2 表 B 组方式选择, 0 为方式 0 , 1 为方式 1 ;
D1 表端口 B 工作方式, 1 为输入, 0 为输出;
D0 表示 PC3-PC0,1 为输入,为输出。
本实验中用到了 8255A 的端口 A ,端口 C 、端口 C 它们都工作在方式 0 下,因此控制字为 81 H。端口 B 与数码管相连用来显示操作的内容,而端口C低 4 位用来检测是否有按键按下 , 高 4 位用来控制数码管的段,端口 A 用来发送按键信息。
2、在数码管上显示对应按键的系统功能设计
LED为发光二极管构成的显示器件,亦称数码管。由7个字符段和一个小数点段组成,每段对应一个发光二极管,当发光二极管点亮时,相应的字符段点亮。LED有共阴极和共阳极两种供应状态。共阴极显示时,将LED显示的COM接地,将八个字符段端a、b、c、d、e、f、g、dp依次与一个8位I/O口的最低到最高位连接,当I/0给LED的哪个字符段送入一个高电平时,该段就被点亮,从而可从这7个字符段中被点亮的构成相应的字符显示出来。同理,COM阳极即将COM端接Vcc,其显示原理与COM阴极的基本相同,但I/0口送入低电平是相应的段才被点亮。
在数码管上显示对应按键
DATA SEGMENT
STR1 DB '012345'
STR2 DB '6789AB'
STR3 DB 'CDEF',0AH,0DH
LED1 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
LED2 DB 77H,7CH,39H,5EH,79H,71H
LED0 DB 00H,00H,00H,00H,00H,00H ;初始状态的晶体管
S DB 13,10,'Watch and test the keyboard ',0dh,0ah,'$' ;程序功能提示
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET S ;显示提示
MOV AH,9
INT 21h
MOV DX,PORTA+3 ;控制口 A方式0输出,端口C为方式0输入
MOV AL,10000001B
OUT DX,AL
P0: MOV CL,6 ;6个
MOV CH,11111110B ;先PA0=0,其它为1发信号
P1: MOV AL,CH
MOV DX,300H ;A口输出1111 1110 发按键扫描信息 即0FEH
OUT DX,AL
MOV DX,302H ;C口收扫描结果 假如1111 1110
IN AL,DX
NOT AL ;接收结果取反,便于TEST
MOV BX,OFFSET STR1 ;键名字符0-5
TEST AL,00000001B ;判断位于哪一行 BX存首地址;
JNZ Q ;AL中测试位为0,因为取反,变为1时,跳转显示
MOV BX,OFFSET STR2 ;键名字符6-B
TEST AL,00000010B
JNZ Q
MOV BX,OFFSET STR3 ;键名字符C-F
TEST AL,00000100B
JNZ Q
ROL CH,1 ;循环左移一位,改值 CH=11111101B 继续判断下一列
DEC CL ;每循环一次减一 记录
JNZ P1
JMP P0 ;6个都无 则再次初始化
Q: MOV AL,6 ;判断在表中的第几位
SUB AL,CL
XLAT ;AL<--BX+AL
CMP AL,0DH ;判断是否为0DH回车;
JZ P2
CMP AL,0AH ;DL=0AH回删一个显示字符
JZ BAC
MOV DL,AL
p3:
MOV AH,2 ;显示相应字符
INT 21H
DE: PUSH CX ;延时输入
PUSH BX
MOV CX,100
D1: MOV BX,4000
D2: DEC BX
JNZ D2 ;bx不等于0则继续循环
LOOP D1 ;循环cx次
POP BX
POP CX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;晶体管显示;;;;;;;;;;;;;;;;
MOV,CH,AL ;先存到Ch中;
CMP CH,'0' ;小于0则为俩个控制键;
JL P5
MOV BX,OFFSET LED1
SUB AL,30H
CMP CH,':' ;0-9;
JL P4
MOV BX,OFFSET LED2 ;大于9则为A-F;
SUB AL,11H ;A-F多减11h;
P4:XLAT
MOV CH,AL ;查表后对应晶体管显示方法存在Ch中;
CALL R ;先把LED0的显示方式都往右移一格子,方便第二个按键操作;
MOV SI,OFFSET LED0 ;将显示方法写到led0的第一个晶体管中
MOV [SI],CH
JMP P6
P5:CMP AL,0D
JZ P2 ;是回车键则结束
CALL L ;6个晶体管左移一位,最后输入的按键消除,作为删除功能
P6:CALL SHOW ;晶体管显示程序;
MOV DX,302H ;判断pc2--pc0口是否有按键;
IN AL,DX
TEST AL,00000001 ;如果有按键则回到开始检测按键,没有按键则晶体管循环显示;
JZ P0
TEST AL,00000010
JZ P0
TEST AL,00000100
JZ P0
JMP P6
BAC: ;删除
MOV DL,10H ;二号功能dl为10h则回删一个显示字符
JMP P3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SHOW PROC ;6个管同时显示
PUSH AX
PUSH BX
MOV SI,OFFSET LED0 ;6个灯的变量,初始都为0
MOV CX,6 ;计数6,
MOV BX,0 ;置0
MOV AH,0
B: MOV AL,AH ;AL=AH=00H 片选 pc6--pc4
MOV DX,302H ;片选第一块
OUT DX,AL
MOV AL,[SI+BX]
INC BX
MOV DX,301H ;第一个晶体管输出状态 然后BX加1,输出到下一个晶体管
OUT DX,AL
ADD AH,10H ;AH=0001000B,片选第二根晶体管
CALL DELAY1 ;灯光的延时 余光效应;
LOOP B ;循环6次 显示所有晶体管
POP BX
POP AX
RET
SHOW ENDP
L PROC ;数码管的灯向左移动
PUSH SI
PUSH AX
PUSH CX
PUSH BX
MOV SI,OFFSET LED0 ;LED0的5个晶体管
MOV CX,5 ;向左移动次数为5
MOV BX,1
BSS:
MOV AH,[SI+BX] ;此时bx指向第二个管,把第二个占存AH
DEC BX ;此时bx指向第一个管
MOV [SI+BX],AH ;第二个管的状态移到第一个管 左移
ADD BX,2 ;此时bx指向第三个管 循环类推,完成全部晶体管的左移
LOOP BSS
POP BX
POP CX
POP AX
POP SI
RET
L ENDP
R PROC ;数码管的灯向右移动 同理
PUSH SI
PUSH AX
PUSH CX
PUSH BX
MOV SI,OFFSET LED0
MOV CX,5
MOV BX,4
BSS:MOV AH,[SI+BX]
INC BX
MOV [SI+BX],AH
SUB BX,2
LOOP BSS
POP BX
POP CX
POP AX
POP SI
RET
L ENDP
DELAY1 PROC ;灯光延时
PUSH BX
PUSH CX
MOV CX,10000
D3: MOV BX,500
D4: DEC BX
JNZ D4
LOOP D3
POP CX
POP BX
RET
DELAY1 ENDP
P2: MOV AH,4CH ;返回
INT 21H
CODE ENDS
END BEG
上一篇: 总结线上遇到的MySQL死锁问题
下一篇: java中Unsafe类的“特殊”用法
推荐阅读