计算机接口(部分实验)

;实验三:
;*******************************;
;* 8255方式0的C口输入,A口输出  *;
;*******************************;
io8255a        equ 288h
io8255c        equ 28ah
io8255        equ 28bh

code   segment
      assume cs:code
start:  mov dx, 28bH       ;设8255为C口输入,A口输出;控制端口地址
      mov al,8bh
      out dx,al
inout:  mov dx, io8255c             ;从C口输入一数据
      in al,dx
      mov dx,io8255a             ;从A口输出刚才自C口
      out dx,al               ;所输入的数据
      mov dl,0ffh                ;判断是否有按键
      mov ah,06h
      int 21h
      jz inout                ;若无,则继续自C口输入,A口输出
      mov ax,4c00h              ;否则返回
      int 21h
code   ends
      end start

;实验九:
DATA            SEGMENT
IO8254_0        EQU     280H
IO8254_K        EQU     283H
DATA            ENDS
CODE            SEGMENT
                  ASSUME  CS:CODE,DS:DATA
START:          MOV       AX,DATA
                MOV       DS,AX
                MOV       AL, 14H      ;设置8254通道0为工作方式2,二进制计数
                MOV       DX, IO8254_K 
                OUT       DX,AL
                MOV       DX,IO8254_0  ;送计数初值为0FH
                MOV       AL, 0FH
                OUT       DX,AL
LLL:            IN        AL,DX        ;读计数初值
                CALL      DISP         ;调显示子程序
                PUSH      DX  
                MOV       AH,06H 
                MOV       DL,0FFH
                INT       21H
                POP       DX
                JZ        LLL
                MOV       AX,4C00H     ;退出
                INT       21H
DISP            PROC      NEAR         ;显示子程序
                PUSH      DX
                AND       AL,0fh       ;首先取低四位
                MOV       DL,AL
                CMP       DL, 9         ;判断是否<=9
                JLE       NUM          ;若是则为'0'-'9',ASCII码加30H
                ADD       DL,7         ;否则为'A'-'F',ASCII码加37H
NUM:            ADD       DL,30H
                MOV       AH,02H       ;显示
                INT       21H
                MOV       DL,0dh       ;加回车符
                INT       21H
                MOV       DL,0ah      ;加换行符
                INT       21H
                POP       DX
                RET                    ;子程序返回
DISP            ENDP
CODE            ENDS
                END       START



;************************;
;*8251串行通讯(自发自收)*;
;************************;
data segment
 io8253a    equ 280h
 io8253b    equ 283h
 io8251a    equ 2b8h
 io8251b    equ 2b9h
 mes1 db 'you can press a key on the keybord!',0dh,0ah,24h
 mes2 dd  mes1
data ends
code segment
   assume cs:code,ds:data
start:      mov ax,data
      mov ds,ax
      mov dx,283h     ;设置8253计数器0工作方式
      mov al,16h
      out dx,al
      mov dx,280h     ;给8253计数器0送初值
      mov al,52
      out dx,al
      mov dx,2b9h     ;初始化8251
      xor al,al
      mov cx,03     ;向8251控制端口送3个0
 delay:     call out1
      loop delay
      mov al,40h     ;向8251控制端口送40H,使其复位
      call out1
      mov al,4eh     ;设置为1个停止位,8个数据位,波特率因子为16
      call out1
      mov al,27h     ;向8251送控制字允许其发送和接收
      call out1
      lds dx,mes2     ;显示提示信
      mov ah,09
      int 21h
waiti:   mov dx,2b9h
     in al,dx
     test al,01     ;发送是否准备好
     jz waiti
     mov ah,01         ;是,从键盘上读一字符
     int 21h
     cmp al,27         ;若为ESC,结束
     jz exit
     mov dx,io8251a
     inc al
     out dx,al         ;发送
     mov cx,40h
