| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 
 | ;此案例中8255的四个端口地址依次为 280H 281H 282H 283H; 8254的依次为 298H 299H 29AH 29BH
 ;8255接Y0 	8254接Y3
 ;此程序实现目标,通过开关D0来启动或终止跑马灯,每个灯亮延时2s
 ;这里是用8255的A口来输入8254处理过的脉冲信号,B口输出,C口输入开关状态
 CODE SEGMENT
 ASSUME CS:CODE
 
 START:
 MOV DX,283H
 MOV AL,10011001B
 OUT DX,AL	;向8255写入控制字
 
 -- 初始化8254 使其达到一个2s的延时效果---这里使用了一个级联的方式,使用了1号通道和2号通道级联;
 MOV AL,01110101B    ;写入8254 1号通道的控制字
 MOV DX,29BH
 OUT DX,AL
 MOV AL,00H
 MOV DX,299H
 OUT DX,AL
 MOV AL,10H
 OUT DX,AL
 
 MOV AL,10110111B 	;写入8254 2号通道的控制字
 MOV DX,29BH
 OUT DX,AL
 MOV AL,00H
 MOV DX,29AH
 OUT DX,AL
 MOV AL,40H
 OUT DX,AL 	;初始化结束
 
 MOV BL,04H	;设定初值,暂存于BL中
 ;读入开关状态,是否是D0接入
 T1:
 MOV DX,282H
 IN  AL,DX
 TEST AL,01H ;00000001B
 JZ T1
 ;读8254输出电平的状态,若为低电平则继续循环,等待高电平到来
 T2:
 MOV DX,280H
 IN  AL,DX
 TEST AL,01H
 JZ T2
 ;前面都准备就绪,开始让第三个灯亮
 MOV DX,281H
 MOV AL,BL
 OUT DX,AL
 T4:
 ;测试此时是否为高电平,
 MOV DX,280H
 IN  AL,DX
 TEST AL,01H
 JNZ T4
 ;当此刻为高电平,则完成了延时过程,实现了延时2s
 ;循环左移一位
 ROL BL,1
 JMP T1
 
 CODE ENDS
 END START
 
 |