微机实验记录
程序员文章站
2024-02-02 15:24:40
...
前言
实验说简单不简单说难也不难。。最主要是自己理论不扎实,得记录,昨天把安恒6月赛的wp写完头疼,于是就放到今天赶脚写一写,注意的点都在代码的注释里面标着,趁着自己还记得emmm
跑马灯硬件延时
PORT_CTL EQU 283H
PORT_A EQU 280H
PORT_B EQU 281H
PORT_C EQU 282H
;8255的控制端口
;8255的A口接的是8253的输出
CODE SEGMENT
ASSUME CS:CODE
START:
MOV AL,00110111B; TO:2A0H T1:2A1H T2:2A2H 通道0初始化写入控制字
MOV DX,2A3H
OUT DX,AL
MOV AL,00H
MOV DX,2A0H
OUT DX,AL
MOV AL,50H
MOV DX,2A0H
OUT DX,AL
MOV AL,01110111B
MOV DX,2A3H
OUT DX,AL
MOV AL,00H
MOV DX,2A1H
OUT DX,AL
MOV AL,4H
MOV DX,2A1H
OUT DX,AL
;上面这一部分是对8253的控制,分别对0和1口进行输入计数值,对控制口输入控制字
MOV DX,PORT_CTL
MOV AL,10010000B
OUT DX,AL
MOV BL,01H ;亮灯的信号
TEST_IT:
MOV DX,PORT_A
IN AL,DX
TEST AL,01H
JNZ ON1
;注意这里的逻辑顺序,不为0的时候是走ON2的,不能先写ON1,不然跑马灯的逻辑就会出错,就会变成不论判断与否都是执行ON1
ON2:
MOV AL,BL
MOV DX,PORT_B
OUT DX,AL
MOV DX,PORT_A
IN AL,DX
TEST AL,01H ;读取最后一位的值来判断是否在跳动
JZ ON2 ;注意这种地方的逻辑判断
ROL BL,01
JMP TEST_IT
ON1:
MOV AL,BL
MOV DX,PORT_B
OUT DX,AL
MOV DX,PORT_A
IN AL,DX
TEST AL,01H
JNZ ON1 ;注意这种地方的逻辑判断
ROL BL,01
JMP TEST_IT
CODE ENDS
END START
;END START一定要加不然的话也会报错
通过高低电频的切换效果,对比一下上次的软件实现双从循环来延时
跑马灯软件延时
;端口地址
PORTA EQU 280H
PORTB EQU 281H
PORTC EQU 282H
PORT_CRO EQU 283H
CODE SEGMENT
ASSUME CS:CODE
START: MOV AL,82H
MOV DX ,PORT_CRO
OUT DX, AL
MOV AL,01H
MOV DX,PORTA
;同样是上面是对于8255端口的操作,A口作为输出口
GO:
OUT DX,AL
ROL AL,1 ;下面就开始使用双重循环延时,相当于移位之后,就一直停在那一位等
MOV BX, 16EAH
DELAY1:
MOV CX, 16EAH
DELAY:
LOOP DELAY
DEC BX
JNZ DELAY1
JMP GO
CODE ENDS
END START
对比上面两个跑马灯的实验,不同之处就是延时部分的操作啊
4*4键盘输入
;端口地址
PORT_A EQU 280H ;8255 A口地址
PORT_B EQU 281H ;8255 B口地址
PORT_C EQU 282H ;8255 C口地址
PORT_CTL EQU 283H
;数据段,键盘扫描码表
DATA SEGMENT
; 0 1 2 3 4 5 6 7
KEY_TABLE DB 77H, 7BH , 7DH, 7EH, 0B7H, 0BBH, 0BDH, 0BEH
; 8 9 A B C D E F
DB 0D7H, 0DBH, 0DDH, 0DEH , 0E7H, 0EBH, 0EDH, 0EEH
;七段码
; 0 1 2 3 4 5 6 7
SEVEN_TABLE DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H
; 8 9 A B C D E F
DB 7FH,6FH,77H,7CH,39h, 5EH, 79h, 71h, 0ffh
;代码段
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX, DATA
MOV DS, AX
;初始化8255A, 方式0 B口输入 A,C口输出
MOV DX, PORT_CTL ;指向控制字
MOV AL, 82H ;控制字
OUT DX, AL ;写入控制字
;检测开始
;向所有行送0
Go:
MOV DX, PORT_A ;A口
MOV AL, 00H
OUT DX, AL ;向A口输出0
;读列,查看是否所有键均松开
MOV DX, PORT_B
WAIT_OPEN:
IN AL, DX
AND AL, 0FH
CMP AL,0FH
JNE WAIT_OPEN
;是否有键压下
WAITP:
IN AL,DX
AND AL, 0FH
CMP AL,0FH
JZ WAITP
;有键压下,延时20ms,消除抖动
MOV CX, 16EAH
DELAY:
LOOP DELAY
;查列,看键是否仍然被压着
IN AL, DX
AND AL, 0FH
CMP AL, 0FH
JE WAITP
MOV AL, 0FEH
MOV CL, AL
NEXTR:
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 NEXTR
ENCODE:
MOV BX, 000FH
IN AL, DX
NEXT_TRY:
CMP AL, KEY_TABLE[BX]
JE DONE
DEC BX
JNS NEXT_TRY
MOV AH, 01
JMP EXIT
DONE:
MOV AL, BL
LEA BX, SEVEN_TABLE;
XLAT
MOV DX, PORT_C
OUT DX, AL
JMP Go
EXIT:
HLT
CODE ENDS
END START
这个4*4说来就很水,很大一部分抄的书,只是最后那里换了查七段表而已
小结
1.各种控制字段记得还不够熟悉,有时还是需要翻书。。
2.各种器件的名字及功能原理记得也不牢固,昨天翻书发现原理的部分,还是很有欠缺的
3.硬件方面不行,软件方面也不行,汇编语言还是不够熟练,特别是对于逻辑判断和跳转顺序的编写,下次要不把74ls138
端口换一换?在尝试自己写。。说来说去都是自己理论知识不扎实,下午赶紧找时间去恶补了