Sei sulla pagina 1di 37

D:\Ridiculous\Files\pcr1000.

asm lunedì 3 febbraio 2020 22:47

;*********************************************************************************************
*************************************
; DIRETTIVE DI INIZIALIZZAZIONE
;*********************************************************************************************
*************************************
PROCESSOR 16F876 ; indico il processore
RADIX DEC ; tutti i valori se non specificato
diversamente sono in formato decimale

INCLUDE "P16F876.INC" ;includo il file che contiene indirizzi e


specifiche del processore
ERRORLEVEL -302 ;esclusione di alcuni errori durante la
compliazione

__CONFIG 3f71h ; bits di configurazione (oscillatore,


protezione ecc)

;*********************************************************************************************
*************************************
;Linee di controllo dell'LCD
;*********************************************************************************************
*************************************
;Segnali di controllo
LCD_RS equ 2 ; 2 è associato a Register Select del lcd
LCD_E equ 3 ; 3 è associato a Lcd Enable del lcd

;LCD data line bus


LCD_RC2 equ 2 ; 2 è associato a LCD data line RA2
LCD_RC3 equ 3 ; 3 è associato a LCD data line RA3
LCD_RC0 equ 0 ; 0 è associato a LCD data line RA0
LCD_RC1 equ 1 ; 1 è associtao a LCD data line RA1

;*********************************************************************************************
*************************************
;Caratteri per trasmissione sulla seriale
;*********************************************************************************************
*************************************
CR equ 0x0D ; Carattere di CARRIDGE RETURN per il ritorno a inizio linea
LF equ 0x0A ; Carattere di LINE FEED per il passaggio alla linea sucessiva

;*********************************************************************************************
*******************************************************
; sequenze per display
;*********************************************************************************************
*******************************************************
;macro per settare a 1 enable del display
SET_EN MACRO
bsf PORTB,LCD_E ; setta a 1 enable del lcd è il segnale che abilita il
dispositivo: quando è a 1 sincronizza la lettura del dato o del comando
predisposto sul bus dati
ENDM

;macro per resettare l'enable del lcd


CLEAR_EN MACRO
bcf PORTB,LCD_E ; resetta enable del lcd
ENDM

;macro per che effettura set e reset dell'enable


EN_STROBE MACRO
-1-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
SET_EN ;richiama la macro di cui sopra
nop
CLEAR_EN ;richiama la macro di cui sopra
ENDM

;*********************************************************************************************
*******************************************************
;Alloca nella memoria registri lo spazio per le variabili utilizzate dal programma
;*********************************************************************************************
*******************************************************
ORG 20h ;porta il puntatore all'indirizzo 20h definito nelle register file map del pic a
partire da general purpose register
;dopo ogni res vengono indicati i byte utilizzati per la variabile dichiarata che
partono appunto da 20h
;non tutti i processori partono da questa locazione di memoria ma bisogna leggere i
data sheet

tmpLcdRegister res 2 ;posizione temporanea del cursore sul display


msDelayCounter res 2 ;variabile per temporizzazioni scrittura display
unita res 1 ;unità generiche per aumento/diminuzione
decine res 1 ;decine generiche per aumento/diminuzione
squ res 1 ;unità dello squelch per display
sqd res 1 ;decine dello squelch per display
volu res 1 ;unità del volume per display
vold res 1 ;decine del volume per display
pmod res 1 ;modo in cui ci si trova dopo la pressione del tasto funzione mode
vspcr res 1 ;volume o squelch convertito da unità e decine in decimale da 0 a 30
volpcr res 1 ;volume da inviare alla radio in decimale da 0 a 240 (8 volte il
valore indicato sul display da 0 a 30)
sqpcr res 1 ;squelch da inviare alla rafio in decimale da 0 a 240 (8 volte il
valore indicato sul display da 0 a 30)
count2 res 2 ;variabile per ritardo lungo dopo messaggio inizile display
rmod res 1 ;modo della radio in valore decimale (am, fm, usb ecc)
rband res 1 ;larghezza di banda della radio in valore decimale (3 khz, 5 khz ecc)
curpos res 1 ;posizione del cursore in modalità frequenza, contato dalla prima
cifra più a dx compresi i punti
fgu res 1 ;unità giga hz frequenza
fmu res 1 ;unità mega hz frequenza
fmd res 1 ;decine mega hz frequenza
fmc res 1 ;centinaia mega hz frequenza
fku res 1 ;unità kilo hz frequenza
fkd res 1 ;decine kilo hz frequenza
fkc res 1 ;centinai kilo hz frequenza
fu res 1 ;unità hz frequenza
fd res 1 ;decine hz frequenza
fc res 1 ;centinaia hz frequenza
temp res 3 ;variabile per ritardo per ritorno a visualizzazione pagina principale
spa res 1 ;variabile usata per determinare quante volte deve essere lanciata
la routine spazio da visualizzare sul display
rip res 1 ;in routine ripeti determina il numero di volte che viene lanciato
il ritardo dopo accensione iniziale display
vspcra res 1 ;parte meno significativa del volume o dello squelch in codice ascii
corrispondente al carattere esadecimale da trasmettere alla radio
vspcrb res 1 ;parte piu' significativa del volume o dello squelch in codice ascii
corrispondente al carattere esadecimale da trasmettere alla radio
vola res 1 ;parte meno significativa del volume in codice ascii corrispondente
al carattere esadecimale da trasmettere alla radio
volb res 1 ;parte piu' significativa del volume in codice ascii corrispondente
al carattere esadecimale da trasmettere alla radio
squea res 1 ;parte meno significativa dello squelch in codice ascii
corrispondente al carattere esadecimale da trasmettere alla radio
squeb res 1 ;parte piu' significativa dello squelch in codice ascii
corrispondente al carattere esadecimale da trasmettere alla radio
appesa res 1 ;appoggio del vspcra o b per passaggio routine esa per conversione
in esadecimale della parte piu' o meno sign. del volume o dello squelch
rbandp res 1 ;valore della larghezza di banda della radio in codice ascii da
trasmettere (3k, 5k ecc)
rmodp res 1 ;valore del modo della radio in codice ascii da trasmettere (fm, am
ecc)
-2-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
cursore res 1 ;variabile per capire se la funzione curosre deve muovere oppure no
il cursore (la prima volta dal display normale non lo muove)
time1 res 1 ;variabile che determina la durata del tempo delay

