;;Przykład 10.9. Program z głównym cyklem ;--- Etap przygotowania cyklu głównego --------------- rcall ppSprawKlaw ;pierwsze sprawdzanie klawiatury i ;zapisywanie stanów wierszy bez użycia "znaczKlaw","znakKlaw" movlw .80 movwf procKlaw,A ;stan procesu "Klawiatura", procKlaw := 80 clrf procWysw,A ;stan procesu "Wyświetlenie", procWysw := 0 clrf procUSART,A ;stan procesu 3, procUSART := 0 clrf znaczWysw,A lfsr FSR0,bufW ; adres bufora lfsr FSR1,bufW ; adres bufora movff rozmBuf,ilosc ; ilosc := rozmiar bufora movff rozmBuf,iloscUART ; ilosc := rozmiar bufora ;--- Cykl główny ------------------------- powtor: ;=== Proces 1, "Klawiatura" decfsz procKlaw, F, A bra etPowt1 ; przypadek "procKlaw=0" ;--- Sprawdzanie klawiatury --------------------- rcall ppSprawKlaw ;ustawienie "znaczKlaw" i "znakKlaw" ;--- Ustawienie semaforów innych procesów movff znaczKlaw, znaczWysw ;znaczWysw:=znaczKlaw ;--- movlw .80 movwf procKlaw,A ;stan procesu "Klawiatura", procKlaw := 80 bra etProces2 etPowt1: ;wyrównanie czasu procesu "Klawiatura" movlw .42 ;koło 126 cykli / 3 rcall ppOpozn bra etProces2 ;=== Proces 2, "Wyświetlenie" etProces2: btfss procWysw, 0, A bra etP20 ; procWysw=B'0' btfss procWysw, 1, A bra etP201 ; procWysw=B'01' btfss procWysw, 2, A bra etP2011 ; procWysw=B'011' btfss procWysw, 3, A bra etP20111 ; procWysw=B'0111' btfss procWysw, 4, A bra etP201111 ; procWysw=B'01111' ;------ clrf procWysw, A ;procWysw=0 bra etProces3 etP20: ; procWysw=B'0' btfsc znaczWysw,0,A bra wysw20 ;--- Bez wyświetlenia --------------- ;Polecenie "Display On/Off Control" jako 2 kolejnych polece-nia: bity D7:D4, bity D3:D0. bcf LATE,0,0 ; RS=0 bcf LATE,1,0 ; R/^W=0 ; bity D7:D4, "Display On/Off Control", "0 0 0 0" movlw H'F0' ; maska andwf LATA,1,0 ;zerowanie RA3:RA0 rcall impuls_CS ;bity D3:D0, "Display On/Off Control", "1 D=0 C=0 B=0" bsf LATA,3,0 rcall impuls_CS ;--- Czekanie, co najmniej 39 mks clrf procWysw, A bsf procWysw, 0, A ;procWysw:=B'1' bra etProces3 etP201: ; procWysw=B'1' ;wyrównanie czasu procesu "Wyświetlenie" movlw .8 ;koło 24 cykli / 3 rcall ppOpozn ;--- clrf procWysw, A ;procWysw:=B'0' bra etProces3 wysw20: ;--- Z wyświetleniem --------------- ;Polecenie "Display On/Off Control" jako 2 kolejnych polecenia: ; bity D7:D4, bity D3:D0. bcf LATE,0,0 ; RS=0 bcf LATE,1,0 ; R/^W=0 ; bity D7:D4, "Display On/Off Control", "0 0 0 0" movlw H'F0' ; maska andwf LATA,1,0 ;zerowanie RA3:RA0 rcall impuls_CS ;bity D3:D0, "Display On/Off Control", "1 D=1 C=0 B=0" bsf LATA,3,0 bsf LATA,2,0 rcall impuls_CS ;--- Czekanie, co najmniej 39 mks clrf procWysw, A bsf procWysw, 0, A ;procWysw:=B'011' bsf procWysw, 1, A ;procWysw:=B'011' bra etProces3 etP2011: ; procWysw=B'011' ;Polecenie "Set DDRAM Address" jako 2 kolejnych polecenia: ; bity D7:D4, bity D3:D0. bcf LATE,0,0 ; RS=0 bcf LATE,1,0 ; R/^W=0 ; bity D7:D4, "Set DDRAM Address", "1 A6=0 A5=0 A4=0" movlw H'F0' ; maska andwf LATA,1,0 ;zerowanie RA3:RA0 bsf LATA,3,0 ;RA3=1 rcall impuls_CS ;bity D3:D0, "Set DDRAM Address", "A3=0 A2=0 A1=0 A0=0" movlw H'F0' ; maska andwf LATA,1,0 ;zerowanie RA3:RA0 rcall impuls_CS ;--- Czekanie, co najmniej 39 mks movff rozmBuf, ilosc ; ilosc := rozmiar bufora bsf procWysw, 2, A ;procWysw:=B'0111' bra etProces3 etP20111: ; procWysw=B'0111' ;Polecenie "Write Data to DDRAM" jako 2 kolejnych polecenia: ; bity D7:D4, bity D3:D0. bsf LATE,0,0 ; RS=1 bcf LATE,1,0 ; R/^W=0 movf POSTINC0, W, ACCESS ; WREG := bufW[j] movwf znakWysw, ACCESS rcall zapisM_znak ;--- Czekanie, co najmniej 39 mks decfsz ilosc, F, ACCESS bra etProces3 lfsr FSR0, bufW ; adres bufora movff rozmBuf,ilosc ; ilosc:=rozmiar bufora bsf procWysw, 3, A ;procWysw:=B'01111' bra etProces3 etP201111: ; procWysw=B'01111' ;wyrównanie czasu procesu "Wyświetlenie" movlw .8 ;koło 24 cykli / 3 rcall ppOpozn ;--- clrf procWysw, A ;procWysw:=0 bra etProces3 ;--- Proces 3. Blok UART --------- etProces3: btfss procUSART, 0, A bra etP30 ; procUSART=B'0' btfss procUSART, 1, A bra etP301 ; procUSART=B'01' clrf procUSART,A ;stan procesu 3,procUSART:=0 bra koniecProc etP30: ; procUSART=B'0' btfsc znaczWysw,0,A bra usart20 ;--- brak znaku ;wyrównanie czasu procesu 3 movlw .2 ;koło 6 cykli / 3 rcall ppOpozn bra koniecProc usart20: ; procUSART=0, jest znak bsf TXSTA1, TXEN, ACCESS movf POSTINC1,W,ACCESS ; WREG:=bufW[j] movwf TXREG1, ACCESS nop ;opóźnienie o jeden cykl, aby TRMT := 0 bsf procUSART, 0, A ;procUSART:=B'01' bra koniecProc etP301: btfss TXSTA1, TRMT, ACCESS bra usart301 decfsz iloscUART, F, ACCESS bra koniecProc ;--- koniec procesu 3 lfsr FSR1, bufW ; adres bufora movff rozmBuf, iloscUART ; ilosc:=rozmiar bufora clrf procUSART, A ;stan procesu 3, procUSART:=0 bra koniecProc usart301; ;wyrównanie czasu procesu 3 movlw .1 ;koło 3 cykli / 3 rcall ppOpozn bra koniecProc koniecProc: ;wyrównanie czasu cyklu głównego movlw .125 ;koło 375 cykli / 3 ; ponieważ 375+126+24+6=521 cykli rcall ppOpozn bra powtor ;*** Funkcje. *** ;*** Sprawdzanie klawiatury *** ppSprawKlaw: clrf znaczKlaw,A ;znaczKlaw=00,tj. nie naciśnięto ;--- Wiersz 0 movlw H'EF' movwf LATD,0 ;odczyt z wiersza 0 movf PORTD,0,0 ;PORTD --> WREG andlw H'0F' ; maskowanie 0Fh cpfseq wiersz0,0 ; porównanie z poprzednim wiersz0 bra k04 ;--- ma miejsce powtórzenie stanu klawiatury --------- btfsc wiersz0, 0, A bra k01 setf znaczKlaw, A ;znaczKlaw=FF, tj. naciśnięto movlw A'1' movwf znakKlaw, A k01: btfsc wiersz0, 1, A bra k02 setf znaczKlaw, A ;znaczKlaw=FF, tj. naciśnięto movlw A'2' movwf znakKlaw, A k02: btfsc wiersz0, 2, A bra k03 setf znaczKlaw, A ;znaczKlaw=FF, tj. naciśnięto movlw A'3' movwf znakKlaw, A k03: btfsc wiersz0, 3, A bra k04 setf znaczKlaw, A ;znaczKlaw=FF, tj. naciśnięto movlw A'A' movwf znakKlaw, A bra k10 k04: movwf wiersz0, A ;--- Wiersz 1 k10: movlw H'DF' movwf LATD,0 ;odczyt z wiersza 1 movf PORTD,0,0 ;PORTD --> WREG andlw H'0F' ; maskowanie 0Fh cpfseq wiersz1,0 ; porównanie z poprzednim wiersz1 bra k14 ;--- ma miejsce powtórzenie stanu klawiatury --------- btfsc wiersz1, 0, A bra k11 setf znaczKlaw, A ;znaczKlaw=FF, tj. naciśnięto movlw A'4' movwf znakKlaw, A k11: btfsc wiersz1, 1, A bra k12 setf znaczKlaw, A ;znaczKlaw=FF, tj. naciśnięto movlw A'5' movwf znakKlaw, A k12: btfsc wiersz1, 2, A bra k13 setf znaczKlaw, A ;znaczKlaw=FF, tj. naciśnięto movlw A'6' movwf znakKlaw, A k13: btfsc wiersz1, 3, A bra k14 setf znaczKlaw, A ;znaczKlaw=FF, tj. naciśnięto movlw A'B' movwf znakKlaw, A bra k20 k14: movwf wiersz1, A ;--- Wiersz 2 k20: movlw H'BF' movwf LATD,0 ;odczyt z wiersza 2 movf PORTD,0,0 ;PORTD --> WREG andlw H'0F' ; maskowanie 0Fh cpfseq wiersz2,0 ; porównanie z poprzednim wiersz2 bra k24 ;--- ma miejsce powtórzenie stanu klawiatury --------- btfsc wiersz2, 0, A bra k21 setf znaczKlaw, A ;znaczKlaw=FF, tj. naciśnięto movlw A'7' movwf znakKlaw, A k21: btfsc wiersz2, 1, A bra k22 setf znaczKlaw, A ;znaczKlaw=FF, tj. naciśnięto movlw A'8' movwf znakKlaw, A k22: btfsc wiersz2, 2, A bra k23 setf znaczKlaw, A ;znaczKlaw=FF, tj. naciśnięto movlw A'9' movwf znakKlaw, A k23: btfsc wiersz2, 3, A bra k24 setf znaczKlaw, A ;znaczKlaw=FF, tj. naciśnięto movlw A'C' movwf znakKlaw, A bra k30 k24: movwf wiersz2, A ;--- Wiersz 3 k30: movlw H'7F' movwf LATD,0 ;odczyt z wiersza 3 movf PORTD,0,0 ;PORTD --> WREG andlw H'0F' ; maskowanie 0Fh cpfseq wiersz3,0 ; porównanie z poprzednim wiersz3 bra k34 ;--- ma miejsce powtórzenie stanu klawiatury --------- btfsc wiersz3, 0, A bra k31 setf znaczKlaw, A ;znaczKlaw=FF, tj. naciśnięto movlw A'*' movwf znakKlaw, A k31: btfsc wiersz3, 1, A bra k32 setf znaczKlaw, A ;znaczKlaw=FF, tj. naciśnięto movlw A'0' movwf znakKlaw, A k32: btfsc wiersz3, 2, A bra k33 setf znaczKlaw, A ;znaczKlaw=FF, tj. naciśnięto movlw A'#' movwf znakKlaw, A k33: btfsc wiersz3, 3, A bra k34 setf znaczKlaw, A ;znaczKlaw=FF, tj. naciśnięto movlw A'D' movwf znakKlaw, A bra k40 k34: movwf wiersz3, A k40: return ;********************* ;*** Opóżnienie = 3 cykli * WREG ;********************* ppOpozn: decfsz WREG, W, A bra ppOpozn return ;*** Deklaracja zmiennych programu: ;variables in access RAM CBLOCK 0x000 wiersz0 ;stan wiersza 0 klawiatury wiersz1 ;stan wiersza 1 klawiatury wiersz2 ;stan wiersza 2 klawiatury wiersz3 ;stan wiersza 3 klawiatury procKlaw ;stan procesu "Klawiatura" znaczKlaw ;znacznik naciśnięcia klawiszu znakKlaw ; naciśnięty znak znaczWysw ;znacznik wyświetlenia/zgaszenia znakWysw ;znacznik wyświetlany procWysw ;stan procesu "Wyświetlenie" procUSART ;stan procesu 3 znak indeks limit minuta1 minuta0 rozmBuf bufR:.16 ;bufor odczytu na 16 znaków bufW:.16 ;bufor zapisywania na 16 znaków ilosc iloscUART ENDC END