s51:       loop s51          ;延时
next:      mov dx,io8251b
     in al,dx
     test al,02     ;检查接收是否准备好
     jz next           ;没有,等待
     mov dx,io8251a
     in al,dx          ;准备好,接收
     mov dl,al
     mov ah,02         ;将接收到的字符显示在屏幕上
     int 21h
     jmp waiti
exit:      mov ah,4ch        ;退出
     int 21h
out1 proc near       ;向外发送一字节的子程序
      out  dx,al
      push cx
      mov  cx,40h
gg:       loop gg           ;延时
      pop  cx
      ret
out1 endp
code ends
end start

;*******************************;
;*     DMA传送实验(输入)     *;
;*******************************;

data segment
indata1 db 8 dup(30h),0dh,0ah,24h ;前面8个30h,然后是0dh 0ah 和24h
data ends
extra segment at 0d400h
indata2 db 11 dup(?)           ;开辟11个字节的内存区
extra ends
code segment
assume cs:code,ds:data,es:extra
start:
           mov ax,data
           mov ds,ax
        mov ax,extra
        mov es,ax
        lea si,indata1
        lea di,indata2
        cld
        mov cx,11
        rep movsb
        mov ax,extra
        mov ds,ax
        mov al,00
        out 1ch,al            ;清字节指针
        mov al,49h          ;写方式字
        out 1bh,al
        mov al,0dh            ;置地址页面寄存器
        out 83h,al
        mov al,00
        out 12h,al            ;写入基地址的低十六位
        mov al,40h
        out 12h,al
        mov ax,7              ;写入传送的8个字节数
        out 13h,al            ;先写低字节
        mov al,ah
        out 13h,al            ;后写高字节
        mov al,01             ;清通道屏蔽
        out 1ah,al            ;启动DMA
sss:    lea dx,indata2
lll:    mov ah,09
        int 21h
        mov ah,1
        int 16h
        je sss
exit:   mov ah,4ch
        int 21h
        code ends
        end start

数字电子时钟

http://www.doczj.com/doc/063226991-5.html

http://www.doczj.com/doc/268944014-13.html

红绿灯

# 8086-by-protues
基于8255,8259,8253的8086简易红绿灯系统
仿真实现结果描述
1)A通道的绿色数码管和B通道的红色数码管从5开始显示数字,B通道的红灯和A通道的绿灯同时点亮5秒钟,数码管显示的数字每秒减一。
2)A通道的绿色数码管和B通道的红色数码管显示的数字变为0后,A通道的蓝色数码管和B通道的红色数码管从3开始显示数字,此时A通道的黄灯亮,B通道持续红灯,持续三秒,数码管显示的数字每秒减一。
3)A通道的黄色数码管和B通道的红色数码管显示的数字变为0后,A通道的红色数码管和B通道的绿色数码管从5开始显示数字,此时A通道的红灯亮, B通道变为绿灯,持续5S,每秒数码管显示的数字减一。
5)A通道的红色数码管和B通道的绿色数码管显示的数字变为0后,A通道的红色数码管和B通道的黄色数码管从3开始显示数字,此时A通道的红灯亮,B通道黄灯亮,持续三秒,数码管显示的数字每秒减一。
6)A通道的红色数码管和B通道的黄色数码管显示的数字变为0后,又转去执行1),重复执行。
7)当按下INT6按钮两次时,所有方向的信号灯都变为红色,所有方向的红色数码管从5开始显示数字,每秒减一。当显示的数字变为0后,红绿灯恢复中断前的状态,继续执行。
8)当按下开关时,能自动从紧急状态中退出,恢复到原来的信号灯状态继续运行。


CODE    SEGMENT PUBLIC 'CODE'
        ASSUME CS:CODE,DS:DATA,SS:STACK
