delay proc near ;延迟子程序 push cx push dx delay5us: mov dx,io8253 mov al,10h mov dx,io82530 mov al,05h in al,dxtestout5us: mov dx,io8255a ;8255a口输入 OUT端输入PA7 in al,dx rcl al,1 ;al 循环左移一位,以检测CF是否为1 jnc testout5us pop dx pop cx retdelay endp delay1 proc near ;1ms延时子程序 push cx push dx delay1ms: mov dx,io8253 mov al,30h ;选择先低后高写入 mov dx,io82530 mov ax,3E8h ;一毫秒要计数1000,0000 0011 1110 1000 in ax,dx testout1ms: mov dx,io8255a ;8255a口输入 OUT端输入PA7 in al,dx rcl al,1 ;al 循环左移一位,以检测CF是否为1 jnc testout1ms pop dx pop cx retdelay1 endpdelay10 proc near ;10ms延时子程序 push cx push dx delay10ms: mov dx,io8253 mov al,30h ;选择先低后高写入 mov dx,io82530 mov ax,2710h ;10毫秒要计数10000 in ax,dx testout10ms: mov dx,io8255a ;8255a口输入 OUT端输入PA7 in al,dx rcl al,1 ;al 循环左移一位,以检测CF是否为1 jnc testout10ms pop dx pop cx retdelay10 endptestack proc near push cx mov cx,0ffh mov al,00h mov dx,io8255c out dx,al ;PC0接SCL,将SCL置0 nop mov al,01h mov dx,io8255b out dx,al ;PB0接SDA,将SDA置1 nop mov al,01h mov dx,io8255c out dx,al ;PC0接SCL,将SCL置1 call delayread: mov al,92h ;读入SDA状态,若是零则表明写成功 mov dx,io8255 out dx,al mov dx,io8255b in al,dx mov bl,al mov dx,io8255c mov al,00h out dx,al mov al,bl and al,01h jz change dec cx jcxz error jmp readerror: mov dx,io8255c ;此时用LED8显示未接收到响应信号 mov al,80h out dx,al jmp exit ;结束change: mov dx,io8255 ;设8255为A口输入,B、C输出 mov al,90h out dx,al mov dx,io8255c mov al,40h out dx,al ;此时用LED7表明接收到响应信号 pop cx rettestack endpcode endsend start