;IK1WJQ PROGRAMMA ASSEMBLER Z8, QUARZO 16 MHZ
;FREQLC.ASM Z86E08 T0 = 138 HZ PER LETTURA OGNI SECONDO
;DISPLAY 16 CARATTERI - P27-P24 DATI - P23 ENB - P22 D/C
;T1 DIVISORE PER 100 DI FX = DECINE E UNITA' - P00 USCITA LED
;P31 INGRESSO FX - MASSIMA FREQUENZA 2,7 MHZ (6 CIFRE E 1/2)
;DIVISORE PER 10 IN INGRESSO, LETTURA DIRETTA 10 HZ - 27 MHZ
;NOTA: CON QUARZO DA 18,868 MHZ, MAX FX = 30 MHZ
RT1 EQU 23 ;PER CONTEGGIO RITARDO
RT2 EQU 24
UNI EQU 16 ;7 CIFRE ASCII
DCN EQU 17 ;R9-R15 USO LIBERO
CEN EQU 18
MIG EQU 19
DMI EQU 20
CMI EQU 21
MIL EQU 22
SEC EQU R8 ;138 = 1 SEC. PER T0
ACC EQU R4 ;USO ACCUMULATORE
B EQU R5 ;AUSILIARIO
CT EQU RR6 ;CONTATORE 16 BIT R6 E R7
ORG 0008H ;INT T0 138 HZ
WORD #INT0 ;SALTO IRQ4 = INT0
ORG 000AH ;INT T1
WORD #INT1 ;SALTO IRQ5 = INT1
ORG 000CH
LD P01M,#4 ;P0 USCITA
CLR RP ;R0-R3 PUNTANO P0-P3
CLR R0
LD SPL,#127
LD P3M,#1 ;P3 INGRESSO DIGITALE
LD P2M,#0 ;P2 USCITA
LD PRE0,#11101001B ;PRE0=58 CLOCK INTERNO CONTINUO
LD PRE1,#00000101B ;PRE1=1 CLOCK ESTERNO CONTINUO
LD T0,#250 ;XTAL/8/58/250 = 138 HZ IRQ4
LD T1,#100 ;ING. P31 / 100 = X/100 IRQ5
OR TMR,#0FH ;CARICA E ABILITA T0 E T1
DI ;NO INT
OR IMR,#30H ;ABILITA INT T0 E T1
OR IPR,#3 ;IRQ4 > IRQ5
CLR R6 ;AZZERA CT
CLR R7
CALL LCD ;INIZIALIZZA DISPLAY
CALL RIGA1 ;SELEZIONA RIGA
LD SEC,#138 ;PREPARA SEC
EI ;ATTIVA INT
INI: CALL RIT ;LAMPEGGIO LED
OR R0,#1
CALL RIT
AND R0,#6 ;STAMPA 8 CIFRE F=00.000.000-HZ
LD R9,#20 ;R9 PUNTA DMI
LD R10,#3
CALL RIGA1
LD ACC,#'F' ;F=
CALL SDATO
LD ACC,#'='
CALL SDATO
LD ACC,MIL ;MHZ 00.
CALL SDATO
LD ACC,CMI
CALL SDATO
LD ACC,#'.'
CALL SDATO
LET1: LD ACC,@R9 ;KHZ 000.
CALL SDATO
DEC R9
DJNZ R10,LET1
LD ACC,#'.'
CALL SDATO
LD R9,#17 ;R9 PUNTA DCN
LD R10,#2
LET2: LD ACC,@R9
CALL SDATO
DEC R9
DJNZ R10,LET2
LD ACC,#'0' ;ULTIMA CIFRA = 0
CALL SDATO
LD ACC,#'-' ;-HZ
CALL SDATO
LD ACC,#'H'
CALL SDATO
LD ACC,#'Z'
CALL SDATO
JR INI
INT0: DJNZ SEC,INTR
AND TMR,#F5H ;FERMA T0 E T1
DI ;E INT GENERALE
LD UNI,#48 ;PREPARA 7 CIFRE ASCII
LD DCN,#48
LD CEN,#48
LD MIG,#48
LD DMI,#48
LD CMI,#48
LD MIL,#48
LD ACC,#100 ;CONTROLLO CIFRE BASSE
LD B,T1
SUB ACC,B
JR Z,FINE ;NO CONTEGGIO
CP ACC,#100 ;CONTROLLO A=100
JR NZ,CONT
INCW CT ;CT + 100
JR DEC2
CONT: INC ACC ;AGGIUSTA UNITA'
DECX: DJNZ ACC,DEC1
JR DEC2 ;CONTINUA CIFRE SUCESSIVE
DEC1: INC UNI ;1
CP UNI,#58
JR NZ,DECX
LD UNI,#48
INC DCN ;10
CP DCN,#58
JR NZ,DECX
LD DCN,#48
JR DECX
DEC2: LD ACC,R6 ;CONTROLLO SE CT = 0
OR ACC,R7
JR Z,FINE
INC CEN ;100
CP CEN,#58
JR NZ,DCC
LD CEN,#48
INC MIG ;1.000
CP MIG,#58
JR NZ,DCC
LD MIG,#48
INC DMI ;10.000
CP DMI,#58
JR NZ,DCC
LD DMI,#48
INC CMI ;100.000
CP CMI,#58
JR NZ,DCC
LD CMI,#48
INC MIL ;1.000.000
DCC: DECW CT ;CT - 1
JR DEC2
FINE: OR TMR,#0FH ;ATTIVA T0 E T1
LD SEC,#138 ;PREPARA SEC NUOVA LETTURA
EI
INTR: IRET
INT1: INCW CT ;R7 E R6 CONTATORE 16 BIT
IRET ;TOTALE FMAX = 2,7 MHZ
SCOM: AND ACC,#11110111B ;ENB =0
LD R2,ACC
AND R2,#11111011B ;COMANDO
JR SLCD
SCD: AND ACC,#11110111B ;DATO
LD R2,ACC
OR R2,#4
SLCD: OR R2,#8 ;ENB = 1
CALL RITL ;116 uSEC RIT
AND R2,#11110111B ;ENB = 0
RET
SCMD: PUSH ACC ;SCRITTURA COMANDO
CALL SCOM
POP ACC
SWAP ACC
JR SCOM
SDATO: PUSH ACC ;SCRITTURA DATO
CALL SCD
POP ACC
SWAP ACC
JR SCD
ENB: OR R2,#8 ;ENB = 1
CALL RIT1
XOR R2,#8 ;ENB = 0
RET
LCD: CALL RIT1
AND R2,#0 ;COMANDO LCD
CALL ENB
OR R2,#32 ;4 BIT DATI
CALL ENB
CALL RIT1
LD R2,#128 ;MEM DATI AZZERATA
CALL ENB
AND R2,#0
CALL ENB
AND R2,#0
CALL ENB
LD R2,#192 ;192 ATTIVA CURSORE
CALL ENB
RET
RIGA1: LD ACC,#128 ;COMANDO CURSORE
RIGX: CALL SCMD
RET
RIGA2: LD ACC,#192
JR RIGX
NOCUR: LD ACC,#12 ;VISIBILITA'
JR SCMD ;NO, SI' CURSORE
CURS: LD ACC,#14
JR SCMD
RITL: LD RT1,#18 ;116 uSEC
PAU3: DEC RT1
JR NZ,PAU3
RET
RIT1: LD RT1,#18 ;0,14 SEC
JR PAU
RIT: LD RT1,#50 ;0,38 SEC
PAU: CLR RT2
PAU1: NOP
NOP
DEC RT2
JR NZ,PAU1
PAU2: NOP
NOP
DEC RT2
JR NZ,PAU2
DEC RT1
JR NZ,PAU
RET
END
Vai a pagina1
');
//-->