8255 PORTC 按键输入测试

1.硬件电路

2.测试程序(nasm汇编)

cpp 复制代码
;-------------------------------------------------------------------------------------------
;长按学习板上的K4,会在串口上打印出   key0 event happen!
;-------------------------------------------------------------------------------------------
;2017.9.15
;用nasm重新写原来的代码
;推出配套的《在做中学微机原理》课程,与所销售的硬件相配套
;从第一行程序开教,一步一步带你走入神秘的8086世界。
;
;例程001
;ex1.asm                     =example_1
;8088启动,点亮系统板上的LED
;重点在于正确使用程序编辑环境,nasm汇编方法,EEprom的烧写方法
;
;ex001----用下载到RAM中的程序,点亮系统板上的LED
;8088.asm是汇编源程序
;8088.bin是编译生成的可下载执行的最终代码
;
;编译很简单,双击make即可自动完成
;
;Notepad++是我计算机上Notepad++的快捷方式
;---------------------------------------------------------------------------------------------
led_port      equ   800h

_8255_port3   equ   203h
_8255_porta   equ   200h
_8255_portb   equ   201h
_8255_portc   equ   202h

;---------------------------------------------------------------------------------------------

  org  2000h      ;程序将由监控bios下载到内存RAM的地址(0000:2000)
start:
      ;------------------------------------------------------
	  ;init part 
	  ;------------------------------------------------------
	  mov ax,0
	  mov ds,ax
	  mov ss,ax
	  mov sp,1fffh
	  ;---------------------------------------------------------
	  ;8255 init
	  ;---------------------------------------------------------
	  call _8255_init
	  
	  ;mov al,[LED_CODE]
	  ;mov dx,_8255_porta
	  ;out dx,al
	  
	  ;mov al,0feh
	  ;mov dx,_8255_portb
	  ;out dx,al
	  
	  
	  
st001:	  
      nop
	  call _8255_disp
	  call _8255_key
	  ;-----------------------------------------------------
	  ;点亮系统板上的LED
	  ;-----------------------------------------------------
	  ;MOV DX,800H   ;800H是板子上8个LED的端口地址号
	  mov dx,led_port
      MOV AL,0aaH   ;一亮一灭间隔点亮
      OUT DX,AL
	  
	  call DELAY
	  
	  ;MOV DX,800H   ;800H是板子上8个LED的端口地址号
	  mov dx,led_port
      MOV AL,00H   ;一亮一灭间隔点亮
      OUT DX,AL
	  
	  call DELAY
	  
	  mov ah,'$'
	  call SEND
	  
	 ; lea di,STR1   ;nasm编译器不认
	  mov di, STR1
	  CALL STR_OUT
	  
	  mov di, STR3
	  CALL STR_OUT
	  
	  ;mov al,01010101b
	  ;mov al,0f0h;
      ;out 25H,al
	  ;hlt
	  jmp st001
	  jmp start
	 
;------------------------------------------------------------	 
;	  DELAY  PROC NEAR   
;------------------------------------------------------------
    ;push
DELAY:
    PUSH CX
    PUSH BX
    NOP
    NOP   
    mov bx,10
 del1:
    mov cx,5882
 del2:
    loop del2
    dec bx
    jnz del1
    ;pop cx
    ;pop bx  

    POP BX
    POP CX
    
    RET
	
	
;-------------------------------------------
;pc16550  uart  send by AH
;-------------------------------------------

LSTAT     EQU 1F5H
DAT_165   EQU 1F0H

SEND:   ;   PROC  NEAR
    MOV DX,LSTAT
WAITx:
    IN AL,DX
    TEST AL,20H
    JZ  WAITx  
    
    MOV AL,AH
    MOV DX,DAT_165
    OUT DX,AL
    RET
;SEND  ENDP   

;-------------------------------------------
;串口打印字符串
;-------------------------------------------

STR_OUT :;   PROC  NEAR
        nop; LEA DI,STR1
STR_LOOP:
         ;MOV AH,BYTE PTR [DI]
		 mov ah,byte [di]
         CMP AH,'$'
         JZ STR_EXIT
         CALL SEND
         INC DI
         JMP STR_LOOP

STR_EXIT: NOP      
          RET
		  
;-----------------------------
;8255 init
;-----------------------------
_8255_init:
       ;mov dx,203h
	   mov dx, _8255_port3
       ;mov al,80h
       mov al,89h;port a,b  as output  port c as input
       out dx,al  
	   ret
	   
_8255_disp:
      ;bit 0
	  mov al,[LED_CODE]
	  mov dx,_8255_porta
	  out dx,al
	  
	  ;mov al,0feh
	  mov al, 011111110b
	  mov dx,_8255_portb
	  out dx,al
	  call DELAY
	   ;bit 1
	  mov al,[LED_CODE+1]
	  mov dx,_8255_porta
	  out dx,al
	  
	  ;mov al,0feh
	  mov al, 011111101b
	  mov dx,_8255_portb
	  out dx,al
	  call DELAY
	  
	   ;bit 2
	  mov al,[LED_CODE+2]
	  mov dx,_8255_porta
	  out dx,al
	  
	  ;mov al,0feh
	  mov al, 011111011b
	  mov dx,_8255_portb
	  out dx,al
	  call DELAY
	  
	    ;bit 3
	  mov al,[LED_CODE+3]
	  mov dx,_8255_porta
	  out dx,al
	  
	  ;mov al,0feh
	  mov al, 011110111b
	  mov dx,_8255_portb
	  out dx,al
	  call DELAY
	  
	  ;bit 4
	  mov al,[LED_CODE+4]
	  mov dx,_8255_porta
	  out dx,al
	  
	  ;mov al,0feh
	  mov al, 011101111b
	  mov dx,_8255_portb
	  out dx,al
	  call DELAY
	  
	  ;bit 5
	  mov al,[LED_CODE+5]
	  mov dx,_8255_porta
	  out dx,al
	  
	  ;mov al,0feh
	  mov al, 011011111b
	  mov dx,_8255_portb
	  out dx,al
	  call DELAY
	  
	  ;bit 6
	  mov al,[LED_CODE+6]
	  mov dx,_8255_porta
	  out dx,al
	  
	  ;mov al,0feh
	  mov al, 010111111b
	  mov dx,_8255_portb
	  out dx,al
	  call DELAY
	  
	  ;bit 7
	  mov al,[LED_CODE+7]
	  mov dx,_8255_porta
	  out dx,al
	  
	  ;mov al,0feh
	  mov al, 001111111b
	  mov dx,_8255_portb
	  out dx,al
	  call DELAY
	  ret
	  
	  ;------------------------------------------
	  ;8255 key
	  ;------------------------------------------
  _8255_key:     
       MOV DX,202H
       IN AL,DX
       TEST AL,01H
       JNZ NO_KEY
       ;INC KEY_CNT
	   mov di, STR4
	   CALL STR_OUT
       NO_KEY:
	       NOP
	   ret
	  
;STR_OUT   ENDP
   
    STR1  DB 'i8088-HELLO boy or girl!' ,13,10,'$'
    STR2  DB  0AH,0DH,'  ',0dh,0ah,'$'   	
	STR3  db 'ex005---8255 key demo',13,10,'$'
	STR4  db  'key0 event happen!',13,10,'$'
	
	LED_CODE  db 0C0h,0F9h,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
   
   db 55h,55h,55h,55h,55h,55h  ;程序结束标志,监控bios程序,收到后自动跳转到内存0000:2000处执行
;----------------------------------------------------------------------------------------------

3.编译下载测试

相关推荐
d111111111d5 小时前
在STM32函数指针是什么,怎么使用还有典型应用场景。
笔记·stm32·单片机·嵌入式硬件·学习·算法
♛识尔如昼♛7 小时前
计算机组成原理(21) 第五章 - 总线性能指标
单片机·嵌入式硬件
快乐的划水a7 小时前
windows用户态到内核态
stm32·单片机·嵌入式硬件
Hy行者勇哥7 小时前
从零搭建小智 AI 音箱 MCP 开发环境:自定义智能家居控制技能实战指南
人工智能·嵌入式硬件·硬件工程·智能家居
richxu202510019 小时前
嵌入式学习之路>单片机核心原理篇>(11) 存储器(Flash & SRam)
单片机·嵌入式硬件·学习
@good_good_study9 小时前
STM32 TIM编码器模式配置函数及实验
stm32·单片机
云山工作室11 小时前
基于单片机的客车载客状况自动检测系统设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计
Rorsion11 小时前
第二章(2.5):微控制器8051的硬件结构---时钟、复位和MCU工作方式
单片机·嵌入式硬件·备考ing
Qingniu0111 小时前
SP40P65NJ:一款高性能40V P沟道MOSFET深度解析
单片机·嵌入式硬件·电机驱动·dc-dc降压/升压转换器·电源管理模块