【微机原理与接口技术】实验5 可编程并行接口(8255)

8255并行I/O输入/输出实验

P8255A    EQU  288H
;P8255B    EQU  0602H
P8255C    EQU  28AH
P8255MODE EQU  28BH
CODE SEGMENT
	ASSUME CS:CODE
START:	
		MOV DX, P8255MODE ;控制字端口
		MOV AL,10001001B ;
		OUT DX, AL
 
NEXT:	
;------从C口读入开关状态,将从C端口读入的开关数据送端口A输出--------------
		MOV DX, P8255C ;B端口
		IN AL, DX
		MOV DX, P8255A;A端口
		OUT DX, AL
;-------------------------------------------------------------------
		MOV AH,0BH;检测是否有按键按下
		INT 21H
		CMP AL,0H
		JE NEXT
		
		MOV AH,4CH
		INT 21H
CODE ENDS
	END START

并行口键盘扫描实验

a8255        equ 288H    ;8255 A口    
c8255        equ 28aH    ;8255 C口
k8255        equ 28bH    ;8255控制口
data segment
table1    dw 0770h,0B70h,0D70h,0E70h,07B0h,0BB0h,0DB0h,0EB0h
           dw 07D0h,0BD0h,0DD0h,0ED0h,07E0h,0BE0h,0DE0h,0EE0h    ;键盘行列码表
LED       DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH
           DB 39h,5EH,79h,71h,0ffh   ;LED段码表,0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
char  db '0123456789ABCDEF'                    ;字符表
mes   db 0ah,0dh,'PLAY ANY KEY IN THE SMALL KEYBOARD! ',0ah,0dh
       db 'IT WILL BE ON THE SCREEN! END WITH E ',0ah,0dh,'$'
key_in db 0h
data ends
stacks segment stack    ;堆栈空间
     db 100 dup (?)
stacks ends
code segment
        assume cs:code,ds:data,ss:stacks,es:data
start:
        cli
        mov ax,data
        mov ds,ax
        mov es,ax
        mov ax,stacks
        mov ss,ax
        mov dx,offset mes       ;显示提示信息
        mov ah,09
        int 21h  
        main_key:                   ;设置8255 (工作方式0;A口输出;C口高四位输出,低四位输入)
        MOV DX,k8255    ;初始化控制字
        mov al,81h;
        out dx,al        
main_key:
        call key                ;get a char in (key_in) and display it
        call disply               	;调显示子程序,显示得到的字符
        cmp byte ptr key_in,'E'
        jnz main_key
        mov ax,4c00h            ;if (dl)='E' return to EXIT!
        int 21h                 ;退出
key proc near
key_loop:
        mov ah,1
        int 16h
        jnz exit                    ;pc键盘有键按下则退出
       
        mov dx,c8255
        mov al,0fh
        out dx,al
        in al,dx    ;读行扫描
        and al,0fh
        cmp al,0fh
        jz key_loop  ;未发现有键按下则转至key_loop                              
        call delay                 ;delay for a moment
        mov ah,al  ;设置8255 (工作方式0;A口输出;C口高四位输入,低四位输出)
        MOV DX,k8255
        mov al,88h
        out dx,al
        mov dx,c8255
        mov al,ah
        or al,0f0h
        out dx,al
        in al,dx                 ;读列扫描值
        and al,0f0h
        cmp al,0f0h                           
        jz key_loop    ;未发现有键按下则转至key_loop
        mov si,offset table1        ;键盘扫描码表首址
        mov di,offset char          ;字符表首址
        mov cx,16                   ;待查表的表大小
key_tonext:
        cmp ax,[si]                 ;cmp (col,row) with every word
        jz key_findkey              ;in the table
        dec cx
        jz key_loop                 ;未找到对应扫描码
        add si,2
        inc di
        jmp key_tonext
key_findkey:
        mov dl,[di]
        mov ah,02
        int 21h            ;显示查找到的键盘码
        mov byte ptr key_in,dl
key_waitup:
        MOV DX,k8255
        mov al,81h
        out dx,al
        mov dx,c8255
        mov al,0fh
        out dx,al
        in al,dx           ;读行扫描值
        and al,0fh
        cmp al,0fh
        jnz key_waitup     ;按键未抬起转
        call delay         ;delay for amoment
        ret
exit:        mov byte ptr key_in,'E'
        ret
key endp
delay proc near
        push ax            ;delay 50ms--100ms
        mov ah,0
        int 1ah
        mov bx,dx
delay1:
        mov ah,0
        int 1ah
        cmp bx,dx
        jz delay1
        mov bx,dx
delay2:
        mov ah,0
        int 1ah
        cmp bx,dx
        jz delay2
        pop ax
        ret
delay endp
DISPLY    PROC NEAR
      PUSH ax
    	  MOV BX,OFFSET LED
    	  MOV AL,byte ptr key_in
      SUB al,30h
      CMP al,09h
      JNG  DIS2
      SUB al,07h
DIS2:  XLAT
    	 MOV DX,a8255
    	   OUT DX,AL                     ;输出显示数据,段码
       POP AX
    	   RET
DISPLY    ENDP
code ends
end start
  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值