微机原理实验代码

0x01前言

微机原理实验终于结束了最后一次课,几次实验下来感觉自己真的什么都不会

每次都是抱着巨佬的大腿过了实验!现在想起来实在惭愧

课余时间趁热打铁赶紧来复习一个这几次实验的代码

0x02 8255

1. 8255的输入输出实验

CODE SEGMENT
ASSUME CS:CODE
START:
MOV DX,28BH ;初始化8255
MOV AL,10001001B
OUT DX,AL

TEST0:
MOV DX,28AH ;C口读入开关状态
IN AL,DX
MOV DX,289H ;B口输出
OUT DX,AL
JMP TEST0 ;继续循环

CODE ENDS
END START

2. 利用8255设计跑马灯

CODECODE SEGMENT
ASSUME CS:CODE
START:
;初始化8255
MOV DX,28BH
MOV AL,10001001B ;写控制字
OUT DX,AL
MOV AH,80H ;暂存80位置的灯
TEST1:
MOV DX,28AH ;从C口读入开关状态
IN AL,DX
CMP AL,80H

JNZ TEST1
TEST2:
MOV AL,AH ;WORK
MOV DX,289H ;B口输出
OUT DX,AL
ROR AL,1 ;右移一位
MOV BX,100H
LOOPO: ;延时
MOV CX,65535
LOOP1:
LOOP LOOP1
DEC BX
JNZ LOOPO
MOV AH,AL ;暂存灯的状态
JMP TEST1 ;继续循环
CODE ENDS
END START

0x03 8253

1. 8253定时,利用8253完成小灯的延时

CODE SEGMENT
ASSUME CS:CODE
START:
;第一级通道2,方式2,先写低字节,后写高字节
MOV AL ,00110101B
MOV DX ,28BH
OUT DX,AL
MOV AL,00H;计数初值5000
MOV DX ,28AH
OUT DX,AL
MOV AL,50H
OUT DX,AL
;第二级通道0,方式3,先写低字节,再写高字节
MOV AL,01110111B
MOV DX,28BH
OUT DX,AL
MOV AL,00H;初值800
MOV DX,288H
OUT DX,AL
MOV AL,08H
OUT DX,AL
CODE ENDS
END START

2. 运用8253硬件延时控制跑马灯运行

CODE SEGMENT
ASSUME CS:CODE
START:
MOV DX,2ABH ;初始化8255
MOV AL,10001011B
OUT DX,AL
MOV AL,01H ;暂存第一个灯,保证起始第一个灯亮
MOV BL,AL
T2:
MOV DX,2AAH ;判断是否是开关1
IN AL,DX
TEST AL,01H
JZ T2

T5: ;第一级通道0,方式2,先写低字节,后写高字节
MOV AL ,10110101B
MOV DX ,28BH
OUT DX,AL
MOV AL,00H ;计数初值5000
MOV DX ,28AH
OUT DX,AL
MOV AL,50H
OUT DX,AL
MOV AL,00110111B
MOV DX,28BH
OUT DX,AL
MOV AL,00H
MOV DX,288H
OUT DX,AL
MOV AL,04H
OUT DX,AL

T3:
MOV AL,BL
MOV DX,2A8H
OUT DX,AL ;输出到A口
ROL AL,1 ;左移一位
MOV BL,AL ;暂存当前灯的位置
T4:
MOV DX,2A9H
IN AL,DX
TEST AL,01H
JNZ T4
JMP T2


CODE ENDS
END

0x04 A/D转换

1. 0809

CODE SEGMENT
ASSUME CS:CODE

START:
MOV DX,283H ;初始化8255
MOV AL,10010000B
OUT DX,AL

TEST1:
MOV DX,29CH ;虚写,启动一次转换
OUT DX,AL

TEST2:
MOV DX,280H
IN AL,DX ;A口读入EOC状态
CMP AL,01H ;检查AL的D0是否等于1,若是则转换已经结束
JNZ TEST2 ;如果不是,继续检查

MOV DX,29CH
IN AL,DX ;读入转换后的数据
MOV DX,282H
OUT DX,AL ;C口输出
JMP TEST1

CODE ENDS
END START

2. 0832

CODE SEGMENT
ASSUME CS:CODE

START:
MOV AL,1AH ;下限电压

UP:
MOV DX,290H
OUT DX,AL
MOV DX,291H
OUT DX,AL
MOV BX,20H ;两层嵌套循环,软延时
INC AL ;自增

LOOP2:
MOV CX,65535
LOOP1:
LOOP LOOP1
DEC BX
JNZ LOOP1

CMP AL, 100 ;比较是否达到上限值
JNZ UP ;没到继续上升


DEC AL
DOWN:
MOV DX,290H
OUT DX,AL
MOV DX,291H
OUT DX,AL
MOV BX,20H ;软延时
DEC AL ;自减
LOOP3:
MOV CX, 65535
LOOP4: LOOP LOOP4
DEC BX

JNZ LOOP3
CMP AL, 19H ;比较是否下降到下限值
JNZ DOWN ; 没到继续下降

