📄 shiyan.txt
字号:
实验四 8253 可编程计数器实验
; 8253 计数器实验
CONTROL EQU 0A003H
COUNT0 EQU 0A000H
COUNT1 EQU 0A001H
COUNT2 EQU 0A002H
CODE SEGMENT
ASSUME CS:CODE
START PROC NEAR
MOV AL, 30H ; 通道0,方式0
MOV DX, CONTROL
OUT DX, AL
MOV AL, 5 ; 计数器初始值。
MOV DX, COUNT0
OUT DX, AL ; 低八位
MOV AL, 0
OUT DX, AL ; 高八位
AGAIN:
MOV AL, 00000000B ; 锁存计数器值
MOV DX, CONTROL
OUT DX, AL
MOV DX, COUNT0
IN AL, DX ; 读入计数值低八位
MOV BL, AL
IN AL, DX ; 读入计数值高八位
MOV AH, AL
MOV AL, BL
JMP AGAIN
START ENDP
CODE ENDS
END START
实验五 8253 可编程定时器实验
; 8253 定时器实验
CONTROL EQU 0A003H
COUNT0 EQU 0A000H
COUNT1 EQU 0A001H
COUNT2 EQU 0A002H
CODE SEGMENT
ASSUME CS:CODE
START PROC NEAR
MOV AL, 36H; 00110110B ; 计数器0,16 位,方式3,二进制
MOV DX, CONTROL
OUT DX, AL
MOV AX, 10000
MOV DX, COUNT0
OUT DX, AL ; 计数器低字节
MOV AL, AH
OUT DX, AL ; 计数器高字节
MOV AL, 76H; 01110110B ; 计数器1,16 位,方式3,二进制
MOV DX, CONTROL
OUT DX, AL
MOV AX, 100
MOV DX, COUNT1
OUT DX, AL ; 计数器低字节
MOV AL, AH
OUT DX, AL ; 计数器高字节
JMP $
START ENDP
CODE ENDS
END START
实验六 电子琴(8253 定时器实验)
CONTROL EQU 0A003H
COUNT0 EQU 0A000H
COUNT1 EQU 0A001H
COUNT2 EQU 0A002H
OUTBIT EQU 0E101H
IN_KEY EQU 0E103H
DATA SEGMENT
LAST DB 0
KEYTABLE: ; 键码定义
DB 00H, 01H, 04H, 07H
DB 0FH, 02H, 05H, 08H
DB 0EH, 03H, 06H, 09H
DB 0DH, 0CH, 0BH, 0AH
DB 13H, 12H, 11H, 10H
DB 16H, 15H, 14H, 0FFH
TONETABLE:
DW 2273, 2024, 1805, 1704
DW 1517, 1353, 1205, 1136
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
TESTKEY PROC NEAR
MOV DX, OUTBIT
MOV AL, 0
OUT DX, AL ; 输出线置为0
MOV DX, IN_KEY
IN AL, DX ; 读入键状态
NOT AL
AND AL, 0FH ; 高四位不用
RET
TESTKEY ENDP
GETKEY PROC NEAR
MOV CH, 00100000B
MOV CL, 6
KLOOP:
MOV DX, OUTBIT
MOV AL, CH ; 找出键所在列
NOT AL
OUT DX, AL
SHR CH, 1
MOV DX, IN_KEY
IN AL, DX
NOT AL
AND AL, 0FH
JNE GOON_ ; 该列有键入
DEC CL
JNZ KLOOP
MOV CL, 0FFH ; 没有键按下, 返回 0FFH
JMP EXIT1
GOON_:
DEC CL
SHL CL, 2 ; 键值 = 列 X 4 + 行
MOV CH, 4
LOOPC:
TEST AL, 1
JNZ EXIT1
SHR AL, 1
INC CL
DEC CH
JNZ LOOPC
EXIT1:
MOV DX, OUTBIT
MOV AL, 0
OUT DX, AL
MOV CH, 0
MOV BX, OFFSET KEYTABLE
ADD BX, CX
MOV AL, [BX] ; 取出键码
RET
GETKEY ENDP
OUTTONE PROC NEAR
PUSH AX
MOV AL, 36H ; 计数器0,16 位二进制,方式3。
MOV DX, CONTROL
OUT DX, AL
POP AX
MOV DX, COUNT0
OUT DX, AL
MOV AL, AH
OUT DX, AL
RET
OUTTONE ENDP
DELAY PROC NEAR ;
PUSH CX
MOV CX,40000
LOOP $
POP CX
RET
DELAY ENDP
START PROC NEAR
MOV AX, DATA
MOV DS, AX
MOV DX,0E100H
MOV AL,03H
OUT DX,AL
MLOOP:
CALL TESTKEY ; 有键入?
JZ MLOOP ; 无键入, 继续显示
CALL GETKEY ; 读入键码
CMP AL, 1 ; 是否在1~8 范围内
JL MLOOP
CMP AL, 8
JG MLOOP
MOV AH, 0
DEC AX
SHL AX,1
MOV SI, AX
MOV BX, OFFSET TONETABLE
MOV AX, [BX+SI] ; 查找音频值
CALL OUTTONE ;
CALL DELAY ; 延时
MOV AX, 2 ; 关闭发音
CALL OUTTONE
JMP MLOOP
START ENDP
CODE ENDS
END START
实验七 六位八段数码管显示
; 八段数码管显示
OUTBIT EQU 0E101H ; 位控制口
CLK164 EQU 0E102H ; 段控制口(接164 时钟位)
DAT164 EQU 0E102H ; 段控制口(接164 数据位)
DATA SEGMENT
LEDBUF DB 6 DUP(?) ; 显示缓冲
NUM DB 1 DUP(?) ; 显示的数据
DELAYT DB 1 DUP(?)
LEDMAP: ; 八段管显示码
DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H
DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H
DATA ENDS
STACK SEGMENT STACK’STACK’
STA DB 64 DUP(?)
TOP EQU LENGTH STA
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA , SS:STACK
;; 延时子程序
DELAY PROC NEAR ; 延时子程序
PUSH AX
PUSH CX
MOV AL, 0
MOV CX,AX
LOOP $
POP CX
POP AX
RET
DELAY ENDP
DISPLAYLED PROC NEAR ; 显示子程序
MOV BX, OFFSET LEDBUF
MOV CL, 6 ; 共6 个八段管
MOV AH, 00100000B ; 从左边开始显示
DLOOP:
MOV DX, OUTBIT
MOV AL, 0
OUT DX, AL ; 关所有八段管
MOV AL, [BX]
; 八段 A,B,C,D,E,F,G SEGMENTS 送164
MOV CH, 8 ;八段码 A,B,C,D,E,F,G,DP 送74LS164
SEND_ST164:
PUSH AX
MOV AH, 0 ; DATA BIT PB0
TEST AL, 80H
JZ SEND_DBIT
MOV AH, 1 ; DATA BIT PB0
SEND_DBIT:
MOV DX, DAT164 ; 输出数据位
MOV AL, AH
AND AL, 0FDH
OUT DX, AL
MOV DX, CLK164 ; 送出时钟脉冲
OR AL, 02H
OUT DX, AL
AND AL, 0FDH
OUT DX, AL
POP AX
SHL AL, 1
DEC CH
JNZ SEND_ST164
MOV DX, OUTBIT
MOV AL, AH
OUT DX, AL ; 显示一位八段管
PUSH AX
MOV AH, 1
CALL DELAY
POP AX
SHR AH, 1
INC BX
DEC CL
JNZ DLOOP
MOV DX, OUTBIT
MOV AL, 0
OUT DX,AL ; 关所有八段管
RET
DISPLAYLED ENDP
START PROC NEAR
MOV AX, DATA
MOV DS, AX
MOV AX,STACK
MOV SS,AX
MOV AX,TOP
MOV SP,AX
MOV DX,0E100H
MOV AL,03H
OUT DX,AL
MOV NUM, 0
MLOOP:
INC NUM
MOV CH,NUM
MOV AH,0
MOV CL,6
MOV BX,OFFSET LEDBUF
FILLBUF:
MOV SI, OFFSET LEDMAP
MOV AL,CH
AND AL,0FH
ADD AX,SI
MOV SI,AX
MOV AL,[SI] ; 数据转换成显示码
MOV [BX], AL ; 显示码存入显示缓冲
INC BX
INC CH
DEC CL
JNZ FILLBUF
MOV DELAYT,20
DISPAGAIN:
CALL DISPLAYLED ; 显示
DEC DELAYT
JNZ DISPAGAIN
JMP MLOOP
START ENDP
CODE ENDS
END START
实验八 键盘扫描及显示的接口实验
OUTBIT EQU 0E101H ; 位控制口
CLK164 EQU 0E102H ; 段控制口(接164 时钟位)
DAT164 EQU 0E102H ; 段控制口(接164 数据位)
IN_KEY EQU 0E103H ; 键盘读入口
DATA SEGMENT
LEDBUF DB 6 DUP(?) ; 显示缓冲
NUM DB 1 DUP(?) ; 显示的数据
DELAYT DB 1 DUP(?)
LEDMAP: ; 八段管显示码
DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H
DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H
KEYTABLE: ; 键码定义
DB 00H, 01H, 04H, 07H
DB 0FH, 02H, 05H, 08H
DB 0EH, 03H, 06H, 09H
DB 0DH, 0CH, 0BH, 0AH
DB 13H, 12H, 11H, 10H
DB 16H, 15H, 14H, 0FFH
DATA ENDS
STACK SEGMENT STACK’STACK’
STA DB 64 DUP(?)
TOP EQU LENGTH STA
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA ,SS:STACK
DELAY PROC NEAR
PUSH AX ; 延时子程序
PUSH CX
MOV AL, 0
MOV CX,AX
LOOP $
POP CX
POP AX
RET
DELAY ENDP
DISPLAYLED PROC NEAR
MOV BX, OFFSET LEDBUF
MOV CL, 6 ; 共6 个八段管
MOV AH, 00100000B ; 从左边开始显示
DLOOP:
MOV DX, OUTBIT
MOV AL, 0
OUT DX,AL ; 关所有八段管
MOV AL, [BX]
MOV CH, 8 ; 送164
DLP:
PUSH AX
MOV AH, 0
TEST AL, 80H
JZ GN1
MOV AH, 1
GN1:
MOV DX, DAT164 ; 输出数据位
MOV AL, AH
AND AL,0FDH
OUT DX, AL
MOV DX, CLK164 ; 送出时钟脉冲
OR AL,02H
OUT DX, AL
AND AL,0FDH
OUT DX, AL
POP AX
SHL AL, 1
DEC CH
JNZ DLP
MOV DX, OUTBIT
MOV AL, AH
OUT DX, AL ; 显示一位八段管
PUSH AX
MOV AH, 1
CALL DELAY
POP AX
SHR AH, 1
INC BX
DEC CL
JNZ DLOOP
MOV DX, OUTBIT
MOV AL, 0
OUT DX,AL ; 关所有八段管
RET
DISPLAYLED ENDP
TESTKEY PROC NEAR
MOV DX, OUTBIT
MOV AL, 0
OUT DX, AL ; 输出线置为0
MOV DX, IN_KEY
IN AL, DX ; 读入键状态
NOT AL
AND AL, 0FH ; 高四位不用
RET
TESTKEY ENDP
GETKEY PROC NEAR
MOV CH, 00100000B
MOV CL, 6
KLOOP:
MOV DX, OUTBIT
MOV AL, CH ; 找出键所在列
NOT AL
OUT DX, AL
SHR CH, 1
MOV DX, IN_KEY
IN AL, DX
NOT AL
AND AL, 0FH
JNE GOON_ ; 该列有键入
DEC CL
JNZ KLOOP
MOV CL, 0FFH ; 没有键按下, 返回 0FFH
JMP EXIT1
GOON_:
DEC CL
SHL CL, 2 ; 键值 = 列 X 4 + 行
MOV CH, 4
LOOPC:
TEST AL, 1
JNZ EXIT1
SHR AL, 1
INC CL
DEC CH
JNZ LOOPC
EXIT1:
MOV DX, OUTBIT
MOV AL, 0
OUT DX, AL
MOV CH, 0
MOV BX, OFFSET KEYTABLE
ADD BX, CX
MOV AL, [BX] ; 取出键码
MOV BL, AL
WAITRELEASE:
MOV DX, OUTBIT
MOV AL, 0
OUT DX, AL ; 等键释放
MOV AH, 10
CALL DELAY
CALL TESTKEY
JNE WAITRELEASE
MOV AL, BL
RET
GETKEY ENDP
START PROC NEAR
MOV AX, DATA
MOV DS, AX
MOV AX,STACK
MOV SS,AX
MOV AX,TOP
MOV SP,AX
MOV DX,0E100H
MOV AL,03H
OUT DX,AL
MOV LEDBUF, 0FFH ; 显示 8.8.8.8.
MOV LEDBUF+1, 0FFH
MOV LEDBUF+2, 0FFH
MOV LEDBUF+3, 0FFH
MOV LEDBUF+4, 0
MOV LEDBUF+5, 0
MLOOP:
CALL DISPLAYLED ; 显示
CALL TESTKEY ; 有键入?
JE MLOOP ; 无键入, 继续显示
CALL GETKEY ; 读入键码
AND AL, 0FH ; 显示键码
MOV AH, 0
MOV BX, OFFSET LEDMAP
ADD BX, AX
MOV AL, [BX]
MOV LEDBUF+5, AL
JMP MLOOP
START ENDP
CODE ENDS
END START
实验九 8259 可编程外部中断实验
; 8259 外部中断实验
OUTBIT EQU 0E101H ; 位控制口
CLK164 EQU 0E102H ; 段控制口(接164 时钟位)
DAT164 EQU 0E102H ; 段控制口(接164 数据位)
ICW1 EQU 00010011B ; 单片8259, 上升沿中断, 要写
ICW4
ICW2 EQU 00100000B ; 中断号为20H
ICW4 EQU 00000001B ; 工作在8086/88 方式
OCW1 EQU 11111110B ; 只响应INT0 中断
CS8259A EQU 0A000H ; 8259 地址
CS8259B EQU 0A001H
DATA SEGMENT
LEDBUF DB 6 DUP(?) ; 显示缓冲
NUM DB 1 DUP(?) ; 显示的数据
DELAYT DB 1 DUP(?)
LEDMAP: ; 八段管显示码
DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H
DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H
CNT DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS: DATA
DELAY PROC NEAR ; 延时子程序
PUSH AX ; 延时子程序
PUSH CX
MOV AL, 0
MOV CX,AX
LOOP $
POP CX
POP AX
RET
DELAY ENDP
DISPLAYLED PROC NEAR ; 显示子程序
MOV BX, OFFSET LEDBUF
MOV CL, 6 ; 共6 个八段管
MOV AH, 00100000B ; 从左边开始显示
DLOOP:
MOV DX, OUTBIT
MOV AL, 0
OUT DX,AL ; 关所有八段管
MOV AL, [BX]
MOV CH, 8 ; 送164
DLP:
PUSH AX
MOV AH, 0
TEST AL, 80H
JZ GN1
MOV AH, 1
GN1:
MOV DX, DAT164 ; 输出数据位
MOV AL, AH
AND AL,0FDH
OUT DX, AL
MOV DX, CLK164 ; 送出时钟脉冲
OR AL,02H
OUT DX, AL
AND AL,0FDH
OUT DX, AL
POP AX
SHL AL, 1
DEC CH
JNZ DLP
MOV DX, OUTBIT
MOV AL, AH
OUT DX, AL ; 显示一位八段管
PUSH AX
MOV AH, 1
CALL DELAY
POP AX
SHR AH, 1
INC BX
DEC CL
JNZ DLOOP
MOV DX, OUTBIT
MOV AL, 0
OUT DX,AL ; 关所有八段管
RET
DISPLAYLED ENDP
IENTER PROC NEAR ; 中断服务程序
PUSH AX
PUSH DX
INC CNT
MOV DX, CS8259A
MOV AL, 20H ; 中断服务程序结束指令
OUT DX, AL
POP DX
POP AX
IRET ; 中断返回
IENTER ENDP
IINIT PROC ;初始化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
RET
IINIT ENDP
START PROC NEAR ;主程序
CLI
MOV AX, DATA
MOV DS, AX
MOV DX,0E100H
MOV AL,03H
OUT DX,AL
MOV LEDBUF, 7FH ; 显示 8259 00
MOV LEDBUF+1, 5BH
MOV LEDBUF+2, 6DH
MOV LEDBUF+3, 6FH
MOV LEDBUF+4, 0
MOV LEDBUF+5, 0
MOV AX, 0
MOV DS, AX
MOV BX, 4*ICW2 ; 中断号
MOV AX, CODE
SHL AX, 4 ; x 16
ADD AX, OFFSET IENTER ; 中断入口地址(段地址为0)
MOV [BX], AX
MOV AX, 0
INC BX
INC BX
MOV [BX], AX ; 代码段地址为0
CALL IINIT
MOV AX, DATA
MOV DS, AX
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -