;8255cs 288H~28BH ;pc7凹 ;pB7~pB0-L7~L0 ;pa7~pa0-k7~k0 ; ;
DATA SEGMENT PA EQU 288H PB EQU 289H PC EQU 28AH CTL55 EQU 28BH LTABLE DB 10 DUP(?)DATA ENDSSTACK1 SEGMENT PARA STACK
DW 20H DUP(0)STACK1 ENDSCSEG SEGMENT
ASSUME CS:CSEG,DS:DATASTART:
MOV AX,DATA MOV DS,AX MOV CX,10 MOV SI,0 MOV DX,CTL55 MOV AL,10011000B OUT DX,ALWAT:
MOV DX,PC ;读C口 IN AL,DX AND AL,80H ;检测PC7 JNZ WATMOV DX,PA ;PC7=0,读A口
IN AL,DX MOV DX,PB ;送B口 OUT DX,AL MOV LTABLE[SI],AL;将读取的开关值存放到内存单元TABLE中 INC SIWAT1:
MOV DX,PC ;读C口 IN AL,DX AND AL,80H ;检测PC7 JZ WAT1 LOOP WAT MOV AH,4CH INT 21HCSEG ENDS END START
2、A 口工作在方式0 输入方式,接8 个开关,B 口工作在方式0 输出方式,接
8 个LED, PC0 接产生1s脉冲的8253, 8253 输入负脉冲时,读一次A 口,同时在B 口显示。
;8255cs 288H~28BH
;8253cs-280H~283H ;CLK0-2MHZ ; CLK1-OUT0; OUT1-PC0; ;pB7~pB0-L7~L0 ;pa7~pa0-k7~k0 ; ;
DATA SEGMENT T0 EQU 280H ;T0--CTL为计数器0--控制寄存器的地址 T1 EQU 281H T2 EQU 282H CTL1 EQU 283H PA EQU 288H PB EQU 289H PC EQU 28AH CTL55 EQU 28BH LTABLE DB 10 DUP(?) DATA ENDSSTACK1 SEGMENT PARA STACK
DW 20H DUP(0)STACK1 ENDSCSEG SEGMENT
ASSUME CS:CSEG,DS:DATASTART:
MOV AX,DATA MOV DS,AX MOV DX,CTL55 MOV AL,10010001B;PC上输出PC下输入 OUT DX,AL CALL Init_8253 WAT: MOV DX,PC ;读C口 IN AL,DX AND AL,01H ;检测PC0 JNZ WATMOV DX,PA ;PC7=0,读A口
IN AL,DX MOV DX,PB ;送B口 OUT DX,ALWAT1:
MOV DX,PC ;读C口 IN AL,DX AND AL,01H ;检测PC0 JZ WAT1JMP WAT
MOV AH,4CH INT 21H;初始化8253Init_8253 PROC PUSH DX PUSH AX ;/*8253产生1s的连续方波 MOV DX,CTL1 MOV AL,00100101B ;选择通道0,写入高字节,方式2,用BCD码 OUT DX,AL MOV DX,T0 MOV AL,20H OUT DX,AL MOV DX,CTL1 MOV AL,01100111B ;选择通道1,写入高字节,方式3,用BCD码 OUT DX,AL MOV DX,T1 MOV AL,10H OUT DX,AL ;8253产生1S的连续方波*/POP AX
POP DX RETInit_8253 ENDPCSEG ENDS END START
3、A 口工作在方式0,输入,接8 个开关,B 口工作在方式0,输出,接八段
显示器;由8253 产生1S 的脉冲,PC7 接该脉冲,来个脉冲将读取A 口,显示在
屏幕上,同时;显示在八段显示器上,PC0,PC1 作为位码信号。
;8253cs-280H~283H;8255cs288H~28BH;8255pa7pa0-k7-k0;pb6~b0-gfedcba;CLK0-2MHZ ; CLK1-OUT0; OUT1-PC7;PC0-S0;PC1-S1; ;
DATA SEGMENT T0 EQU 280H ;T0--CTL为计数器0--控制寄存器的地址 T1 EQU 281H T2 EQU 282H CTL1 EQU 283H PA EQU 288H PB EQU 289H PC EQU 28AH CTL EQU 28BH LTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;存储0~F的段码 DAT DB 21HDATA ENDSCODE SEGMENT
ASSUME CS:CODE,DS:DATA;主程序
START: MOV AX,DATA MOV DS,AXCALL Init_8253
CALL Init_8255AGAIN: CALL READ_PA CALL DISP_DAT JMP AGAINMOV AH,4CH
INT 21H;数码显示字符程序
LED_1 PROC LEA SI,LTABLE ADD SI,BX MOV AL,[SI] AND AL,7FH ;最高位设为0,以不显示小数点 MOV DX,PB OUT DX,AL RETLED_1 ENDPLED_S PROC
PUSH CX PUSH BX;保存MOV DX,PC ;熄位码
MOV AL,0H OUT DX,AL;数码管熄灭MOV BH,0
AND BL,0FH ;显示低四位~8421~0-F CALL LED_1 MOV DX,PC ;选择低四位,即PC0置为1 MOV AL,1H OUT DX,AL MOV DX,PC ;熄位码 MOV AL,0H OUT DX,AL;数码管熄灭POP BX;调回保存的数,备用
PUSH BX;重新保存MOV BH,0
MOV CL,4 SHR BL,CL AND BL,0FH ;显示高四位 CALL LED_1 MOV DX,PC ;选择高四位,即PC1置为1 MOV AL,02H OUT DX,ALMOV DX,PC ;熄位码
MOV AL,0H OUT DX,ALPOP BX
POP CX RETLED_S ENDP;读取A口数据
READ_PA PROC PUSH DX PUSH AXLOOP_CHECK:
MOV BH,0 MOV BL,DAT CALL LED_S MOV DX,PC ;8255 C口读入 IN AL,DX TEST AL,80H ;判断1s脉冲 JNZ LOOP_CHECK MOV DX, PA IN AL,DX MOV DAT,ALPOP AX
POP DX RETREAD_PA ENDP;电脑终端显示字符程序
DISP_DAT PROC PUSH DX PUSH AX PUSH CXMOV AL,DAT
MOV CL,4 SHR AL,CL AND AL,0FHCMP AL,0AH;和10比较
JC S1;BCD码 修正 ;〈10直接S1 ADD AL,7H;>9 要+7,用于进位S1: ADD AL,30H;加上0的ASCII码 MOV DL,AL ;高四位显示在屏幕上 MOV AH,02H INT 21HMOV AL,DAT
AND AL,0FH CMP AL,0AH JC S2 ADD AL,7HS2: ADD AL,30H MOV DL,AL ;低四位显示在屏幕上 MOV AH,02H INT 21H MOV DL,' ' ;显示空格 MOV AH,02H INT 21HPOP CX
POP AX POP DX RETDISP_DAT ENDP;初始化8253
Init_8253 PROC PUSH DX PUSH AX ;/*8253产生1s的连续方波 MOV DX,CTL1 MOV AL,00100101B ;选择通道0,写入高字节,方式2,用BCD码 OUT DX,AL MOV DX,T0 MOV AL,20H OUT DX,AL ; MOV DX,CTL1 MOV AL,01100111B ;选择通道1,写入高字节,方式3,用BCD码 OUT DX,AL MOV DX,T1 MOV AL,10H OUT DX,AL ;8253产生1S的连续方波*/POP AX
POP DX RETInit_8253 ENDP;初始化8255
Init_8255 PROC PUSH DX PUSH AXMOV DX,CTL ;8255方式字控制字控制;10011000
MOV AL,98H OUT DX,ALPOP AX
POP DX RETInit_8255 ENDPCODE ENDS
END START
4、A 口工作在方式0 输入方式,接4 个开关,B 口工作在方式0 输出方式,
接1 个七段显示器,PC7 接单脉冲发生器,输入负脉冲时,读一次A 口,同时
在B 口显示,读16 次结束。
;8253cs-280H~283H;8255cs288H~28BH;8255pa3pa0-k3-k0;pb6~b0-gfedcba;8255PC7-凹,PC0-S1;;
DATA SEGMENT T0 EQU 280H ;T0--CTL为计数器0--控制寄存器的地址 T1 EQU 281H T2 EQU 282H CTL1 EQU 283H PA EQU 288H PB EQU 289H PC EQU 28AH CTL EQU 28BH LTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;存储0~F的段码 DAT DB 21HDATA ENDSCODE SEGMENT
ASSUME CS:CODE,DS:DATA;主程序
START: MOV AX,DATA MOV DS,AX MOV CX,16 CALL Init_8255AGAIN: CALL READ_PA CALL DISP_DAT LOOP AGAINMOV AH,4CH
INT 21H;数码显示字符程序
LED_1 PROC LEA SI,LTABLE ADD SI,BX MOV AL,[SI] AND AL,7FH ;最高位设为0,以不显示小数点 MOV DX,PB OUT DX,AL RETLED_1 ENDPLED_S PROC
PUSH CX PUSH BX;保存 MOV DX,PC ;熄位码 MOV AL,0H OUT DX,AL;数码管熄灭MOV BH,0
AND BL,0FH ;显示低四位~8421~0-F CALL LED_1 MOV DX,PC ;选择低四位,即PC0置为1 MOV AL,1H OUT DX,AL MOV DX,PC ;熄位码 MOV AL,0H OUT DX,AL;数码管熄灭; POP BX;调回保存的数,备用
; PUSH BX;重新保存POP BX POP CX RETLED_S ENDP
;读取A口数据
READ_PA PROC PUSH DX PUSH AX PUSH CXLOOP_CHECK:
MOV BH,0 MOV BL,DAT CALL LED_S MOV DX,PC ;8255 C口读入 IN AL,DX TEST AL,80H ;判断PC7 JNZ LOOP_CHECK MOV DX,PA IN AL,DX MOV DAT,AL LOOP_C: MOV BH,0 MOV BL,DAT CALL LED_S MOV DX,PC ;8255 C口读入 IN AL,DX TEST AL,80H ;判断PC7 JZ LOOP_C POP CX POP AX POP DX RETREAD_PA ENDP;电脑终端显示字符程序
DISP_DAT PROC PUSH DX PUSH AX PUSH CXMOV AL,DAT
MOV CL,4 SHR AL,CL AND AL,0FHCMP AL,0AH;和10比较
JC S1;BCD码 修正 ;〈10直接S1 ADD AL,7H;>9 要+7,用于进位S1: ADD AL,30H;加上0的ASCII码 MOV DL,AL ;高四位显示在屏幕上 MOV AH,02H INT 21HMOV AL,DAT;DFFGGFG
AND AL,0FH CMP AL,0AH JC S2 ADD AL,7HS2: ADD AL,30H MOV DL,AL ;低四位显示在屏幕上 MOV AH,02H INT 21H MOV DL,' ' ;显示空格 MOV AH,02H INT 21HPOP CX
POP AX POP DX RETDISP_DAT ENDP
;初始化8255
Init_8255 PROC PUSH DX PUSH AXMOV DX,CTL ;8255方式字控制字控制;10011000
MOV AL,98H OUT DX,ALPOP AX
POP DX RETInit_8255 ENDPCODE ENDS
END START