JMP START
CODE ENDS
END START

0x05 键盘实验

1. 简单的44键盘(书上代码)

PORT_A EQU 280H
PORT_B EQU 281H
PORT_C EQU 282H
PORT_CTL EQU 283H

DATA SEGMENT
TABLE DB 77H,7BH,7DH,7EH,0B7H,0BBH,0BDH,0BEH,0D7H,0DBH,0DDH,0DEH,0E7H,0EBH,0EDH,0EEH
DATA ENDS

STACK SEGMENT STACK
DW 50 DUP(0)
TOP_STACK LABEL WORD
STACK ENDS
CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,STACK
MOV SS,AX
LEA SP,TOP_STACK
MOV AX,DATA
MOV DS,AX

MOV DX,PORT_CTL
MOV AL,10000010B
OUT DX,AL

RR:
MOV DX,PORT_A
MOV AL,00H
OUT DX,AL

MOV DX,PORT_B

WAIT_OPEN:IN AL,DX
AND AL,0FH
CMP AL,0FH
JNZ WAIT_OPEN

WAIT_PRES:IN AL,DX
AND AL,0FH
CMP AL,0FH
JE WAIT_PRES

MOV CX,16EAH
DELAY:LOOP DELAY

IN AL,DX
AND AL,0FH
CMP AL,0FH
JE WAIT_PRES

MOV AL,0FEH
MOV CL,AL

NEXT_ROW:
MOV DX,PORT_A
OUT DX,AL
MOV DX,PORT_B
IN AL,DX
AND AL,0FH
CMP AL,0FH
JNE ENCODE
ROL CL,01
MOV AL,CL
JMP NEXT_ROW

ENCODE:MOV BX,000FH
IN AL,DX
NEXT_TRY:CMP AL,TABLE[BX]
JE DONE
DEC BX
JNS NEXT_TRY
MOV AH,01
JMP EXIT
DONE:
MOV AL,BL
MOV DX,PORT_C
OUT DX,AL
JMP RR
EXIT:HLT
CODE ENDS
END

2. 实现数码管显示键盘按键

PORT_A EQU 280H;A口地址
PORT_B EQU 281H;B口地址
PORT_C EQU 282H ;C口地址
PORT_CTL EQU 283H;控制字寄存器地址
DATA SEGMENT
;键盘扫描码表
TABLE DB 77H,7bH,7DH,7EH,0B7H,0BBH,0BDH,0BEH
DB 0D7H,0DBH,0DDH,0DEH,0E7H,0EBH,0EDH,0EEH
0~F的七段代码编码
TABLE1 DB 0BFH,86H,0dbH,0CFH,0E6H,0EdH,0FDH,87H
DB 0FFH,0E7H,0F7H,0FCH,0B9H, 0DEH,0F9H,0F1H
DATA ENDS
;堆栈段
STACK SEGMENT STACK
DW 50 DUP(0)
TOP_STACK LABEL WORD
STACK ENDS
;代码段
CODE SEGMENT
ASSUME CS:CODE,DS:DATA;SS:STACK
START: MOV AX,STACK
MOV SS,AX
LEA SP,TOP_STACK
MOV AX,DATA
MOV DS,AX
MOV DX,PORT_CTL
MOV AL,10000010B;8255初始化,A口输出,B口和C口输入,方式0
OUT DX,AL
;向所有行送0
S: MOV DX,PORT_A
MOV AL,0
OUT DX,AL
;读列,查看所有键是否松开
MOV DX,PORT_B
WAIT_OPEN: IN AL,DX
AND AL,0FH
CMP AL,0FH
JNE WAIT_OPEN
;各键均已松开,查列是否有键按下
WAIT_PRES: IN AL,DX
AND AL,0FH
CMP AL,0FH
JE WAIT_PRES
;再查列,看键是否仍被压着
IN AL,DX
AND AL,0FH
CMP AL,0FH
JE WAIT_PRES
;键仍被压着,确定哪一个键被压下
MOV AL,0FEH
MOV CL,AL
NEXT_ROW: MOV DX,PORT_A
OUT DX,AL
MOV DX,PORT_B
IN AL,DX
AND AL,0FH
CMP AL,0FH
JNE ENCODE;列值不全为1,表示有键按下,转去编码
ROL CL,01
MOV AL,CL
JMP NEXT_ROW
;已找到某一列为0,对压键的行列值编码
ENCODE: MOV BX,000FH
IN AL,DX
NEXT_TRY: CMP AL,TABLE[BX];比较读出的行列值和表中是否一致
JE DONE
DEC BX
JNS NEXT_TRY
MOV AH,01
JMP EXIT
DONE: MOV DX,PORT_C;C口输出
MOV AL,TABLE1[BX];查0~F的七段代码编码
OUT DX,AL
JMP S ;循环检测该程序
EXIT: HLT
CODE ENDS
END START

0x06 总结

其实一道一道的做下来,感觉自己好像能看懂并理解一些代码了

还有很多不足的地方,晚上找个时间恶补一下

哦对了 周五就是实验考试了

我冲了!奥里给!!!