欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

扩展键盘实验及微机课设

程序员文章站 2022-06-19 19:28:48
...

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

相关标签: 微机汇编 asm