扩展键盘实验及微机课设

目的与任务
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	;44列
      
   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	;44列
      
   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	;44列
      
   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

猜你喜欢

转载自blog.csdn.net/qq_44682019/article/details/109136754