微机原理课程设计报告 - 图文 下载本文

PUSH SI PUSH DX MOV AL,IndexOfWord INC AL CMP AL,COUNT JNZ GetNextLeft GetFistLeft: MOV DX,OUTSET MOV AL,32 MUL IndexOfWord ADD DX,AX MOV AX,SI SUB AX,DX MOV SI,OUTSET ADD SI,AX MOV BH,[SI] MOV BL,[SI+1] ;TEST PUSH DX MOV DL,' ' MOV AH,2H INT 21H POPDX MOV AX,BX CALL SendWord JMP EndGetLeftWord GetNextLeft: MOV BH,[SI+32];下一个字的对应行 MOV BL,[SI+33] EndGetLeftWord: POP DX POP SI POP AX RET

;----------------------------------------------------------------------MoveStepLeft-------------------------------------------------------------------- MoveStepLeft:

;1:根据IndexOfWord2以及MoveStep2确定SI。 ;2:MoveStep决定一个位的位移

;3:当Stop为0时,每“刷完一次屏',MoveStep要移动++;否则不移动; ;4:当MoveStep==16时,IndexOfWord2++

26

;5:当IndexOfWord2==COUNT时,IndexOfWord2归零@:因为”索引是从0开始的嘛“。 ;当刷完一次屏之后,MoveStep2要变化。 ;(1)当已经按下暂停建的时候,则不前移动; ;(2)当移动超过==16的时候 PUSH AX CLI MOV AL,01H TEST StopFlag,AL JNZ EndStep;如果等于1,则MoveSteip不前移动 INC MoveStep MOV AL,16 CMP MoveStep,AL JNZ EndStep;如果EndMoveStep!=16跳过4; MOV MoveStep,00H INC IndexOfWord MOV AL,COUNT CMP IndexOfWord,AL JNZ EndStep;如果IndexOfStep2!=COUNT,则跳过5 MOV IndexOfWord,00H EndStep: MOV AL,62H ;发中断结束命令 MOV DX,0A0H

OUT DX,AL ;向从片8259发EOI命令 OUT 020H,AL ;向主片8259发EOI命令 STI ;开中断 POP AX IRET RET

;-------------------------------------------------------------------ShowUpWard---------------------------------------------------------

;1:用到变量:IndexOfLine

;@:(1)用来指示当前刷屏从第几行开始。(2)范围是0~count*16-1。(3)当超过的时候,应该使其等于00(4)用来对SI初始化 ;

;2:SI:

;@:SI动态变化(显示十六行数据过程中),当超过的count*16-1这个地方所对应的地址的时候,使其“重新指向开头”。 ;

ShowUpWard: PUSH SI PUSH DX

27

PUSH CX PUSH BX PUSH AX MOV SI,OUTSET MOV AX,2 MUL IndexOfLine ADD SI,AX MOV CX,16 ;来一个信号刷一次屏

AnotherLine: MOV AH,[SI] MOV AL,[SI+1] ADD SI,2;(1)换行

;(2)如果换行以后>=range=32*count行对应的指针,令其从新指向开头,并继续++进行行扫 PUSH AX;定义一个临时变量 MOV AX,0 MOV AL,32 MUL COUNT MOV BX,OUTSET ADD BX,AX CMP BX,SI JNZ Continue;如果等于range,则reset ;Reset MOV SI,OUTSET Continue: POP AX ;Test CALL Enter

;(1)移位输出了16位数据--以AX传送数据 CALL SendWord

;2)释放锁存,先0后1.采用置位、复位控制字 MOV AL,00001010B MOV DX,303H ;call delay OUT DX,AL MOV AL,00001011B OUT DX,AL

28

;(3)行选--需要测试选中那一行 MOV AL,CL; SHL AL,1 DEC AL;???? MOV DX,302H OUT DX,AL DEC CX;用于实现16行数据的输出 JNZ AnotherLine

POP AX POP BX POP CX POP DX POP SI

;JMP NOTEND RET

;-------------------------------------------------------------------MoveStepUp---------------------------------------------

MoveStepUp: PUSH AX ;test PUSH DX CLI INC Times MOV AH,2 MOV DL,Times ADD DL,30H INT 21H MOV AH,2 MOV DX,IndexOfLine ADD DL,30H INT 21H CMP StopFlag,1 JZ ContinueMoveUp ADD IndexOfLine,1;(1)换行

29

;(2)如果换行以后>=range=32*count行对应的指针,令其从新指向开头,并继续++进行行扫 MOV AX,16 MUL COUNT CMP AX,IndexOfLine JNZ ContinueMoveUp ;Reset MOV IndexOfLine,00H ContinueMoveUp: MOV AL,62H ;发中断结束命令 MOV DX,0A0H

OUT DX,AL ;向从片8259发EOI命令 OUT 020H,AL ;向主片8259发EOI命令 STI ;开中断 POP DX POP AX IRET

;JMP NOTEND RET

;---------------------------------------------------------------------辅助---------------------------------------------- INI8253: ;对8253C1和C2进行初始化 PUSH DX PUSH AX MOV DX,307H ;初始化8253,307H为8253控制端口地址 MOV AL,01110110B ;计数器1,方式3 OUT DX,AL ;将初始控制字输出到控制端口 MOV DX,305H ;计数器1 MOV AX,900 ;先读低8位, OUT DX,AL MOV AL,AH ;再读高8位 OUT DX,AL MOV DX,307H ;再给8253写控制字 MOV AL,10110110B ;计数器2,方式3 OUT DX,AL MOV DX,306H ;计数器2 MOV AX,900 ;先读低8位, OUT DX,AL MOV AL,AH ;再读高8位 OUT DX,AL

30

函数