微机实验记录

date
Jun 24, 2018
slug
weiji-experiment
status
Published
tags
开发测试
summary
实验说简单不简单说难也不难。。最主要是自己理论不扎实,得记录,昨天把安恒6月赛的wp写完头疼,于是就放到今天赶脚写一写,注意的点都在代码的注释里面标着,趁着自己还记得emmm
type
Post

前言

实验说简单不简单说难也不难。。最主要是自己理论不扎实,得记录,昨天把安恒6月赛的wp写完头疼,于是就放到今天赶脚写一写,注意的点都在代码的注释里面标着,趁着自己还记得emmm

跑马灯硬件延时

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

;8255的控制端口
;8255A口接的是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的控制,分别对01口进行输入计数值,对控制口输入控制字

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口输入  AC口输出


  MOV DX, PORT_CTL ;指向控制字
  MOV AL, 82H ;控制字
  OUT DX, AL          ;写入控制字



;检测开始
;向所有行送0
Go:
  MOV DX, PORT_A   ;AMOV 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端口换一换?在尝试自己写。。说来说去都是自己理论知识不扎实,下午赶紧找时间去恶补了

© 4me 2021 - 2024