ORG 100H
START:
        ; Write your code here
	MOV AX,DATA
	MOV DS,AX
	MOV AX,STACK
	MOV SS,AX
	MOV AX,TOP
	MOV SP,AX
	CLI
	;中断向量
	PUSH DS
	MOV AX,0
	MOV DS,AX
	
	MOV BX,152
	MOV AX,OFFSET INT6
	MOV [BX],AX
	MOV AX,0
	MOV [BX+2],AX
	
	MOV BX,156
	MOV AX,OFFSET INT7
	MOV [BX],AX
	MOV AX,0
	MOV [BX+2],AX
	POP DS
	
	;8259初始化
	MOV DX,CS8259A
	MOV AL,ICW1
	OUT DX,AL
	MOV DX,CS8259B
	MOV AL,ICW2
	OUT DX,AL
	MOV AL,ICW4
	OUT DX,AL
	MOV AL,OCW1
	OUT DX,AL
	STI
	;8255—1
	MOV AL,80H
	MOV DX,CT_PORT
	OUT DX,AL
	;8255-2
	MOV AL,80H
	MOV DX,CT_PORT2
	OUT DX,AL
	;8255-3
	MOV AL,10000010B
	MOV DX,CT_PORT3
	OUT DX,AL
	;8253
	MOV AL,00110110B;CNT0
	MOV DX,CTL
	OUT DX,AL
	MOV AX,1000
	MOV DX,CNT0
	OUT DX,AL
	MOV AL,AH
	OUT DX,AL
	MOV AL,01110110B;CNT1
	MOV DX,CTL
	OUT DX,AL
	MOV AX,1000
	MOV DX,CNT1
	OUT DX,AL
	MOV AL,AH
	OUT DX,AL
	MOV AL,10010100B;CNT2
	MOV DX,CTL
	OUT DX,AL
	MOV AL,2
	MOV DX,CNT2
	OUT DX,AL
	
	MOV SI,1
ENDLESS:
	NOP
	STI

	;MOV CX,6
	JMP ENDLESS
		 

INT6:	 ;中断服务
	 PUSH AX
	 PUSH BX
	 PUSH CX
	 PUSH DX
	 STI
	 MOV DX,CTL
	 MOV AL,01001100B
	 OUT DX,AL
	 ;MOV DX,CT_PORT
	 ;MOV AL,10000000B
	 ;OUT DX,AL
	 MOV DX,A_PORT
	 MOV AL,00001001B
	 OUT DX,AL
	 MOV CX,6
NEXT6:	 
	 MOV DX,B_PORT3
	 IN AL,DX
	 CMP AL,10000000B
	 JBE EX
	 LEA BX,BLOCK
	 ;清零
	 MOV AL,[BX]
	 MOV DX,B_PORT
	 OUT DX,AL
	 MOV DX,C_PORT
	 OUT DX,AL
	 MOV DX,B_PORT2
	 OUT DX,AL
	 MOV DX,A_PORT2
	 OUT DX,AL
	 ;
	 MOV AL,CL
	 SUB AL,1
	 XLAT
	 MOV DX,C_PORT2
	 OUT DX,AL
	 MOV DX,A_PORT3
	 OUT DX,AL
	 CALL DELAY
	 LOOP NEXT6	 
EX:
	 LEA BX,BLOCK
	 MOV AL,[BX]
	 MOV DX,C_PORT2
	 OUT DX,AL
	  MOV DX,A_PORT3
	 OUT DX,AL
	 MOV AL,20H
	 MOV DX,CS8259A
	 OUT DX,AL
	 CLI
	 POP DX
	 POP CX
	 POP BX
	 POP AX
	 ;恢复红绿灯
	MOV AL,00110110B;CNT0
	MOV DX,CTL
	OUT DX,AL
	MOV AX,1000
	MOV DX,CNT0
	OUT DX,AL
	MOV AL,AH
	OUT DX,AL
	MOV AL,01110110B;CNT1
	MOV DX,CTL
	OUT DX,AL
	MOV AX,1000
	MOV DX,CNT1
	OUT DX,AL
	MOV AL,AH
	OUT DX,AL
	 STI
	 IRET

