目的与任务
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 300H ;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,10000001B
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+2 ;C口收扫描结果
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
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
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
JMP P0
P2: MOV AH,4CH
INT 21H
BAC:
MOV AL,00H
MOV DX,PORTA+1
OUT DX,AL
JMP P0
CODE ENDS
END GO
按键后在数码管显示:
DATA SEGMENT
STR1 DB 3FH,06H,5BH,4FH,66H,6DH
STR2 DB 7DH,07H,7FH,6FH,77H,7CH
STR3 DB 58H,5EH,79H,71H,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 300H ;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,10000001B
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+2 ;C口收扫描结果
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
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 ;在B口数码管显示相应字符
P3:
MOV DX,301H
OUT DX,AL
MOV DX,302H
MOV AL,00010000B ;C口选择Y1
OUT DX,AL
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
JMP P0
P2: MOV AH,4CH
INT 21H
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
PortA equ 408H ; 8255的PA口地址
table db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0a7h,0a1h,86h,8eh
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 dx,404H
out dx,al ;输出到数码管
mov dx,405h
mov al,00001000B ;B位置第4个数码管
out dx,al
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
假如要同时显示则:
Data segment
PortA equ 408H ; 8255的PA口地址
table db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0a7h,0a1h,86h,8eh
num 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 dx,404H
out dx,al ;输出到数码管
mov dx,405h
mov al,00001000B ;B位置第4个数码管
out dx,al
pop dx
pop ax
pop di
pop si
pop bx
push bx
push si
push di
push ax
push dx
lea bx,num ;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