Page 95 - 22-0722 EBOOK
P. 95
cli ;prevent INTs
mov al,1 ;demo by sending 1-11
call dly64 ;slow it down here too
call dly64
mov cx,11
pop ax
loopy:
sti ;enable INTs
call Byt2bit ;split 1 byte to 10 bits
iret ;exit INT subroutine
mov ah,al ;save al in ah
mov al,08h ;set al's bit 3 hi
pulse2 endp
out ppi_port1_b,al ;P1B3=hi =>DAT=hi
;**********************************************
out ppi_port1_c,al ;P1C3=hi =>CLK=hi
jmp $+2 ;I/O delay
;display code in al on 8255(2) Port2B LEDs
call Req2Snd ;8088 asks to send data
mov al,ah ;retrieve al
showcode proc
push ax
call SndHdat ;send data in al (1-11)
call showcode ;display data in al
out ppi_port2_b,al ;show code
inc al ;next data to send
call dly250 ;approx. 3x250-ms delay
call dly250
loop loopy ;repeat for 11 cycles
sti ;allow INTs
call dly250
mov al,0
loopv: ;to exit program
out ppi_port2_b,al ;to turn off LEDs
call dly250
mov al,0F0h ;enter this endless loop
call showcode ;& light upper-4 LEDs
pop ax
ret
jmp loopv
showcode endp
;**********************************************
main endp
; *********************************************
kbd_isr proc ;interrupt service routine (ISR)
;request to send data to PIC16F627A
Req2Snd proc
;activated by INT 5Fh on 8259's pin 25
cli ;disable INTs
;start with CLK=DAT=hi (Idle State)
;end with CLK=hi & DAT=lo (Startbit)
;save registers
push ax
cli ;prevent INTs
push ax
push bx
push di
call wta7hi ;wait until CLK=hi
call wta4hi ;wait until DAT=hi
push si
;read 11 bits from 8255(1) Port1A
;bring CLK->lo for >= 50 us
call clc3lo ;make P1C3=lo
in al,ppi_port1_a
jmp $+2 ;I/O delay
call dly63us ;delay for about 100 us
mov si,HEAD ;addr: last data stored
call dly20us
mov bl,byte ptr[si]
call dly20us
mov bh,0
ภาพที่ ๘ ซอฟต์แวร์การรับ-ส่งข้อมูลแบบอนุกรมของแผงวงจรไมโครคอนโทรลเลอร์ 8088 (ต่อ)
;Page 5/8 of Fig.8
;Page 6/8 of Fig.8
;send Startbit by bringing DAT=lo & CLK=hi
call wta7lo ;wait until CLK=lo
call clb3lo ;DAT (P1B3)=lo
inc si ;next bit to send
loop loop10
jmp $+2 ;delay about 10 us
jmp $+2
jmp $+2
;wait for ACK bit from PIC16F627A
call stc3hi ;DAT=lo, CLK (P1C3)->hi
call wta4lo ;wait for DAT line->lo
jmp $+2 ;I/O delay out ppi_port2_b,al
call wta4hi ; // // DAT // ->hi
pop ax
sti ;enable INTs pop si
ret pop di
Req2Snd endp pop cx
;********************************************** pop bx
pop ax
sti ;allow INTs
;extract 8 bits from al & calculate Parity bit วารสารราชบััณฑิิตยสภา
ret
Byt2bit proc ปีีที่่� ๔๖ ฉบัับัที่่� ๓ กัันยายน-ธัันวาคม ๒๕๖๔
cli ;prevent INTs SndHdat endp
push ax ;ah = right-shifted al
ศาสตราจารย์์กิิตติคุุณ ดร.มงคุล เดชนคุรินทร์ ;********************************************** 85
push bx ;bh=Parity bit, bl=01h
push cx ;wait for P1A4 (DAT) line to go hi
push di wta4hi proc
mov ah,al ;save original al in ah push ax
mov bl,01h ;ref byte for comparing ;release DAT line by making P1B3 hi
mov bh,01h ;odd parity mov al,08h
mov di,dat0 ;addr of dat0 out ppi_port1_b,al
mov cx,8 jmp $+2 ;I/O delay
loop8: mov al,ah ;get shifted al from ah a4lo: in al,ppi_port1_a
ret
loop loop8
and al,bl ;select only bit0 of al jmp $+2 ;I/O delay
wta4hi endp
xor bh,al ;new Parity bit and al,10h ;check bit 4 of P1A
;save Parity bit and assign Stopbit
;**********************************************
mov byte ptr[di],al ;save al’s bit0 cmp al,00h ;bit a4=lo ?
mov byte ptr[di],bh ;odd parity
shr ah,1 ;next higher bit to test je a4lo
;wait for P1A4 (DAT) line to go lo
inc di
inc di ;addr: next extractd bit pop ax
wta4lo proc
mov byte ptr[di],1 ;Stopbit = 1
loop loop8 ret
push ax
wta4hi endp
pop di ;release DAT line by making P1B3 hi
;save Parity bit and assign Stopbit ;**********************************************
pop cx mov al,08h
mov byte ptr[di],bh ;odd parity
pop bx out ppi_port1_b,al
inc di ;wait for P1A4 (DAT) line to go lo
pop ax jmp $+2 ;I/O delay
mov byte ptr[di],1 ;Stopbit = 1 wta4lo proc
sti ;allow INTs a4hi: in al,ppi_port1_a
push ax
ret jmp $+2 ;I/O delay
pop di ;release DAT line by making P1B3 hi
Byt2bit endp and al,10h ;check bit 4 of P1A
pop cx mov al,08h
;********************************************** cmp al,10h ;bit a4=hi ?
pop bx
out ppi_port1_b,al
je a4hi
pop ax jmp $+2 ;I/O delay
;serially send data in al to PIC16F627A pop ax
sti ;allow INTs a4hi: in al,ppi_port1_a
SndHdat proc ret
ret jmp $+2 ;I/O delay
;use this proc after Req2Snd wta4lo endp
Byt2bit endp and al,10h ;check bit 4 of P1A
cli ;prevent INTs ;**********************************************
;**********************************************
cmp al,10h ;bit a4=hi ?
push ax
je a4hi
push bx ;wait for P1A7 (CLK) line to go hi
;serially send data in al to PIC16F627A pop ax
push cx wta7hi proc
SndHdat proc ret
push di push ax
;use this proc after Req2Snd wta4lo endp
push si ;release CLK line by making P1C3 hi
cli ;prevent INTs ;**********************************************
;send 8 work data bits + Parity bit + Stopbit mov al,08h
push ax
mov si,dat0 ;addr of 1st bit out ppi_port1_c,al
push bx ;wait for P1A7 (CLK) line to go hi
mov cx,10 jmp $+2 ;I/O delay
push cx wta7hi proc
call wta7lo ;wait until CLK=lo a7lo: in al,ppi_port1_a
push di push ax
loop10: jmp $+2 ;I/O delay
push si ;release CLK line by making P1C3 hi
call wta7hi ;wait until CLK=hi and al,80h ;check bit 7 of P1A
mov al,08h
;send 8 work data bits + Parity bit + Stopbit
jmp $+2 ;delay for about 10 us cmp al,00h ;bit a7=lo ?
out ppi_port1_c,al
mov si,dat0 ;addr of 1st bit
jmp $+2 je a7lo
mov cx,10 jmp $+2 ;I/O delay
jmp $+2 pop ax
call wta7lo ;wait until CLK=lo a7lo: in al,ppi_port1_a
mov al,byte ptr[si] ;current bit ret
loop10: jmp $+2 ;I/O delay
shl al,1 ;shift bit0 to bit1 wta7hi endp
and al,80h ;check bit 7 of P1A
call wta7hi ;wait until CLK=hi
shl al,1 ;to bit2 ;**********************************************
cmp al,00h ;bit a7=lo ?
jmp $+2 ;delay for about 10 us
shl al,1 ;to bit3
jmp $+2 je a7lo
out ppi_port1_b,al ;put bit on P1B3
jmp $+2 pop ax
jmp $+2 ;I/O delay
mov al,byte ptr[si] ;current bit ret
shl al,1 ;shift bit0 to bit1 wta7hi endp
shl al,1 ;to bit2 ;**********************************************
ภาพที่ ๘ ซอฟต์แวร์การรับ-ส่งข้อมูลแบบอนุกรมของแผงวงจรไมโครคอนโทรลเลอร์ 8088 (ต่อ)
shl al,1 ;to bit3
out ppi_port1_b,al ;put bit on P1B3
jmp $+2 ;I/O delay
;Page 7/8 of Fig.8 ;Page 8/8 of Fig.8
ภาพที่ ๘ ซอฟต์แวร์การรับ-ส่งข้อมูลแบบอนุกรมของแผงวงจรไมโครคอนโทรลเลอร์ 8088 (ต่อ)
;wait for P1A7 (CLK) line to go lo dly63us proc ;time delay about 63 us
wta7lo proc push cx
push ax mov cx,0010h ;delay value
;release CLK line by making P1C3 hi reptw: loop reptw ;count down CX
;Page 7/8 of Fig.8
;Page 8/8 of Fig.8
mov al,08h pop cx
out ppi_port1_c,al ret
;wait for P1A7 (CLK) line to go lo dly63us proc ;time delay about 63 us
jmp $+2 ;I/O delay dly63us endp
wta7lo proc push cx
a7hi: in al,ppi_port1_a ;**********************************************
push ax mov cx,0010h ;delay value
jmp $+2 ;I/O delay
;release CLK line by making P1C3 hi reptw: loop reptw ;count down CX
and al,80h ;check bit 7 of P1A dly1ms proc ;time delay about 1 ms
mov al,08h
pop cx
cmp al,80h ;bit a7=hi ? push cx
out ppi_port1_c,al ret
je a7hi mov cx,0100h ;delay value
jmp $+2 ;I/O delay dly63us endp
pop ax reptx: loop reptx ;count down CX
a7hi: in al,ppi_port1_a ;**********************************************
ret pop cx
jmp $+2 ;I/O delay
wta7lo endp ret
and al,80h ;check bit 7 of P1A dly1ms proc ;time delay about 1 ms
ภาพท่� ๘ ซอฟตั์แวร์การรับ-ส่งข้้อมูลแบบอนีุ้กรมข้องแผงวงจรไมโครคอนี้โทรลเลอร์ 8088 (ตั่อ)
dly1ms endp
;**********************************************
push cx
cmp al,80h ;bit a7=hi ?
;**********************************************
je a7hi mov cx,0100h ;delay value
;set bit 3 of P1B (release DAT line)
pop ax reptx: loop reptx ;count down CX
stb3hi proc dly64 proc ;time delay about 64 ms
ret pop cx
push ax push cx
wta7lo endp ret
mov al,08h ;make P1B3 line hi mov cx,4000h ;delay value
;**********************************************
dly1ms endp
out ppi_port1_b,al repty: loop repty ;count down CX
;**********************************************
jmp $+2 ;I/O delay pop cx
;set bit 3 of P1B (release DAT line)
pop ax ret
stb3hi proc dly64 proc ;time delay about 64 ms
ret dly64 endp
push ax push cx
stb3hi endp ;**********************************************
mov cx,4000h ;delay value
mov al,08h ;make P1B3 line hi
;**********************************************
out ppi_port1_b,al repty: loop repty ;count down CX
dly250 proc ;time delay about 250 ms
jmp $+2 ;I/O delay pop cx
;clear bit 3 of P1B (put DAT=lo) push cx
pop ax ret
clb3lo proc mov cx,0FFFFh ;delay value
ret dly64 endp
stb3hi endp ;**********************************************
;**********************************************
dly250 proc ;time delay about 250 ms
;clear bit 3 of P1B (put DAT=lo) push cx
clb3lo proc mov cx,0FFFFh ;delay value