Left:
;(1)把中断处理程序“向左左位”的中断程序放入中断向量表中。 ;(2)同时将status置为1,表示的是以向左的方式刷屏 ;(3)置暂停位为00h; ;(4)开始循环。 PUSH AX PUSH DX MOV AH,2 MOV DL,'L' INT 21H
CLI ;关中断 MOV AX,2572H
MOV DX,SEG MoveStepLeft ;设置新的中断向量 PUSH DS MOV DS,DX
MOV DX,OFFSET MoveStepLeft INT 21H POP DS
STI ;开中断
IN AL,0A1H ;打开IRQ10 AND AL,0FBH ;11111011 OUT 0A1H,AL
IN AL,21H ;打开IRQ2 AND AL,0FBH OUT 21H,AL MOV Status,1;(2) MOV StopFlag,00H;(3)置暂停位 POP DX POP AX RET Up:
;(1)把中断处理程序“向上位移”的中断程序放入中断向量表中。 ;(2)同时将status置为2,表示的是以向左的方式刷屏 ;(3)置暂停位为00h; ;(4)开始循环。 PUSH AX PUSH DX MOV AH,2
21
MOV DL,'U' INT 21H
CLI ;关中断 MOV AX,2572H
MOV DX,SEG MoveStepUp ;设置新的中断向量 PUSH DS MOV DS,DX
MOV DX,OFFSET MoveStepUp INT 21H POP DS
STI ;开中断
IN AL,0A1H ;打开IRQ10 AND AL,0FBH ;11111011 OUT 0A1H,AL
IN AL,21H ;打开IRQ2 AND AL,0FBH OUT 21H,AL ;开中断 MOV Status,2;(2) MOV StopFlag,00H;置暂停位 POP DX POP AX RET
Stop: PUSH AX PUSH DX MOV AH,2 MOV DL,'S' INT 21H MOV StopFlag,01H;置暂停位 POP DX POP AX RET
;-----------------------------------------------------------------LED显示的逻辑部分-----------------------
;----------------------------------------------------------------------SendWord--------------------------------------------------------------------
22
SendWord:
;计算并送出一行16位数据。 ;这个数据放在AX中。 PUSH AX PUSH BX PUSH CX PUSH DX MOV CX,16 cicleSendWord: ;测试部分 PUSH AX PUSH DX MOV DX,8000H ;MOV DX,0001H AND DX,AX SHR DX,15 ADD DX,30H MOV AH,2H INT 21H POP DX POP AX
;1:通过8255的c4口把一位数据给G1 PUSH AX MOV DX,303H TEST AX,8000H;如果数据位是0的话,将c0置1;如果数据位是1的话,将c0置0 JZ SetOne ;将c0置0 MOV AL,00000000B OUT DX,AL JMP GoOn SetOne: ;将C0置1 MOV AL,00000001B OUT DX,AL GoOn:
;2:以下代码是为了实现一个\移位脉冲\ MOV AL,00001100B;使得C6变成0(低电平);同时不改变数据输入位 OUT DX,AL MOV AL,00001101B;使得C6变成1(高电平);同时不改变数据输入位 OUT DX,AL POP AX SHL AX,1; ;SHR AX,1 DEC CX
23
JNZ cicleSendWord POP DX POP CX POP BX POP AX RET
;----------------------------------------------------------------------ShowLeftWard-------------------------------------------------------------------- ShowLeftWard: PUSH SI PUSH DX PUSH CX PUSH BX PUSH AX
;1:根据IndexOfWord2
;2:MoveStep决定一个位的位移
;3:当Stop为0时,每“刷完一次屏',MoveStep要移动++;否则不移动; ;4:当MoveStep==16时,IndexOfWord2++
;5:当IndexOfWord2==NumOfCharacter-1时,IndexOfWord2归零@:因为”索引是从0开始的嘛“。 MOV SI,OUTSET MOV AL,32 MUL IndexOfWord ADD SI,AX MOV CX,16 ;来一个信号刷一次屏 Oneline: ;CALL DELAY ;Left代码的关键:
;(1)CX作为一个临时的“偏移变量使用”
;(2)把四个字节(两个字)的数据拼接在一起,并把最终结果放在AX中。 PUSH CX ; MOV AH,[SI] MOV AL,[SI+1] MOV CL,MoveStep SHL AX,CL;
24
;MOV BH,[SI+32];下一个字的对应行 ;MOV BL,[SI+33] CALL GetNextLeftWord;---取下一个字对应行的十六位,放在BX中 MOV CL,16 SUB CL,MoveStep SHR BX,CL OR AX,BX POP CX ADD SI,2;换行 ;test CALL Enter
;(1)移位输出了16位数据 CALL SendWord
;2)释放锁存,先0后1.采用置位、复位控制字 MOV AL,00001010B MOV DX,303H ;call delay OUT DX,AL MOV AL,00001011B OUT DX,AL ;(3)行选--需要测试选中那一行 MOV AL,CL; SHL AL,1 DEC AL;???? MOV DX,302H OUT DX,AL DEC CX JNZ Oneline
POP AX POP BX POP CX POP DX POP SI
;JMP EXIT RET
;-------------------------------------------------------------------GetNextLeftWord------------------------ GetNextLeftWord:
;取下一字的时候,要考虑一种特殊情况,及当SI已经指向最后一个字的时候,下一个16位,应该取自第一个字 PUSH AX
25