INT7:    CLI;中断服务程序
	 PUSH AX
	 PUSH BX
	 PUSH CX
	 PUSH DX
	 MOV CX,FLAG
	 CMP CX,0
	 JG A1
	 MOV FLAG,20
	 
A1:	 ;A绿 B红
	DEC FLAG
	CMP CX,10
	JB B1
        SUB CX,10
	CMP CX,3
	JBE A2
	MOV AL,00001010B
	MOV DX,A_PORT
	OUT DX,AL
	MOV AL,CL
	SUB AL,4
	LEA BX,BLOCK
	XLAT
	MOV DX,B_PORT
	OUT DX,AL
	MOV DX,C_PORT2
	OUT DX,AL
	JMP EXIT
	
A2:	;A黄 B红
	MOV AL,00001100B
	MOV DX,A_PORT	
	OUT DX,AL	
        MOV AL,CL
	LEA BX,BLOCK
	XLAT
	MOV DX,C_PORT
	OUT DX,AL
	MOV DX,C_PORT2
	OUT DX,AL
	JMP EXIT
	
B1:	;A红 B绿
	CMP CX,3
	JBE B2
	MOV AL,00010001B
	MOV DX,A_PORT	
	OUT DX,AL
	MOV AL,CL
	SUB AL,4
	LEA BX,BLOCK
	XLAT
	MOV DX,A_PORT3
	OUT DX,AL
	MOV DX,A_PORT2
	OUT DX,AL
	JMP EXIT
	
B2:	;A红 B黄
	MOV AL,00100001B
	MOV DX,A_PORT	
	OUT DX,AL	
	MOV AL,CL
	LEA BX,BLOCK
	XLAT
	MOV DX,A_PORT3
	OUT DX,AL
	MOV DX,B_PORT2
	OUT DX,AL
	 
EXIT:	 MOV DX,CS8259A
	 MOV AL,20H
	 OUT DX,AL
	 CLI
	 POP DX
	 POP CX
	 POP BX
	 POP AX
	 STI
	 IRET

	
DELAY PROC
	 PUSH CX
	 MOV CX,0
	 LOOP $
	 LOOP $
	 LOOP $
	 MOV CX,15000
	 LOOP $
	 POP CX
	 RET
DELAY ENDP

CODE    ENDS
DATA SEGMENT
	 ;8255-1
	 A_PORT EQU 0A000H;Y2
	 B_PORT EQU 0A002H
	 C_PORT EQU 0A004H
	 CT_PORT EQU 0A006H
	 ;8255-2
	 A_PORT2 EQU 9000H;Y1
	 B_PORT2 EQU 9002H
	 C_PORT2 EQU 9004H
	 CT_PORT2 EQU 9006H
	 ;8255-3
	 A_PORT3 EQU 0C000H;Y4
	 B_PORT3 EQU 0C002H
	 C_PORT3 EQU 0C004H
	 CT_PORT3 EQU 0C006H
	 ;8259
	 CS8259A EQU 8000H;Y0
	 CS8259B EQU 8002H
	 ICW1 EQU 00010011B ;边沿触发,单片,需要ICW4
	 ICW2 EQU 00100000B ;中断向量地址20H
	 ICW4 EQU 00000001B ;非特殊全嵌套方式,非缓冲方式,非自动EOI,8086
	 OCW1 EQU 00111111B ;允许6,7中断请求
	 ;8253
	 CNT0 EQU 0B000H;Y3
	 CNT1 EQU 0B002H
	 CNT2 EQU 0B004H
	 CTL EQU 0B006H
	 FLAG DW 20
	 TIME DW 5
	 BLOCK DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,67H,77H,7CH,39H,5EH,79H,71H
DATA ENDS
STACK SEGMENT
	 STA DB 512 DUP(0FFH)
	 TOP EQU $-STA
STACK ENDS
        END START

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值