;*********************************************************************************************
*******************************************************
;INIZIO VERO E PROPRIO DEL CODICE DEL PROGRAMMA
;*********************************************************************************************
***********************
ORG 60H ;il programma inizia a questo indirizzo (è necessario lasciare spazio
sufficiente per la dichiarazione delle variabili

Start
bsf STATUS,RP0 ; Seleziono il banco di registri 1

;CONFIGURAZIONE COMUNICAZIONE SERIALE


;configurazione di tmr0 per temporizzazione indipendente dal codice del
ritardo tx caratteri sulla seriale
movlw 00000010B ; Settaggio del prescaler del TMR0 a 1:8 - b indica
che il formato è binario
movwf OPTION_REG ; Carico il valore di cui sopra nel registro option
reg associato a TMR0
;configurazione della velocità
movlw 19h ; valore per 9600 bps con quarzo a 4 MHz in modo
asincrono brgh=1
movwf SPBRG ; carico il valore di cui sopra nel registro SPBRG
associato all'USART
;configurazione tx
movlw 10100100b ; Abilitazione porta, 8 bit, nc, Disables continuous
receive, Disables address detection, framing error, No overrun error,9th bit
of received data
movwf TXSTA ; carico il valore di cui sopra nel registro TXSTA
associato all'USART

;CONFIGURAZIONE LINEE i/o


movlw 10010000B ;Configurazione delle linee della porta C - 1=in
0=out
movwf TRISC ;Carico il valore di cui sopra nel registro TRISC
associato a i/o porta C
movlw 11110001B ;Configurazione delle linee della porta B
movwf TRISB ;Carico il valore di cui sopra nel registro TRISB
associato a i/o porta B

bcf STATUS,RP0 ;Seleziona il banco di registri 0

;CONFIGURAZIONE COMUNICAZIONE SERIALE


;configurazione rx
movlw 10010000b ;Abilitazione porta, 8 bit, n.c, Disables continuous
receive, Disables address detection, no framing error, No overrun error, 9th
bit of received data
movwf RCSTA ;carico il valore di cui sopra nel registro RCSTA
associato all'USART

movlw 00000000B ; disabilita tutti gli interrupt


movwf INTCON ; carica il valore di cui sopra nel registro INTCON
relativo agli interrupt

;*********************************************************************************************
***************************
;INIZIALIZZAZIONE VARIABILI
;*********************************************************************************************
-3-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
***************************

movlw 48 ; il valore 48 corrispondente a ZERO in ascii viene caricato nei


registri di cui sotto
movwf volu ; 0 ascii in unità del volume per display
movwf vold ; 0 ascii in decine del volume per display
movwf squ ; 0 ascii in unità dello squlech per display
movwf sqd ; 0 ascii in decine dello squlech per display
movwf unita ; 0 ascii in unità generiche per aumento e diminuzione
movwf decine ; 0 ascii in decine generiche per aumento e diminuzione
movwf fgu ; 0 ascii in unità giga herthz per frequnza
movwf fmu ; 0 ascii in unità mega hertz per frequenza
movwf fmd ; 0 ascii in decine mega hertz per frequenza
movwf fmc ; 0 ascii in centinaia mega hertz per frequenza
movwf fku ; 0 ascii in unità kilo hertz per frequenza
movwf fkd ; 0 ascii in decine kilo hertz per frequenza
movwf fkc ; 0 ascii in centinaia kilo hertz per frequenza
movwf fu ; 0 ascii in unità hertz per frequenza
movwf fd ; 0 ascii in decine hertz per frequenza
movwf fc ; 0 ascii in centinaia hertz per frequenza

movlw 10 ;il valore 10 viene caricato nel registro di cui sotto


movwf rip ;carico 10 in rip che determinerà il numero di volte che verrà
chiamata la routine di ritardo dopo messaggio iniziale display

movlw 0 ;valore 0 viene caricato nei registri di cui sotto


movwf pmod ;modo in cui si trova il ricevitore dopo la pressione del tasto modo
(volume, squelch ecc)
movwf volpcr ;volume da inviare alla radio in decimale da 0 a 240 (8 volte il
valore indicato sul display da 0 a 30)
movwf vspcr ;volume o squelch convertito da unità e decine in decimale da 0 a 30
movwf sqpcr ;squelch da inviare alla rafio in decimale da 0 a 240 (8 volte il
valore indicato sul display da 0 a 30)
movwf rmod ;modo della radio (am, fm, usb ecc)
movwf rband ;larghezza di banda della radio (3 khz, 5 khz ecc)
movwf curpos ;posizione del cursore in modalità frequenza, contato dalla prima
cifra più a dx compresi i punti
movwf temp ;variabile per ritardo per ritorno a visualizzazione pagina principale
movwf spa ;variabile usata per determinare quante volte deve essere lanciata
la routine spazio da visualizzare sul display

movlw 0 ;valore 0
movwf curpos ;carico in posizione del cursore v di frequenza per partire tutto a sx
bsf cursore,0
movlw 250
movwf time1

;*********************************************************************************************
***************************
;INIZIALIZZA VARIABILI DA TRASMETTERE ALL'ACCENSIONE DELLA RADIO
;*********************************************************************************************
***************************

movlw '1' ;inizializza volume d=1 u=0 ascii (10) per display
movwf vold
movlw '0'
movwf volu

movlw '5' ;inizializza volume b=5 a=0 ascii (50 hex) = 80 dec (10*8) per tx
radio
movwf volb
movlw '0'
movwf vola

movlw '0' ;inizializza squelch d=0 u=9 ascii (09) per display
movwf sqd
movlw '9'
movwf squ

movlw '4' ;inizializza squelch b=4 a=8 ascii (48 hex) = 72 dec (9*8) per tx
radio
-4-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
movwf squeb
movlw '8'
movwf squea

movlw 5 ;inizializza modo rmod =5 dec = fm per display e tx radio


movwf rmod
movlw 2 ;inizializza larghezza banda rband =2 dec = 15 kHz per display e tx
radio
movwf rband

movlw '1' ;inizializza frequenza 145.750.000 su R6 per disply e tx gli altri


valori non presenti sono già inizializzati a zero
movwf fmc
movlw '4'
movwf fmd
movlw '5'
movwf fmu
movlw '7'
movwf fkc
movlw '5'
movwf fkd

;*********************************************************************************************
***************************
;MESSAGGIO INIZIALE SUL DISPLAY, ACCENSIONE RADIO E TEMPORIZZAZIONE PER PASSAGGIO A DISPLAY
PRINCIPALE
;*********************************************************************************************
*****************************************

movlw 0
call LcdInit ;Posiziona il cursore dell'LCD in posizione 0,0

Star

movlw 0x1
call LcdLocate ;posizione di inizio scrittura

movlw 'P' ; scrivo sul display pcr-1000 by RidiculousLab


call LcdSendData ; utilizzo routine già scritte per alcuni caratteri
ricorrenti tipo 0 e b
movlw 'c'
call LcdSendData
movlw 'r'
call LcdSendData
call blank
movlw '-'
call LcdSendData
call blank
movlw '1'
call LcdSendData
call car0
call car0
call car0
call blank
call blank
call carB
movlw 'y'
call LcdSendData
movlw 0x11
call LcdLocate
movlw 'R'
call LcdSendData
movlw 'i'
call LcdSendData
movlw 'd'
call LcdSendData
movlw 'i'
call LcdSendData
-5-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
movlw 'c'
call LcdSendData
movlw 'u'
call LcdSendData
movlw 'l'
call LcdSendData
movlw 'o'
call LcdSendData
movlw 'u'
call LcdSendData
movlw 's'
call LcdSendData
call blank
movlw 'L'
call LcdSendData
movlw 'a'
call LcdSendData
movlw 'b'
call LcdSendData

; e di seguito ACCENSIONE DELLA RADIO

movlw 'H' ;comando in accii di accensione trasmesso sulla seriale a 9600


Comando = H101 + CR+LF
movwf TXREG ;comando di passaggio dati sulla seriale
call TXDelay ;è mecessario aspettare 1 mS prima del carattere successivo
necessario alla trasmissione di 8 bit piu' stop a 9600 bps
movlw '1'
movwf TXREG
call TXDelay
movlw '0'
movwf TXREG
call TXDelay
movlw '1'
movwf TXREG
call TXDelay
movlw CR ; Invio CR
movwf TXREG
call TXDelay
movlw LF ; Invia LF
movwf TXREG
call TXDelay

movlw 'J' ;comando in accii per inizializzazione radio 9600 Comando =


J4380 + CR+LF
movwf TXREG
call TXDelay
movlw '4'
movwf TXREG
call TXDelay
movlw '3'
movwf TXREG
call TXDelay
movlw '8'
movwf TXREG
call TXDelay
movlw '0'
movwf TXREG
call TXDelay
movlw CR
movwf TXREG
call TXDelay
movlw LF
movwf TXREG
call TXDelay

;fine accensione radio


;temporizzazione per cancellazione messaggio iniziale e per passaggio a display principale
ripeti

-6-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47

call Delay ;chiama ritardo


call Delay ;chiama ritardo
call Delay ;chiama ritardo
decfsz rip,1 ;decrementa rip da 10 (inizializzato precedentemente) fino a 0 in
modo da eseguire 10 volte la routine
goto ripeti
call testa ;scaduto il tempo chiama la routine testa che visualizza la prima
riga della visualizzazione principale sul display (Vol,Modo e larghezza banda)
goto Freq ;in seguito visualizza la seconda della visualizzazione principale
del display contentene la frequenza sintonizzata

;*********************************************************************************************
***************************
;ROUTINE TESTA PER LA VISUALIZZAZIONE DELLA PRIMA LINEA DELLA VISUALIZZAZIONE PRINCIPALE DEL
DISPLAY
;*********************************************************************************************
*****************************************

testa
;call curr ;chiama curr per posizionare su -1 la poszione del cursore per
la variazione di frequenza
movlw 0 ; 0 nell'accumulatore
movf pmod ; posiziona a 0 il valore di pmod in modo da ricominciare dalla
prima funzione premendo il tasto funzione mode
call loc0 ;chiama loc0 per posizionare il cursore sul display al punto 0

movlw 'V' ;scrive Vol e il valore tra 0 e 30 sul display


call LcdSendData
movlw 'o'
call LcdSendData
movlw 'l'
call LcdSendData
call blank
movf vold,0
call LcdSendData
movf volu,0
call LcdSendData

movlw 3 ;scrive 3 nell'accumulatore


call sblank ;richiama sblank per scrivere tanti spazi quanti il numero
caricato prececdentemente nell'accumulatore

call ffrr ;richiama ffrr per associare il valore di rmod del modo alla
scrittura sul display del corrispondente testo del modo (AM, FM ecc)
movlw 2 ;carica 2 nell accumulatore
call sblank ;richiama sblank per scrivere due spazi sul display

call bbww ;richiama bbww per associare il valore rband della larghezza di
banda alla scrittura sul display del corrispondente testo (3,5,15 ecc)
movlw 'k' ;scrive k per indicare che la larghezza di banda è indicata in kHz
call LcdSendData

return

;*********************************************************************************************
***************************
;ROUTINE di POLLING PER MANTENERE ACCESA LA RADIO
;*********************************************************************************************
*****************************************
pollvol
;polling volume per mantenre accesa la radio, se non vengono inviati comandi alla radio per
oltre 5 secondi la radio si spegne, è sufficiente trasmettere entro 5 sec il comando del
volume

movlw 'J' ;comando in accii del volume sulla seriale a 9600 Comando =
J40 + Volume hex piu' sign e Volume hex - sign + CR+LF
-7-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
movwf TXREG ;solita temporizzazione tra una carattere e il successivo
call TXDelay
movlw '4'
movwf TXREG
call TXDelay
movlw '0'
movwf TXREG
call TXDelay
movf volb,0
movwf TXREG
call TXDelay
movf vola,0
movwf TXREG
call TXDelay
movlw CR
movwf TXREG
call TXDelay
movlw LF
movwf TXREG
call TXDelay

;fine polling volume


return

;*********************************************************************************************
************************
;ROUTINE POLL e POLL2 PER IL POLLING DEI TASTI FUNZIONE E POLLING VOLUME PER MANTENIMENTO
ACCENSIONE RADIO
;*********************************************************************************************
*****************************************

poll
; ritardo per ritorno a visualizzazione principale dopo il rilascio di tasti funzione
decfsz temp,1 ; istruzioni di decremento temp per costruzione temporizzazione
goto poll2 ; richiama poll2 per effettura il polling vero e proprio dei tasti
funzione anche durante la temporizzazione
movlw 250 ; carico i valori per corretta temporizzazione in temp
movwf temp
decfsz temp+1,1
goto poll2 ; richiama poll2 per effettura il polling vero e proprio dei tasti
funzione anche durante la temporizzazione
movlw 5 ; carico i valori per corretta temporizzazione in temp+1, determina
il tempo di ritorno alla visualizzazione normale del display
movwf temp+1
decfsz temp+2,1
goto poll2 ; richiama poll2 per effettura il polling vero e proprio dei tasti
funzione anche durante la temporizzazione
movlw 0
movwf pmod ; azzera pmod in modo da ricominciare dalla prima funzione
disponibile premendo il tasto funzione mode dopo il ritorno alla visualizzazione
principale sul display
bsf cursore,0
;al termine della temporizzazione pollo il volume e ritorno alla visualizzazione prncipale

call pollvol

;azzero la variabile di ritardo per visualizz normale e ritorno alla visualizzazione


principale del display

call canc ; azzero la varaibile temp per ritardo ritorno alla


visualizzazione normale
movlw 250 ;rallenta la pigiatura dei tasti
movwf time1
call testa ; richiamo la routine testa per visualizzazione principale
del dis

;polling vero e proprio dei tasti funzione continuamente in modo da accorgermi


immediatamente se viene premuto uno dei tasti funzione

poll2

-8-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
btfsc PORTB,4 ;se rb4=1 ovvero se pigio il tasto funzione mode collegato
all'ingresso RB4
goto mode ;eseguo mode

btfsc PORTB,5 ;se rb5=1 ovvero se pigio il tasto funzione piu' collegato
all'ingresso RB5
goto piuu ;eseguo piuu

btfsc PORTB,6 ;se rb6=1 ovvero se pigio il tasto funzione meno collegato
all'ingresso RB6
goto menoo ;eseguo menoo

btfsc PORTB,7 ;se rb7=1 ovvero se pigio il tasto funzione cursore


frequenza dx collegato all'ingresso RB7
goto fcur ;eseguo fcur

btfsc PORTB,0 ;se rb0=1 ovvero se pigio il tasto funzione cursore


frequenza sx collegato all'ingresso RB0
goto fcurs ;eseguo fcurs

goto poll ;se nessun tasto è premutp richiamo poll per reiterare il
polling continuo dei tasti funzion

;*********************************************************************************************
************************
;ROUTINE PIUU NEL CASO VIENE PIGIATO IL TASTO PIU', DIROTTA IL PROGRAMMA IN BASE AL VALORE
ATTUALE DI PMOD (DOVUTO AL NUMERO DI VOLTE CHE E' STATO PREMUTO IL TASTO FUNZIONE MODE)
;*********************************************************************************************
*****************************************

piuu
call pollvol
call canc ;azzero la varaibile temp per ritardo ritorno alla
visualizzazione normale
movlw 1
subwf pmod,0 ; sottrae pmod dall'accumulatore per verificare se vale 1
btfsc STATUS,Z ; verifica se pmod =1, in questo caso sposta il puntatore a
piuvo in quanto ci troviamo nella funzione volume
goto piuvo ; vai a piuvo per aumento del volume
movlw 2
subwf pmod,0
btfsc STATUS,Z ;verifica se pmod=2, in questo caso sposta il puntatore a piusq
in quanto ci troviamo nella funzione squelch
goto piusq ;vai a piusq per aumento dello squelch
movlw 3
subwf pmod,0
btfsc STATUS,Z ;verifica se pmod=3, in questo caso sposta il puntatore a piuf
in quanto ci troviamo nella funzione frequenza
goto piuf ;vai a piuf per aumento del valore di frequenza da sintonizzare
movlw 4
subwf pmod,0
btfsc STATUS,Z ;verifica se pmod=4, in questo caso sposta il puntatore a piumod
in quanto ci troviamo nella funzione modo della radio (am, fm ecc)
goto piumod ;vai a piumod per aumento del valore rmod per il modo della radio
movlw 5
subwf pmod,0
btfsc STATUS,Z ;verifica se pmod=5, in questo caso sposta il puntatore a piuban
in quanto ci troviamo nella funzione bandwidth
goto piuban ;vai a piumod per aumento del valore rband per la larghezza di
banda della radio
call canc ;svuoto temp e temp +1 per avere sempre temporizzazione uguale
movlw 1 ;metto 1 in w
movwf pmod ;metto 1 in pmod in modo da avere sempre il contollo volume se
non viene premuto p mode
goto piuvo ;chiamo la funzione piu' volume in ogni caso (dalla
visualizzazione normale premento piu' o meno si passa sempre al volume)
goto poll ;ritorna a poll per controllo della pigiatura di altri tasti
-9-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
funzione

;*********************************************************************************************
************************
;ROUTINE MENOO NEL CASO VIENE PIGIATO IL TASTO MENO', DIROTTA IL PROGRAMMA IN BASE AL VALORE
ATTUALE DI PMOD (DOVUTO AL NUMERO DI VOLTE CHE E' STATO PREMUTO IL TASTO FUNZIONE MODE)
;*********************************************************************************************
*****************************************

menoo
call pollvol
call canc ;azzero la varaibile temp per ritardo ritorno alla
visualizzazione normale
movlw 1 ;carica 1 nell'accumulatore
subwf pmod,0 ;sottre pmod dall'accumulatore per verificare se vale 1
btfsc STATUS,Z ; verifica se pmod =1, in questo caso sposta il puntatore a
menvo in quanto ci troviamo nella funzione volume
goto menovo ;vai a menvo per diminuzione del volume
movlw 2
subwf pmod,0
btfsc STATUS,Z ; verifica se pmod =2, in questo caso sposta il puntatore a
menosq in quanto ci troviamo nella funzione squelch
goto menosq ;vai a menosq per diminuzione delle squelch
movlw 3
subwf pmod,0
btfsc STATUS,Z ; verifica se pmod =3, in questo caso sposta il puntatore a menf
in quanto ci troviamo nella funzione frequenza
goto menf ;vai a menf per diminuzione del valore di frequenza da
sintinizzare
movlw 4
subwf pmod,0
btfsc STATUS,Z ; verifica se pmod =4, in questo caso sposta il puntatore a
menmod in quanto ci troviamo nella funzione modo della radio (am, fm, ecc)
goto menmod ;vai a menmod per diminuzione del valore rmod per il modo della
radio
movlw 5
subwf pmod,0
btfsc STATUS,Z ; verifica se pmod =5, in questo caso sposta il puntatore a
menban in quanto ci troviamo nella funzione bandwidth
goto menban ;vai a menban per diminuzuine del valore rband per la larghezza
di banda della radio
call canc ;svuoto temp e temp +1 per avere sempre temporizzazione uguale
movlw 1 ;metto 1 in w
movwf pmod ;metto 1 in pmod in modo da avere sempre il contollo volume se
non viene premuto p mode
goto menovo ;chiamo la funzione meno volume in ogni caso (dalla
visualizzazione normale premento piu' o meno si passa sempre al volume)
goto poll ;ritorna a poll per controllo della pigiatura di altri tasti
funzione

;*********************************************************************************************
************************
;ROUTINES di GESTIONE PRINCIPALE AUMENTO DIMINUZIONE SQUELCH E VOLUME CON UTILIZZO DI
ROUTINES COMUNI E DATI APOGGIATI SU MEDESIME VARIABILI
;*********************************************************************************************
*****************************************

piuvo
call xx ;se pigio il tasto piu nella funzione volume eseguo xx che
scambia i dati del volume su variabili di appoggio unita e decine e su
variabile di appoggio volpcr per radio, poi eseguo piu
goto piu

;***********************

piusq
-10-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
call yy ;se pigio il tasto piu nella funzione squelch eseguo yy che
scambia i dati dello squelch su variabili di appoggio unita e decine e su
variabile di appoggio sqpcr per radio, poi eseguo piu
goto piu

;***********************

menovo
call xx ;se pigio il tasto meno nella funzione volume eseguo xx che
scambia i dati del volume su variabili di appoggio unita e decine e su
variabile di appoggio volpcr per radio, poi eseguo meno
goto meno

;***********************

menosq
call yy ;se pigio il tasto meno nella funzione volume eseguo yy che
scambia i dati dello squelch su variabili di appoggio unita e decine e su
variabile di appoggio sqpcr per radio, poi eseguo meno
goto meno

;***********************

xx
movf volu,0 ;carica volu (unità visualizzate sul display del volume)
nell'accumulatore
movwf unita ;carica volu in unità
movf vold,0 ;carica vold (decine visualizzate sul display del volume)
nell'accumulatore
movwf decine ;carica vold nelle decine
movf vspcr,0 ;carica vspcr (volume o squelch per radio ) nell'accumulatore
movwf volpcr ;carica vspcr in volpcr cioè nel volume per il pcr

return

;***********************

yy
movf squ,0 ;carica squ (unità visualizzate sul display dello squelch)
nell'accumulatore
movwf unita ;carica squ in unità
movf sqd,0 ;carica sqd (decine visualizzate sul display dello squelch)
nell'accumulatore
movwf decine ;carica sqd in decine
movf vspcr,0 ;carica vspcr (volume o squelch per radio ) nell'accumulatore
movwf sqpcr ;carica vspcr in sqpcr cioè nello squelch per il pcr

return

;***********************

;controllo limiti decine=3 e unita =9 in aumento


piu
movlw 51 ;carico 51 ovvero 3 ascii in accumulatore
subwf decine,0
btfsc STATUS,Z ;controllo se decine = 3 (limite alto =30)
goto ee ;se = 3 vado a ee perche sono sicurmamnte a 30 che è il limite
goto bs ;se diverso da 3 vado a bs

bs
movlw 57 ;carico 57 ovvero 9 ascii in accumulatore
subwf unita,0
movlw 49 ;serve?
btfsc STATUS,Z ;controllo se untità = 9 (limite unità)
goto aaa ;se = 9 vado a aaa poiche le decine sono inferiori a 3 per cui
posso ancora incrementare
goto bbb ;se diverso da 9 vado a bbb per incrementarle senza incrementare
le unità

aaa
incf decine,1 ;se unità è uguale a 9 incremento le decine
-11-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
movlw 48 ;carico 0 ascii nell'accuulatore
movwf unita ;azzero le unità
goto ee ;dopo vado a ee

bbb
incf unita,1 ;se unità sono diverse da 9 posso incrementarle ancora
goto ee ;dopo vado a ee

;***********************

;controllo limiti decine=0 unità =0 in decremento


meno
movlw 48 ;carico 48 ovvero 0 ascii in accumulatore
subwf unita,0
movlw 49 ;serve?
btfsc STATUS,Z ;controllo se unità =0 (limite basso)
goto aa ;se=0 vado a aa per controllare il valore delle decine
goto bb ;se diverso da 0 vado a bb per decrementare

aa
movlw 48 ;carico 48 ovvero 0 ascii in accumulatore
subwf decine,0
btfsc STATUS,Z ;controllo se decine=0 (limite basso)
goto ee ;se=0 vado a ee perche' decine e unità sono a zero
goto dd ;se diverso da 0 vado a dd perche' posso ancora decrementare le
decine

bb
decf unita,1 ;se unità diverso da 0 posso ancora decrementare
goto ee ;poi vado a ee

dd
decf decine,1 ;se deecine sono diverse da 0 posso ancora decrementarle
movlw 57 ;carico 57 ovvero 9 in ascii nell'accumulatore
movwf unita ;carico 9 nelle unità
goto ee ;poi vado a ee

;***********************

;calcolo volume per pcr1000

ee movlw 48 ;carico 48 ovvero 0 ascii nell'accumulatore


subwf decine,0 ;sottraggo le decine
btfsc STATUS, Z ;controllo se decine =0
goto ff ;se decine=0 vado a ff
movlw 49 ;altrimenti carico 49 ovvero 1 ascii nell'accumulatore
subwf decine,0 ; ;sottraggo le decine
btfsc STATUS, Z ;controllo se decine =1
goto gg ;se decine =1 vado a gg
movlw 50 ;altrimenti carico 50 ovvero 2 ascii nell'accumulatore
subwf decine,0 ;sottraggo le decine
btfsc STATUS, Z ;controllo se decine =2
goto hh ;se decine=2 vado a hh
movlw 51 ;altrimenti carico 51 ovvero 3 ascii nell'accumulatore
subwf decine,0 ;sottraggo le decine
btfsc STATUS, Z ;controllo se decine =3
goto ii ;se decine =3 vado a ii
goto jj ;altrimenti vado a jj (verifica e smista se nei casi diversi
volume e squelch)

ff call decinev ;se decine=0 -- chiamo decinev per calcolare il valore decimale
del valore ascii delle unità che troverò in vspcr
movlw 0 ;carico 0 in accumulatore (che rappresentano le decine)
addwf vspcr,1 ;in decimale aggiungo le decine alle unità ma so che le decine
sono 0, vspcr sarà decimale corrispondente al valore letto sul display
call otto ;ora ho un valore decimale corrispondente al valore del display,
lo moltiplico per 8 per aver un valore adatto per la radio chiamando otto
-12-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
call diviso ;chiamo la funzione diviso per dividere il valore decimale vspcr
in due byte esadecimali necessari per la radio
goto jj ;vado a jj (verifica e smista se nei casi diversi volume e
squelch)

gg call decinev ;se decine=1 -- chiamo decinev per calcolare il valore decimale
del valore ascii delle unità che troverò in vspcr
movlw 10 ;carico 10 in accumulatore (che rappresentano le decine)
addwf vspcr,1 ;in decimale aggiungo le decine alle unità per avere un vspcr
decimale corrispondente al valore che leggo sul display
call otto ;ora ho un valore decimale corrispondente al valore del display,
lo moltiplico per 8 per aver un valore adatto per la radio chiamando otto
call diviso ;chiamo la funzione diviso per dividere il valore decimale vspcr
in due byte esadecimali necessari per la radio
goto jj ;vado a jj (verifica e smista se nei casi diversi volume e
squelch)

hh call decinev ;se decine=2 -- chiamo decinev per calcolare il valore decimale
del valore ascii delle unità che troverò in vspcr
movlw 20 ;carico 20 in accumulatore (che rappresentano le decine)
addwf vspcr,1 ;in decimale aggiungo le decine alle unità per avere un vspcr
decimale corrispondente al valore che leggo sul display
call otto ;ora ho un valore decimale corrispondente al valore del display,
lo moltiplico per 8 per aver un valore adatto per la radio chiamando otto
call diviso ;chiamo la funzione diviso per dividere il valore decimale vspcr
in due byte esadecimali necessari per la radio
goto jj ;vado a jj (verifica e smista se nei casi diversi volume e
squelch)

ii call decinev ;se decine=3 -- chiamo decinev per calcolare il valore decimale
del valore ascii delle unità che troverò in vspcr
movlw 30 ;carico 30 in accumulatore (che rappresentano le decine)
addwf vspcr,1 ;in decimale aggiungo le decine alle unità per avere un vspcr
decimale corrispondente al valore che leggo sul display
call otto ;ora ho un valore decimale corrispondente al valore del display,
lo moltiplico per 8 per aver un valore adatto per la radio chiamando otto
call diviso ;chiamo la funzione diviso per dividere il valore decimale vspcr
in due byte contenenti il valore che in esadecimali è necessario per la radio
goto jj ;vado a jj (verifica e smista se nei casi diversi volume e
squelch)

;calcolo il valore da ascii a decimale delle unità


decinev
movlw 48 ;pongo 48 ovvero 0 ascii nell'accumulatore
subwf unita,0 ;sottraggo le unità per caloclare il valore decimale dell unità
movwf vspcr ;carico il risultato in vspcr
return

;eseguo una moltiplicazione per otto del valore in vspcr per ottenere il valore che mi
server per la radio da 0 a 240 (il display va da 0 a 30)
otto
RLF vspcr,1 ;shchifto vspcr di 1 bit
RLF vspcr,1 ;schifto vspcr di 1 bit
RLF vspcr,1 ;schifto vspcr di 1 bit
return

;divido il valore decimale da 0 a 240 di vspcr in due byte contenenti il valore che in esa
corrisponde al valore necessario a comandare la radio
diviso
movlw 15 ;pongo 15 decimale in w ovvero 00001111 in binario
andwf vspcr,0 ;faccio l'and con la parte dx per tenere quella parte
movwf vspcra ;pongo il valore ottenuto in vspcra
swapf vspcr,1 ;sistemato il valore a ora swappo (scambio dei 4 bit a dx con
quelli a sx) il byte per effetturare la stessa operazione con i bit piu' significativi
movlw 15 ;pongo ancora 15 ovvero 00001111 in w
andwf vspcr,0 ;faccio ancora l'and
movwf vspcrb ;pongo il valore ottenuto in vspcrb
swapf vspcr,1 ;sistemato il valore b swappo ancora per avere in vspcr il
valore inziale che mi serve per altre operazioni
return
-13-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47

;verifica di pmod e reindirizzamento a routine corrispondente , se 1 è il volume, se diverso


da 1 ovvero 2 deve essre per forza lo squelch
jj
movlw 1 ;pongo 1 in w
subwf pmod,0 ;sottraggo da pmod
btfsc STATUS,Z ;verifico pmod
goto ss ;se vale (volume) uno vado a ss
goto tt ;altrimenti (squelch) vado a tt

;scambia i valori generici di unità e decine in unità e decine volume per display e calcola
i valori corretti esadecimali per l'invio alla radio
ss
movf unita,0 ;il generico unità viene posto in volu - volume unità
movwf volu
movf decine,0 ;il generico decine viene posto in vold - volume decine
movwf vold
movf vspcra,0 ;il valore dei bit meno significativo di vspcr viene posto in w
movwf appesa ;il valore di cui sopra e posto in appesa (appoggio per calcolo
valore esa in ascii per tx radio)
call esa ;chiama la funzione esa per conversione del valore decimale da 1
a 15 al valore corrispondente esa (0.1.2.3.4.5.6.7.8.9.a.b.c.d.e) in ascii
movwf vola ;muove il risultato in vola per tx alla radio
movf vspcrb,0 ;il valore piu' significativo di vspc viene posto in w
movwf appesa ;il valore di cui sopra e posto in appesa (appoggio per calcolo
valore esa in ascii per tx radio)
call esa ;chiama la funzione esa per conversione del valore decimale da 1
a 15 al valore corrispondente esa (0.1.2.3.4.5.6.7.8.9.a.b.c.d.e) in ascii
movwf volb ;muove il risultato in volb per tx alla radio
call invio ;chiama la funzione
; per la trasmissione alla radio del parametro che è stato modificato
call volume ;chiama la funzione volume per la visualizzazione sul display
del modo momentaneo volume e del valore
call Delay ;richiama ritardo
call canc
goto poll ;ritorna al polling de tasti

;scambia i valori generici di unità e decine in unità e decine squelch per display e calcola
i valori corretti esadecimali per l'invio alla radio
tt
movf unita,0 ;il generico unità viene posto in squ - squelch unità
movwf squ
movf decine,0 ;il generico decine viene posto in sqd - squelch decine
movwf sqd
movf vspcr,0 ;il generico vspcr viene caricato in sqpcr ma probabilmente non
è necessario questo
movwf sqpcr
movf vspcra,0 ;il valore dei bit piu' significativo di vspcr viene posto in w
movwf appesa ;il valore di cui sopra e posto in appesa (appoggio per calcolo
valore esa in ascii per tx radio)
call esa ;chiama la funzione esa per conversione del valore decimale da 1
a 15 al valore corrispondente esa (0.1.2.3.4.5.6.7.8.9.a.b.c.d.e) in ascii
movwf squea ;muove il risultato in squea per tx alla radio
movf vspcrb,0 ;il valore dei bit meno significativo di vspcr viene posto in w
movwf appesa ;il valore di cui sopra e posto in appesa (appoggio per calcolo
valore esa in ascii per tx radio)
call esa ;chiama la funzione esa per conversione del valore decimale da 1
a 15 al valore corrispondente esa (0.1.2.3.4.5.6.7.8.9.a.b.c.d.e) in ascii
movwf squeb ;muove il risultato in squeb per tx alla radio
call invio ;chiama la funzione invio per la trasmissione alla radio del
parametro che è stato modificato
call sque ;chiama la funzione sque per la visualizzazione sul display del
modo momentaneo squee del valore
call Delay ;richiama ritardo
call canc
goto poll ;ritorna al polling de tasti

-14-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
;funzione per convertire i valori da 0 a 15 contenuti in appesa in decimal in valori ascii
per la tx radio (0.1.2.3.4.5.6.7.8.9.a.b.c.d.e.f)
esa
movlw 10 ;pongo 10 decimale in w
subwf appesa,0 ;sottraggo 10 da appesa
btfss STATUS,C ;verifico che appesa sia minore di 10
goto esa1 ;se appesa è minore di 10 vado a esa1
movlw 55 ;altrimenti cioè se appesa è maggiore di 10 pongo 55 in w
(ovvero ciò che devo aggiungere a 10 per partire da a in ascii)
addwf appesa,0 ;aggiungo a w cioe' a 55 ad appesa
movwf appesa ;carico w in appesa
return

esa1
movlw 48 ;se invece appesa è minore di 10 pongo 48 in w (ovvero 0 cio'
che devo aggiiungere a appesa per partire da 0 in ascii)
addwf appesa,0 ;aggingo w in appesa
movwf appesa ;carico w in appesa
return

;invio dei valori alla radio in seguito ad ogni variazione, volume, squelch e parametri di
sintonia (frequenza, modo, banda)
invio
;volume
movlw 'J' ;comando in accii del volume sulla seriale a 9600 Comando = J40
+ Volume hex piu' sign e Volume hex - sign + CR+LF
movwf TXREG ;solita temporizzazione di 1ms tra l'inizio di un carattere e il
successivo
call TXDelay
movlw '4'
movwf TXREG
call TXDelay
movlw '0'
movwf TXREG
call TXDelay
movf volb,0
movwf TXREG
call TXDelay
movf vola ,0
movwf TXREG
call TXDelay
movlw CR
movwf TXREG
call TXDelay
movlw LF
movwf TXREG
call TXDelay

;squelch
movlw 'J' ;comando in accii dello squelch sulla seriale a 9600 Comando =
J41 + Squelch hex piu' sign e Squelch hex - sign + CR+LF
movwf TXREG ;solita temporizzazione di 1 ms tra l'inizio di un carattere e
il successivo
call TXDelay
movlw '4'
movwf TXREG
call TXDelay
movlw '1'
movwf TXREG
call TXDelay
movf squeb,0
movwf TXREG
call TXDelay
movf squea,0
movwf TXREG
call TXDelay
movlw CR
movwf TXREG
call TXDelay
movlw LF
-15-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
movwf TXREG
call TXDelay

;frequenza
movlw 'K' ;comando in accii stringa frequenza+banda+modo sulla seriale a
9600 Comando = K0 + frequenza + rmod + rband + 00 + CR+LF
movwf TXREG ;solita temporizzazione tra un carattere e l'altro
call TXDelay
movlw '0'
movwf TXREG
call TXDelay
movf fgu,0
movwf TXREG
call TXDelay
movf fmc,0
movwf TXREG
call TXDelay
movf fmd,0
movwf TXREG
call TXDelay
movf fmu,0
movwf TXREG
call TXDelay
movf fkc,0
movwf TXREG
call TXDelay
movf fkd,0
movwf TXREG
call TXDelay
movf fku,0
movwf TXREG
call TXDelay
movf fc,0
movwf TXREG
call TXDelay
movf fd,0
movwf TXREG
call TXDelay
movf fu,0
movwf TXREG
call TXDelay
movlw '0'
movwf TXREG
call TXDelay
movf rmodp,0
movwf TXREG
call TXDelay
movlw '0'
movwf TXREG
call TXDelay
movf rbandp,0
movwf TXREG
call TXDelay
movlw '0'
movwf TXREG
call TXDelay
movlw '0'
movwf TXREG
call TXDelay
movlw CR
movwf TXREG
call TXDelay
movlw LF
movwf TXREG
call TXDelay
return
;fine invio

;*********************************************************************************************
************************
-16-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
;CALCOLO E VISUALIZZAZIONE DEL MODO DELLA RADIO (AM, FM, ecc)
;*********************************************************************************************
************************
;arrivo qui se è premuto il tasto piu' nella modalità modo della radio, limiti 0 e 6 ,
valore 4 escluso
piumod
movlw 6 ;pongo 6 in w (limite)
subwf rmod,0 ;sottraggo rmod
btfss STATUS,Z ;verifico che rmod sia =6
incf rmod,1 ;se rmod è diverso da 6 posso incrementarlo
movlw 4 ;altrimenti pongo 4 w (4 non esiste)
subwf rmod,0 ;sottraggo rmod
btfsc STATUS,Z ;se rmod è uguale a 4
incf rmod,1 ;incremento altra volta per saltare il 4
goto modo ;vado a routine modo per visualizzazione momentanea della
funzione display modo e valore corrispondente e tx radio

menmod
movlw 0 ;pongo 0 in w (limite)
subwf rmod,0 ;sottraggo rmod
btfss STATUS,Z ;verifico che rmod sia diverso da 0
decf rmod,1 ;se rmod è diverso da 0 posso decrementarlo
movlw 4 ;pongo 4 in w (4 non esiste)
subwf rmod,0 ;sottraggo rmod
btfsc STATUS, Z ;controllo se rmod =4
decf rmod,1 ;se rmod è uguale a 4 decremento ancora per saltarlo
goto modo ;vado a routine modo per visualizzazione momentanea della
funzione display modo e valore corrispondente e tx radio

;*********************************************************************************************
************************
;CALCOLO E VISUALIZZAZIONE DELLA LARGHEZZA DI BANDA
;*********************************************************************************************
************************
;arrivo qui se è premuto il tasto piu' nella modalità bandwidth della radio, limiti 0 e 4
piuban
movlw 4 ;pongo 4 in w (limite)
subwf rband,0 ;sottraggo rband
btfss STATUS,Z ;verifico che rmod sia diverso da 4
incf rband,1 ;se rband è diverso da 4 posso incrementarlo
goto bandwidth ;vado a routine bandwidth per visualizzazione momentanea della
funzione display larghezza du banda e valorecorrispondente, tx alla radio

menban
movlw 0 ;pongo 0 in w (limite)
subwf rband,0 ;sottraggo rband
btfss STATUS,Z ;verifico che rband sia diverso da 0
decf rband,1 ;se rband è diverso da 0 posso decrementarlo
goto bandwidth ;vado a routine bandwidth per visualizzazione momentanea della
funzione display larghezza du banda e valorecorrispondente, tx alla radio

;*********************************************************************************************
************************
;AUMENTO E DIMINUZIONE DEL VALORE DI FREQUENZA SINTONIZZATO
;*********************************************************************************************
************************
;arrivo qui se è premuto il tasto piu e siamo nella funzione frequenza ed effettuo il
controllo della posizione del cursore
piuf
movlw 30 ;velocizza la pigiatura dei tasti
movwf time1

movlw 12 ;pongo 12 in w
subwf curpos,0 ;sottraggo curpos
btfsc STATUS,Z ;verifico se il cursore curpos è in posizione 12
goto p12a ;se curpos è nella posizione 12 vai a p12a
-17-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
movlw 11 ;e avanti così per 11 ecc
subwf curpos,0
btfsc STATUS,Z
goto p11a
movlw 10
subwf curpos,0
btfsc STATUS,Z
goto p10a
movlw 8
subwf curpos,0
btfsc STATUS,Z
goto p8a
movlw 7
subwf curpos,0
btfsc STATUS,Z
goto p7a
movlw 6
subwf curpos,0
btfsc STATUS,Z
goto p6a
movlw 4
subwf curpos,0
btfsc STATUS,Z
goto p4a
movlw 3
subwf curpos,0
btfsc STATUS,Z
goto p3a
movlw 2
subwf curpos,0
btfsc STATUS,Z
goto p2a
movlw 0
subwf curpos,0
btfsc STATUS,Z
goto p0a
call invio
goto Freq

;arrivo qui se è premuto il tasto meno e siamo nella funzione frequenza ed effettuo il
controllo della posizione del cursore
menf
movlw 30 ;velocizza la pigiatura dei tasti
movwf time1

movlw 12 ;pongo 12 in w
subwf curpos,0 ;sottraggo curpos
btfsc STATUS,Z ;verifico se il cursore curpos è in posizione 12
goto p12d ;se curpos è nella posizione 12 vai a p12a
movlw 11 ;e avanti così per 11 ecc.
subwf curpos,0
btfsc STATUS,Z
goto p11d
movlw 10
subwf curpos,0
btfsc STATUS,Z
goto p10d
movlw 8
subwf curpos,0
btfsc STATUS,Z
goto p8d
movlw 7
subwf curpos,0
btfsc STATUS,Z
goto p7d
movlw 6
subwf curpos,0
btfsc STATUS,Z
goto p6d
movlw 4
subwf curpos,0
-18-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
btfsc STATUS,Z
goto p4d
movlw 3
subwf curpos,0
btfsc STATUS,Z
goto p3d
movlw 2
subwf curpos,0
btfsc STATUS,Z
goto p2d
movlw 0
subwf curpos,0
btfsc STATUS,Z
goto p0d
call invio
goto Freq

;incrmento dei valori in relazione alla posizione del cursore


;UNITA'
p12a
movlw 57 ;pongo 57 decimale in w ovvero 9 in ascii
subwf fu,0 ;sottraggo fu in quanto la posizione dodici corrisponde a frequenza
unità
btfsc STATUS,Z ;verifico che fu non valga nove ascii
goto p12x ;se vale nove passo a p12x per riportarlo a zero
incf fu,1 ;se fu non vale 9 posso incrmentarlo
goto Freq ;e così via per tutte le posizioni

p12x
movlw 48 ;pongo 58 ascii in w
movwf fu ;pongo w ovvero 0 (48 ascii) in fu per riazzerarlo
goto p11a ;vado alla cifra immediatamente piu' alta per incremetntarla

;DECINE
p11a
movlw 57
subwf fd,0
btfsc STATUS,Z
goto p11x
incf fd,1
goto Freq

p11x
movlw 48
movwf fd
goto p10a

;CENTINAIA
p10a
movlw 57
subwf fc,0
btfsc STATUS,Z
goto p10x
incf fc,1
goto Freq

p10x
movlw 48
movwf fc
goto p8a

;KILO UNITA'
p8a
movlw 57
subwf fku,0
btfsc STATUS,Z
goto p8x
incf fku,1
goto Freq

-19-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
p8x
movlw 48
movwf fku
goto p7a

;KILO DECINE
p7a
movlw 57
subwf fkd,0
btfsc STATUS,Z
goto p7x
incf fkd,1
goto Freq

p7x
movlw 48
movwf fkd
goto p6a

;KILO CENTINAIA
p6a
movlw 57
subwf fkc,0
btfsc STATUS,Z
goto p6x
incf fkc,1
goto Freq

p6x
movlw 48
movwf fkc
goto p4a

;MEGA UNITA'
p4a
movlw 57
subwf fmu,0
btfsc STATUS,Z
goto p4x
incf fmu,1
goto Freq

p4x
movlw 48
movwf fmu
goto p3a

;MEGA DECINE
p3a
movlw 57
subwf fmd,0
btfsc STATUS,Z
goto p3x
incf fmd,1
goto Freq

p3x
movlw 48
movwf fmd
goto p2a

;MEGA CENTINAIA
p2a
movlw 49
subwf fgu,0 ;sottraggo gigaherz=0
btfss STATUS, Z ;se gigaherz =0
goto p2xx ;vado a p2ax
movlw 50 ;altrimenti controllo se le centinaia di mhz sono=2 max 1.300 ghz
subwf fmc,0 ;sottraggo
btfsc STATUS,Z ;controllo
goto p2bx ;se=2 vado a p2bx dove porto a tre le centinaia di Mhz ma azzero
-20-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
utti i ivalori piu' bassa
movlw 51 ;altrimenti controllo se le cetinaia di Mhz=3
subwf fmc,0 ;sottraggo
btfsc STATUS,Z ;controllo
goto Freq ;se vale tre non incrmento ulteriormente perche' sono al limite
dei 1.300 mhz
goto p2xx ;diversamente posso andare a p2xx per incrementa<re

p2xx ;se le condizioni lo permettono incremento le centinaia di mhz,


(ovvero solo se non sono arrivato a 1300 e on devo incrementare i giga
movlw 57
subwf fmc,0
btfsc STATUS,Z
goto p2ax
incf fmc,1
goto Freq

p2bx ;se sono a 1,2 ghz e devo passare a 1,3 allora porto a zero
tutti i valori meno siginificativi per passar a 1300 tondi
movlw 48
movwf fu
movwf fd
movwf fc
movwf fku
movwf fkd
movwf fkc
movwf fmu
movwf fmd
incf fmc,1
goto Freq

p2ax ;se invece giga = 0 e centinaia di mhz=9 devo incremetnare giga


movlw 48
movwf fmc
goto p0a

;GIGA UNITA'
p0a
movlw 49 ;se giga vale 0 incremento, se vale 1 controllo se mhz=3 per protare
a zero gli altri valori se è superiore
subwf fgu,0
btfsc STATUS,Z
goto Freq ;se giga=1 non posso incrementare ulteriormente
incf fgu,1 ;se giga vale 1 devo controllare quanto valgono le centinaia per
riportare a 1300 mhz se supero questo valore
movlw 51
subwf fmc,0
btfss STATUS,C
goto Freq
movlw 48
movwf fu
movwf fd
movwf fc
movwf fku
movwf fkd
movwf fkc
movwf fmu
movwf fmd
movlw 51
movwf fmc
goto Freq

;decremento dei valori in relazione alla posizione del cursore


;UNITA'
p12d
movlw 48 ;pongo 48 decimale in w ovvero 0 in ascii
subwf fu,0 ;sottraggo fu in quanto la posizione dodici corrisponde a frequenza
-21-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
unità
btfsc STATUS,Z ;verifico che fu non valga zero ascii
goto p12y ;se vale zero passo a p12y per riportarlo a nove
decf fu,1 ;se fu non vale 0 posso incrmentarlo
goto Freq ;e così via per tutte le posizioni

p12y
movlw 57 ;pongo 57 ascii in w ovvero 9
movwf fu ;pongo w ovvero 0 (48 ascii) in fu per riazzerarlo
goto p11d ;vado alla cifra immediatamente piu' alta per decrementarla

;DECINE
p11d
movlw 48
subwf fd,0
btfsc STATUS,Z
goto p11y
decf fd,1
goto Freq

p11y
movlw 57
movwf fd
goto p10d

;CENTINAIA
p10d
movlw 48
subwf fc,0
btfsc STATUS,Z
goto p10y
decf fc,1
goto Freq

p10y
movlw 57
movwf fc
goto p8d

;KILO UNITA'
p8d
movlw 48
subwf fku,0
btfsc STATUS,Z
goto p8y
decf fku,1
goto Freq

p8y
movlw 57
movwf fku
goto p7d

;KILO DECINE
p7d
movlw 48
subwf fkd,0
btfsc STATUS,Z
goto p7y
decf fkd,1
goto Freq

p7y
movlw 57
movwf fkd
goto p6d

;KILO CENTINAIA
p6d
movlw 48
subwf fkc,0
-22-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
btfsc STATUS,Z
goto p6y
decf fkc,1
goto Freq

p6y
movlw 57
movwf fkc
goto p4d

;MEGA UNITA'
p4d
movlw 48
subwf fmu,0
btfsc STATUS,Z
goto p4y
decf fmu,1
goto Freq

p4y
movlw 57
movwf fmu
goto p3d

;MEGA DECINE
p3d
movlw 48
subwf fmd,0
btfsc STATUS,Z
goto p3y
decf fmd,1
goto Freq

p3y
movlw 57
movwf fmd
goto p2d

;MEGA CENTINAIA
p2d
movlw 48
subwf fmc,0
btfsc STATUS,Z
goto p2y
decf fmc,1

goto Freq

p2y
movlw 57
movwf fmc
goto p0d

;GIGA UNITA'
p0d
movlw 48
subwf fgu,0
btfss STATUS,Z
decf fgu,1
goto Freq

;*********************************************************************************************
************************
;SPOSTAMENTO DEL CURSORE DELLA FREQUENZA
;*********************************************************************************************
************************
;ci troviamo qui se viene premuto il tasto di spostamento del cursore a dx
fcur
call pollvol
movlw 250
-23-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
movwf time1
call canc ;azzero la varaibile temp per ritardo ritorno alla
visualizzazione normale
movlw 3 ;pongo 3 in w
movwf pmod ;pongo w ovvero 3 in pmod (ci portiamo nella modalità frequenza
come se avessimo premuto il tasto funzione per portarci in modo frequenza)
btfsc cursore,0 ;se il tasto è pigiato per la prima volta dopo la
visualizzazione principale vado a vpos
goto vpos

movlw 12 ;pongo 12 in w (limite dx)


subwf curpos,0 ;sottraggo curpos
btfsc STATUS,Z ;verifico se curpos vale 12 (cioè se sono tutto a dx)
call curr ;se sono tutto a dx chiamo curr ovvero porto il curpos a -1 (che
verrà poi incrementato per cui andrà in 0)
incf curpos,1 ;incremento curpos, se ero in posizione dodici torno in
posizione 0
;ora verifico di non essere nelle posizioni 1,5 e 9 dove sono
presenti i punti
movlw 1 ;pongo 1 in w (primo punto)
call rty ;chiamo rty per incrementare una posizione
movlw 5 ;pongo 5 in w (secondo punto)
call rty ;chiamo rty per incrementare una posizione
movlw 9 ;pongo 9 in w (terzo punto)
call rty ;chiamo rty per incrementare una posizione
goto fre ;stabilita la nuova posizione del cursore vado a fre per
visualizzare il cursore vero e poprio

;routine che riporta il cursore tutto a sx (0) se ero al limite dx (12)


curr
movlw -1 ;pongo -1 in w
movwf curpos ;pongo w ovvero -1 in curpos (poi incrementato a 0)
return

vpos
bcf cursore,0 ;azzero il bit che mi dice che passo di qui la prima volta e
visulazizzo in fre
goto fre

;routine che effettua il salto di una posizione quando c'e' il punto (1,5,9)
rty
subwf curpos,0 ;sottraggo da w curpos
btfsc STATUS, Z ;verifico se curpos ha uno dei valori 1, 5 o 9 come posto in w
alla chiamata della routine
incf curpos,1 ;se curpos vale 1,5 o 9 dove sono presenti punti incremento
curpos di 1
return

;ci troviamo qui se viene premuto il tasto di spostamento del cursore a sx


fcurs
call pollvol
movlw 250
movwf time1
call canc ;azzero la varaibile temp per ritardo ritorno alla
visualizzazione normale
movlw 3 ;pongo 3 in w
movwf pmod ;pongo w ovvero 3 in pmod (ci portiamo nella modalità frequenza
come se avessimo premuto il tasto funzione per portarci in modo frequenza)
btfsc cursore,0 ;se il tasto è pigiato per la prima volta dopo la
visualizzazione principale vado a vpos
goto vpos
movlw 0 ;pongo 0 in w (limite dx)
subwf curpos,0 ;sottraggo curpos
btfsc STATUS,Z ;verifico se curpos vale 0 (cioè se sono tutto a sx)
call curr2 ;se sono tutto a sx chiamo curr2 ovvero porto il curpos a 13
(che verrà poi decrementato per cui andrà in 12)
;ora verifico di non essere nella posizione -1 (avviene se dal
menu principale premo tasto cursore sx)
movlw -1 ;pongo in w -1
subwf curpos,0 ;sottraggo curpos
btfsc STATUS,Z ;verifico se curpos vale -1
-24-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
call curr3 ;se è così chiamo curr3 che riporta curpos a 1 (che verrà poi
decrementato per cui andrà a 0)
decf curpos,1 ;decremento curpos
;ora verifico di non essere nelle posizioni 1,5 e 9 dove sono
presenti i punti
movlw 1 ;pongo 1 in w (primo punto)
call rty2 ;chiamo rty2 per incrementare una posizione
movlw 5 ;pongo 5 in w (secondo punto)
call rty2 ;chiamo rty2 per incrementare una posizione
movlw 9 ;pongo 9 in w (terzo punto)
call rty2 ;chiamo rty2 per incrementare una posizione
goto fre ;stabilita la nuova posizione del cursore vado a fre per
visualizzare il cursore vero e poprio
return

;routine che effettua il salto all'indietro di una posizione quando c'e' il punto (1,5,9)
rty2
subwf curpos,0 ;sottraggo da w curpos
btfsc STATUS, Z ;verifico se curpos ha uno dei valori 1, 5 o 9 come posto in w
alla chiamata della routine
decf curpos,1 ;se curpos vale 1,5 o 9 dove sono presenti punti decremento
curpos di 1
return

;routine che riporta il cursore tutto a dx (12) se ero al limite sx (0)


curr2
movlw 13 ;pongo 13 in w
movwf curpos ;pongo w ovvero 13 in curpos (poi decrementato a 12)
return

;routine che riporta il cursore alla posizione 0 se ci troviamo in -1


curr3
movlw 1 ;pongo 1 in w
movwf curpos ;pongo w ovvero 1 in curpos (poi decrementato a 0)
return

;*********************************************************************************************
********************************************
;VISUALIZZAZIONE DEL VALORE DELLA FREQUENZA SUL DISPLAY
;*********************************************************************************************
***************************
Freq
call invio ;invio i comandi alla radio con la nuova frequenza da
sintonizzare
movlw 0x10 ;pongo 10 in w
call LcdLocate ;posiziono il cursore in 10 esadecimale = seconda linea
movf fgu,0 ;pongo le unità di giga in w
call LcdSendData ;visualizzo il valore sul display
call carv ;visualizzo il carattere punto con la funzione carv
movf fmc,0 ;pongo le centinaia di mega in w
call LcdSendData ;visualizzo il valore sul display
movf fmd,0 ;e cosi via
call LcdSendData
movf fmu,0
call LcdSendData
call carv
movf fkc,0
call LcdSendData
movf fkd,0
call LcdSendData
movf fku,0
call LcdSendData
call carv
movf fc,0
call LcdSendData
movf fd,0
-25-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
call LcdSendData
movf fu,0
call LcdSendData
call blank ;visualizzo uno spazio con funzione blank
movlw 'H' ;visualizzo Hz sul display
call LcdSendData
movlw 'z'
call LcdSendData
call Delay ;richiamo il ritardo delay
goto poll ;ritorno al polling dei tasti funzione

;routine che posiziona il cursore a sx quando si preme il tasto funzione e si arriva in


modalità frequenza prima di visualizzare i valori
fre2
clrf curpos ;cancello il valore di curpos
goto fre ;va a fre per visualizzare il cursore vero e proprio e la
sua posizione

;*********************************************************************************************
********************************************
;ROUTINE DI GESTIONE DEL TASTO FUNZIONE MODE
;*********************************************************************************************
***************************
;ci troviamo qui quando viene pigiato il tasto funzione mode
mode
call pollvol
movlw 250
movwf time1
call canc ;azzero la varaibile temp per ritardo ritorno alla visualizzazione
normale
incf pmod,1 ;incremento pmod (modo selzionato con tasto mode)

; ora devo controllare quante volte ho pigiato il tasto ed eseguire una visualizzazione
diversa nei vari casi
a0 movlw 1 ;pongo 1 in w
subwf pmod,0 ;sottraggo pmod
btfsc STATUS,Z ;verifico se pmod vale 1 ovvero mode volume
goto volume ;se vale 1 vado alla routine per la visualizzazione temporanea del
volume

movlw 2 ;pongo 2 in w
subwf pmod,0 ;sottraggo pmod
btfsc STATUS,Z ;verifico se pmod vale 2 ovvero mode squelch
goto sque ;se vale 2 vado alla routine per la visualizzazione temporanea
dello squelch

movlw 3 ;pongo 3 in w
subwf pmod,0 ;sottraggo pmod
btfsc STATUS,Z ;verifico se pmod vale 3 ovvero mode frequenza
goto fre ;se vale 3 vado alla routine per l'azzeramento della posizione del
cursore (curpos) e poi alla visualizzazione temporanea del cursore della frequenza

movlw 4 ;pongo 4 in w
subwf pmod,0 ;sottraggo pmod
btfsc STATUS,Z ;verifico se pmod vale 4 ovvero mode modo della radio
goto modo ;se vale 4 vado alla routine per la visualizzazione temporanea del
modo della radio

movlw 5 ;pongo 5 in w
subwf pmod,0 ;sottraggo pmod
btfsc STATUS,Z ;verifico se pmod vale 5 ovvero mode bandwidth
goto bandwidth ;se vale 5 vado alla routine per la visualizzazione temporanea
della largezza di banda

movlw 6 ;pongo 6 in w (limite max = 5)


subwf pmod,0 ;sottraggo pmod
btfsc STATUS,Z ;verifico se pmod vale 6 ovvero oltre i nostri casi lo riporto a zero
goto azzera ;se vale 6 vado a azzera per riportare a 1 pmod
call canc
-26-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
goto poll ;ritorno al polling dei tasti funzione se nessuno dei casi di cui
sopra è verificato

;routine per azzerare pmod al termine del ciclo dei modi


azzera
movlw 1 ;pongo 1 in w
movwf pmod ;pongo w ovvero 1 in pmdo
call Delay ;chiama la routine di ritardo
goto a0 ;ritorno all'inizio dei controlli per verificare ancora pmod

;*********************************************************************************************
********************************************
;ROUTINE DI VISUALIZZAZIONE MOMENTANEA DEL VOLUME SUL DISPLAY
;*********************************************************************************************
***************************

volume
call loc0 ;chiama loc0 per posizionare il cursore sul display al punto 0
movlw 'V' ;Scrive sul display Volume,spazio,vol decine,vol unità
call LcdSendData
movlw 'o'
call LcdSendData
movlw 'l'
call LcdSendData
movlw 'u'
call LcdSendData
movlw 'm'
call LcdSendData
movlw 'e'
call LcdSendData
call blank
movf vold,0
call LcdSendData
movf volu,0
call LcdSendData
movlw 8 ;pone 8 in w
call sblank ;chiama la routine che effettua tanti spazi quanto vale w=8
call Delay ;chiama la routine di ritardo
call canc
goto poll ;torna al polling dei tasti funzione

;*********************************************************************************************
********************************************
;ROUTINE DI VISUALIZZAZIONE MOMENTANEA DELLO SQUELCH SUL DISPLAY
;*********************************************************************************************
***************************
sque
call loc0 ;chiama loc0 per posizionare il cursore sul display al punto 0
movlw 'S' ;Scrive sul display Squelch,spazio,squelch decine,squelch
unità
call LcdSendData
movlw 'q'
call LcdSendData
movlw 'u'
call LcdSendData
movlw 'e'
call LcdSendData
movlw 'l'
call LcdSendData
movlw 'c'
call LcdSendData
movlw 'h'
call LcdSendData
call blank
movf sqd,0
call LcdSendData
movf squ,0
call LcdSendData
movlw 7 ;pone 7 in w
-27-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
call sblank ;chiama la routine che effettua tanti spazi quanto vale w =7
call Delay ;chiama la routine di ritardo
call canc
goto poll ;torna al polling dei tasti funzione

;*********************************************************************************************
********************************************
;ROUTINE DI VISUALIZZAZIONE TEMPORANEA DEL CURSORE DELLA FREQUENZA SUL DISPLAY
;*********************************************************************************************
***************************
fre
call loc0 ;chiama loc0 per posizionare il cursore sul display al punto 0
movlw 17 ;pone 17 in w
call sblank ;chiama la routine che effettua tanti spazi quanto vale w=17
movf curpos,0 ;mette curpos (posizione del cursore) in w
call LcdLocate ;chiama la routine di posizionamento del display in curpos
movlw 118 ;pone 118 in w ovvero v in ascii (simbolo per il cursore
della frequenza)
call LcdSendData ;invia 118 ascii al display
call Delay ;chiama la funzione di ritardo
call canc
goto poll ;ritorna al polling dei tasti funzione

;*********************************************************************************************
********************************************
;ROUTINE DI VISUALIZZAZIONE TEMPORANEA DEL MODO DELLA RADIO SUL DISPLAY
;*********************************************************************************************
***************************
modo
call loc0 ;chiama loc0 per posizionare il cursore sul display al punto 0
call carM ;chiama la routine carM che srive sul display il carattere M
movlw 'o' ;scrive ode, spazio, ffrr (i vari casi letterali del modo
usb, fm ecc)
call LcdSendData
movlw 'd'
call LcdSendData
movlw 'e'
call LcdSendData
call blank
call ffrr ;chiama la routine ffrr che associa rmod alla stringa da
visualizzare sul display (LSB, Fm ecc)
movlw 9 ;pone 9 in w
call sblank ;chiama la routine che effettua tanti spazi quanto vale w=9
call Delay ;chiama la funzione di ritrardo
call invio ;chiama la funzione invio per inviare alla radio le
eventuali modifiche di modo
goto poll ;ritorna al polling dei tasti funzione

;routine per associare i casi rmod alla routine giusta per la visualizzazione del modo della
radio sul display (USB, FM ecc), il valore 4 non esiste
ffrr
movlw 0 ;pone 0 in w
subwf rmod,0 ;sottrae rmod
btfsc STATUS, Z ;verifica che rmod valga 0
call lsb ;se rmod vale 0 chiamo la funzione lsb che visualizza lsb
sul display
movlw 1 ;e così via
subwf rmod,0
btfsc STATUS, Z
call usb ;se rmod vale 1 chiamo la funzione usb che visualizza usb
sul display
movlw 2
subwf rmod,0
btfsc STATUS, Z
call am ;se rmod vale 2 chiamo la funzione am che visualizza am sul
display
movlw 3
subwf rmod,0
btfsc STATUS, Z
-28-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
call cw ;se rmod vale 3 chiamo la funzione cw che visualizza cw sul
display
movlw 5
subwf rmod,0
btfsc STATUS, Z
call fm1 ;se rmod vale 5 chiamo la funzione fm1 che visualizza fm sul
display (narrow banda stetta)
movlw 6
subwf rmod,0
btfsc STATUS, Z
call fm2 ;se rmod vale 6 chiamo la funzione fm2 che visualizza wfm
sul display (wide banda larga)
return

;routines che visualizzano sul display la stringa corrispondente al modo della radio rmod e
convertono il valore in ascii per la trasmissione alla radio
;LSB
lsb
movlw '0' ;pone 0 ascii in w
movwf rmodp ;pone w ovvero 0 ascii in rmodp da trasmettere alla radio
durante routine invio
movlw 'L' ;scrive sul display LSB
call LcdSendData
movlw 'S'
call LcdSendData
call carB ;funzione per scrittura sul display del carattere B
return ;e così via per tutti i modi

;USB
usb
movlw '1' ;pone 1 ascii in rmodp per invio radio e scrittura USB sul
display
movwf rmodp
movlw 'U'
call LcdSendData
movlw 'S'
call LcdSendData
call carB
return

;AM
am
movlw '2' ;pone 2 ascii in rmodp per invio radio e scrittura AM + spazio
sul display
movwf rmodp
movlw 'A'
call LcdSendData
call carM
call blank
return

;CW
cw
movlw '3' ;pone 3 ascii in rmodp per invio radio e scrittura CW + spazio
sul display
movwf rmodp
movlw 'C'
call LcdSendData
movlw 'W'
call LcdSendData
call blank
return

;FM
fm1
movlw '5' ;pone 5 ascii in rmodp per invio radio e scrittura FM + spazio
sul display
movwf rmodp
movlw 'F'
call LcdSendData
call carM
-29-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
call blank
return

;WFM
fm2
movlw '6' ;pone 6 ascii in rmodp per invio radio e scrittura WFM sul display
movwf rmodp
movlw 'W'
call LcdSendData
movlw 'F'
call LcdSendData
call carM
return

;*********************************************************************************************
********************************************
;ROUTINE DI VISUALIZZAZIONE TEMPORANEA DELLA LARGHEZZA DI BANDA DELLA RADIO SUL DISPLAY
;*********************************************************************************************
***************************
bandwidth
call loc0 ;chiama loc0 per posizionare il cursore sul display al punto 0
call carB ;chiama la routine carB che srive sul display il carattere B
movlw 'a' ;scrive ANDWIDTH, spazio, ffrr (i vari casi letterali del modo
usb, fm ecc) + spazio
call LcdSendData
movlw 'n'
call LcdSendData
movlw 'd'
call LcdSendData
movlw 'w'
call LcdSendData
movlw 'i'
call LcdSendData
movlw 'd'
call LcdSendData
movlw 't'
call LcdSendData
movlw 'h'
call LcdSendData
call blank
call bbww ;chiama la routine bbww che associa rband alla stringa da
visualizzare sul display (3, 5 ecc)
call khz ;chiam la routine khz che scrive khz sul display dopo il valore
call Delay ;chiama la funzione di ritardo
call invio ;chiama la funzione invio per inviare alla radio le eventuali
modifiche di modo
call canc
goto poll ;ritorna al polling dei tasti funzione

;routine per associare i casi rband alla routine giusta per la visualizzazione della largh
di banda della radio sul display (3,5,ecc)
bbww
movlw 0 ;pone 0 in w
subwf rband,0 ;sottrae rband
btfsc STATUS, Z ;verifica che rband valga 0
call k3 ;se rband vale 0 chiamo la funzione k3 che visualizza 3 sul
display
movlw 1 ;e così via
subwf rband,0
btfsc STATUS, Z
call k6 ;se rband vale 1 chiamo la funzione k6 che visualizza 6 sul
display
movlw 2
subwf rband,0
btfsc STATUS, Z
call k15 ;se rband vale 2 chiamo la funzione k15 che visualizza 15 sul
display
movlw 3
subwf rband,0
btfsc STATUS, Z
-30-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
call k50 ;se rband vale 3 chiamo la funzione k50 che visualizza 50 sul
display
movlw 4
subwf rband,0
btfsc STATUS, Z
call k230 ;se rband vale 4 chiamo la funzione k230 che visualizza 230 sul
display
return

;routine che visualizza la scritta kHz sul display


khz movlw 'k' ;scrive KHz sul display
call LcdSendData
movlw 'H'
call LcdSendData
movlw 'z'
call LcdSendData
return

;routines che visualizzano sul display la stringa corrispondente alla largh di banda della
radio rband e convertono il valore in ascii per la trasmissione alla radio
;3
k3
call blank ;scrive spazio sul display
call blank ;scrive spazio sul display
movlw '0' ;pone 0 ascii in w
movwf rbandp ;pone w ovvero 0 ascii in rbandp da trasmettere alla radio durante
routine invio
movlw '3' ;pone 3 ascii in w
call LcdSendData ;scrive sul display 3
return

;6
k6
call blank ;pone 1 ascii in rband per invio radio e scrittura 6 sul display
call blank
movlw '1'
movwf rbandp
movlw '6'
call LcdSendData
return

;15
k15
call blank ;pone 2 ascii in rband per invio radio e scrittura 15 sul
display
movlw '2'
movwf rbandp
movlw '1'
call LcdSendData
movlw '5'
call LcdSendData
return

;50
k50
call blank ;pone 3 ascii in rband per invio radio e scrittura 50 sul display
movlw '3'
movwf rbandp
movlw '5'
call LcdSendData
call car0
return

;230
k230
movlw '4' ;pone 4 ascii in rband per invio radio e scrittura 230 sul display
movwf rbandp
movlw '2'
call LcdSendData
movlw '3'
-31-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
call LcdSendData
call car0
return

;*********************************************************************************************
********************************************
;ROUTINE DI RITARDO LUNGO, vengono effettuati 200 cicli per 256 ovvero 51200 cicli . VALORE
CHE PASSA SULL'AVANZAMENTO DEI VALORI
;*********************************************************************************************
***************************
Delay
clrf count2 ;svuota la varaibile count2
clrf count2+1 ;svuota la variabile allocata in count +1 allocazione

;routine ricorsiva interna a delay


DelayLoop ;routine ricorsiva interna a delay
;questa parte viene eseguita tante volte quanto scritto sotto in w=200 ogni
volta che nella parte sotto si efettua un decremento
decfsz count2,1 ;decrementa count 2 e verifica che non sia uguale a 0 se è
uguale a 0 salta l'istruzione sucessiva
goto DelayLoop ;se count 2 è diverso da 0 richiama delayloop
;questa parte viene eseguita 256 volte in quanto count2+1 passa la prima volta da 0
a 255 per cui deve ritornare a 0, ogni volta viene eseguita anche
;la routine sopra per 200 volte
movf time1,0 ;pone 200 in w per cui deve passare nel decremento 200
volte
movwf count2 ;pone 200 in count 2
decfsz count2+1,1 ;decrementa count 2+1 e verifica che non sia uguale a 0 se è
uguale a 0 salta l'istruzione sucessiva
;al primo decremento count2+1 diventa 255 per cui deve
tornare a zero ovvero deve passare di qui 256 volte
goto DelayLoop ;se count 2+1 è diverso da 0 richiama delayloop
return

;*********************************************************************************************
********************************************
;ROUTINE DI RITARDO PER LCD, il valore contenuto in w corrisponde al numero di mS di ritardo
desiderati con quarzo=4 MHz
;*********************************************************************************************
***************************
msDelay
movwf msDelayCounter+1 ;pone il valore di w assegnato prima di chiamare la
funzione in msDelaycounter+1
clrf msDelayCounter+0 ;svuota msdelaycounter

msDelayLoop
;routine per loop di durata circa 1 mS*************
nop ;nessuna operazione che comporta comunque un ciclo
macchina a vuoto
decfsz msDelayCounter+0,F ;decrementa msdelaycountr e lo pone in f verificando
che non sia uguale a 0
goto msDelayLoop ;se è msdelaycounter è diverso da 0 richiama
msdelay loop (questo comporta 255 cicli visto che inizialmente da 0 viene
decremetnata la varaibile a 255
nop ;nessuna operazione che comporta comunque un ciclo
macchina a vuoto
;**************************************************
decfsz msDelayCounter+1,F ;in base al valore messo inzialmente in w e poi in
msdelaycounter+1 viene decrementato il valore fino a zero, per ogni decremento
effettua la routine di durata 1 mS
goto msDelayLoop ;se msdelaycounter+1 è diverso da 0 richiama il
ciclo di durata 1 mS
return

;*********************************************************************************************
-32-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
********************************************
;ROUTINE DI RITARDO PER TX seriale durata 1200 us con quarzo a 4 MHz e prescaler a 1:8 - PER
TRASMISSIONE SERIALE A 9600 bps
;*********************************************************************************************
***************************
TXDelay
movlw 106 ;pongo 106 in w
movwf TMR0 ;pongo w ovvero 106 nel registro TMR0 (256-106=150 volte)
movf TMR0,W ;metto il valore corrnte di TMR0 in w visto che questo valore varierà
btfss STATUS,Z ;verifico che TMR0 valga 0
goto $-2 ;Se non vale 0 ritorno 2 linee indietro ficnchè non vale 0
return ;

;*********************************************************************************************
**********************************
; Inizializzazione del display LCD
; Da richiamare prima della gestione lcd come previsto dallo standard HD44780
;*********************************************************************************************
**********************************
es EN_STROBE ;richiama la macro en_strobe per abilare il display
ad accettare dati sul bus dati
movlw 2 ;pone 2 in w
call msDelay ;effettua un ritardo di w mS ovvero 2 mS
return

LcdInit
bcf PORTB,LCD_E ;Disabilita l'LCD resettando l'enable
bcf PORTB,LCD_RS ;Mette l'LCD in modo comando (registyer selcted
0=istruzione da eseguire 1=dato da interpretare)
movlw 250 ;mette 250 in w
call msDelay ;chiama ritardo da 250 mS per 4 volte per 1 secondo
circa di ritardo
call msDelay
call msDelay
call msDelay

; Invia all'LCD la sequenza di reset


bsf PORTC,LCD_RC2 ;mette a 1 tutte le linee del bus di dati
bsf PORTC,LCD_RC3
bcf PORTC,LCD_RC0
bcf PORTC,LCD_RC1
call es ;chiama la sequenza enable strobe di cui sopra per
tre volte
call es
call es
bcf PORTC,LCD_RC2 ;mette a 0 tutte le linee del bus di dati
bsf PORTC,LCD_RC3
bcf PORTC,LCD_RC0
bcf PORTC,LCD_RC1
call es ;chiama la sequenza enable strobe di cui sopra per
abilitare il display a ricever i dati

;Imposta il bus dati a 4 linee, il nuemro di linee del display e il font del carattere
movlw 0x28 ;mette 28 esa ovvero 40 in w =101000 in binario
call LcdSendCommand ;invia l'istruzione 40 per configurare il bus dati
come sopra indicato

;configura la direzione del cursore verso dx e il non scorrimento del testo


movlw 0x06 ;mette 6 in w =1-10 in binario
call LcdSendCommand ;invia l'istruzione di cui sopra - abilita
l'impostazione direzione di movimento del cursore verso dx e il no shift (se
al posto di 0 fosse 1 il testo scorrerebbe)

;display acceso, cursore spento e senza lampeggio


movlw 0x0C ;mette 0c in esa ovvero 12 =1100 in binario
call LcdSendCommand ;invia l'istruzione di cui sopra ovvero display on,
cursore spento e lampeggio cursore assente

;cancella il display e porta il cursore all posizione 0


-33-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
movlw 0x01 ;mette 1 in w
call LcdSendCommand ;invia l'istruzione di cancellazione del display e
posizionamento del cursore in 0
return

;*********************************************************************************************
**********************************
; Svuota il Display LCD
;*********************************************************************************************
**********************************
LcdClear
movlw 0x01 ;mette 1 in w
call LcdSendCommand ;invia l'istruzione di cancellazione del display e
posizionamento del cursore in 0
movlw 2 ;pone 2 in w
call msDelay ;richiama ritardo per 2 mS di ritardo

;imposta l'indirizzo della DD RAM che contiene la memeria dati del display
movlw 0x80 ;mette 80 in esa in w ovvero 128 =10000000 in binario
call LcdSendCommand ;invia il valore w =128
return

;*********************************************************************************************
**********************************
; Posizionamento del cusore sul LCD; (4 bit meno siginificativi sono le colonne (da 0-15), i
piu' significativi le righe (da 0 a 1 in questo caso 2 righe sole)
;prima linea da 0 a hF, (lo standard hd44780 gestisce fino a 40 caratteri per linea da 0 a
h27 anche se non tutti possono essere visualizzati
;seconda linea da h40 a h4F (anche se si possono allocare da h40 a h67) per fare cio' devo
settare il bit 6 dell'istruzione (ddram)
;*********************************************************************************************
**********************************
LcdLocate
movwf tmpLcdRegister+0 ;mette il valore di w assegnato prima di
chiamare la routine in tmplcdregister
movlw 0x80 ;mette 80 in esadecimale ovvero 128 in in w (80
è l'istruzione per ddram register bit 7 =1)
movwf tmpLcdRegister+1 ;mette 128 in tmplcdregister+1 (è un appoggio)
movf tmpLcdRegister+0,W ;mette il valore di tmplcdregister in w
andlw 0x0F ;effettua l'and di w(tmplcdregister) con f in
esa ovvero 15 =1111 in w ovvero tengo solo i 4 bit meno significativi e
metto in w
;i 4 bit meno significativi contengono la
colonna del posizionamento
iorwf tmpLcdRegister+1,F ;effettuo l'or inclusivo (ANCHE OR è sarebbe OK)
tra tmplcdregister+1 e w mettendo il risultato in tmplcdregister+1
;il risultato è l'istruzione 128 (bit 7 a 1) per
dire che settiamo ddram cioe' la posizione del
cursore
btfsc tmpLcdRegister+0,4 ;verifico sul valore iniziale se il bit 4 di
tmplcdregiater=1 (seconda riga), se si eseguo l'istruzione successiva
alrimenti vado oltre
bsf tmpLcdRegister+1,6 ;se il bit 4 di cui sopra =1 (voglio scrivere
sulla seconda riga) setto il bit 6 di tmplcdregister+1 che corrisponde ad
h40 per la seconda riga
movf tmpLcdRegister+1,W ;mette il valore risultante tmplcdregister+1 in
w per eseguire l'istruzione necessaria al posizionaento corretto
call LcdSendCommand ;invia comando al lcd del valore contenuto in w
per il posizionamento corretto del cursore
return
;il valore inviato sarà sempre 1x00xxx
;istruzione DDRAM address bit piu' significativo
a 1
;prima x= 1 se seconda linea (h40) e 0 per prima
linea
;due bit successivi sempre a 0
;ultime quattro x per la colonna su cui
posizionarsi
;il tutto in BASE AL VALORE CONTENUTO IN W ALLA
CHAIMATA DELLA FUNZIONE 000ZXXXX (Z=1 SE RIGA 2
-34-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
ALTRIMENTI=0, XXXX VALORE DELLA COLONNA)

;*********************************************************************************************
**********************************
; Invia i dati all'LCD dopo aver settato il register selct
;*********************************************************************************************
**********************************
LcdSendData
bsf PORTB,LCD_RS ;setta il bit LCD_RS (register select=1 per dire
all'LCD che si tratta di un dato da interpretare e non istruzione)
call LcdSendByte ;chiama la funzione lcdsendbyte per trasmettere
il byte all'LCD con il valore assegnato a w in ascii che corrisponde al
carattere da visualzizzare
return

;*********************************************************************************************
**********************************
; Invia comandi all'LCD ovvero istruzioni dopo aver resettato il register selct
;*********************************************************************************************
**********************************
LcdSendCommand
bcf PORTB,LCD_RS ;resett il bi LCD_RE (register selct=0 per dire
all'lcd che si tratta di una istruzione e non un dato)
call LcdSendByte ;chiama la funzione lcdsendbyteper trasmettere
il byte all'lCD
return

;*********************************************************************************************
**********************************
; Invia un carattere all'LCD sul bus a 4 bit (prima i 4 piu' significativi e dopo i 4 meno
siginificativi)
;*********************************************************************************************
**********************************
LcdSendByte
movwf tmpLcdRegister ;pone il contenuto di w assegnato prima di
chiamare la routine in w che corrispone al valore ascii del carattere da
scrivere

;Invia i quattro bit piu' significativi di tmplcdregister (lcd sa che prima vengono inviati
i 4 byte piu' siginificativi e in seguito gli altri di ogni carattere)
bcf PORTC,LCD_RC2 ;pone a 0 le 4 linee verso il display
bcf PORTC,LCD_RC3
bcf PORTC,LCD_RC0
bcf PORTC,LCD_RC1
btfsc tmpLcdRegister,4 ;verfica se tmplcdregister bit 4 vale 1 se si
esegue la riga sucessiva altrimenti la salta
bsf PORTC,LCD_RC2 ;se bit 4=1 pone a 1 la linea rc2 verso il display
btfsc tmpLcdRegister,5 ;verfica se tmplcdregister bit 5 vale 1 se si
esegue la riga sucessiva altrimenti la salta
bsf PORTC,LCD_RC3 ;se bit 5=1 pone a 1 la linea rc3 verso il display
btfsc tmpLcdRegister,6 ;verfica se tmplcdregister bit 6 vale 1 se si
esegue la riga sucessiva altrimenti la salta
bsf PORTC,LCD_RC0 ;se bit 6=1 pone a 1 la linea rc0 verso il display
btfsc tmpLcdRegister,7 ;verfica se tmplcdregister bit 7 vale 1 se si
esegue la riga sucessiva altrimenti la salta
bsf PORTC,LCD_RC1 ;se bit 7=1 pone a 1 la linea rc1 verso il display
call es ;chiama la sequenza enable strobe di cui sopra
per istruire il display ad abilitare i dati in arrivo

;Invia i quattro bit meno significativi di tmplcdregister (lcd sa che dopo vengono inviati i
4 byte meno siginificativi , prima gli altri di ogni carattere)
bcf PORTC,LCD_RC2 ;pone a 0 le 4 linee verso il display
bcf PORTC,LCD_RC3
bcf PORTC,LCD_RC0
bcf PORTC,LCD_RC1
btfsc tmpLcdRegister,0 ;verfica se tmplcdregister bit 0 vale 1 se si
esegue la riga sucessiva altrimenti la salta
bsf PORTC,LCD_RC2 ;se bit 0=1 pone a 1 la linea rc2 verso il display
btfsc tmpLcdRegister,1 ;verfica se tmplcdregister bit 1 vale 1 se si
esegue la riga sucessiva altrimenti la salta
-35-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
bsf PORTC,LCD_RC3 ;se bit 1=1 pone a 1 la linea rc3 verso il display
btfsc tmpLcdRegister,2 ;verfica se tmplcdregister bit 2 vale 1 se si
esegue la riga sucessiva altrimenti la salta
bsf PORTC,LCD_RC0 ;se bit 2=1 pone a 1 la linea rc0 verso il display
btfsc tmpLcdRegister,3 ;verfica se tmplcdregister bit 3 vale 1 se si
esegue la riga sucessiva altrimenti la salta
bsf PORTC,LCD_RC1 ;se bit 3=1 pone a 1 la linea rc1 verso il display
call es ;chiama la sequenza enable strobe di cui sopra
per istruire il display ad abilitare i dati in arrivo
return

;*********************************************************************************************
**********************************
; Caratteri e azioni maggiormente inviati all'LCD ragruppati e richiamati al caso onde
risparmiare spazio necessario sul ex 16F84A
;*********************************************************************************************
**********************************
;spazio singolo
blank movlw ' ' ;mette spazio in asci in w
call LcdSendData ;invia spazio all'LCD
return

;spazio ricorsivo
sblank
movwf spa ;carica w in spa
sbl
decfsz spa,1 ;decrementa spa e verifica se vale 0
goto spazio ;se spazio è diverso da va alla routine per scriver
uno spazio sull'lcd
return

spazio
movlw ' ' ;mette spazio in asci in w
call LcdSendData ;invia spazio all'LCD
goto sbl

;zero
car0
movlw '0' ;mette 0 in asci in w
call LcdSendData ;invia 0 all'LCD
return

;virgola
carv
movlw '.' ;mette virgola in asci in w
call LcdSendData ;invia virgola all'LCD
return

;Emme M
carM
movlw 'M' ;mette M in asci in w
call LcdSendData ;invia M all'LCD

return

;Bi B
carB
movlw 'B' ;mette B in asci in w
call LcdSendData ;invia B all'LCD

return

;posizionamento del cursore in posizione 0 alto a sx


loc0
movlw 0x0 ;mette 0 w
call LcdLocate ;chiama la routine di posizionamento in 0
return

-36-
D:\Ridiculous\Files\pcr1000.asm lunedì 3 febbraio 2020 22:47
;*********************************************************************************************
**********************************
; Routine di azzermento tempo di ritorno alla visualizzazione normale del display richiamata
ogni volta che cambio modo del dispay per riportare il tempo al valore corretto
;*********************************************************************************************
**********************************
canc
clrf temp ;svuoto temp
clrf temp+1 ;svuoto temp+1
return

;*********************************************************************************************
**********************************
; FINE DEL PROGRAMMA
;*********************************************************************************************
**********************************
END

-37-

Potrebbero piacerti anche