;实验三:
;*******************************;
;* 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