File "lcdinit.txt"
Full Path: /home/analogde/www/Sources/lcdinit.txt
File size: 8.7 KB
MIME-type: text/plain
Charset: 8 bit
* Utilise un Module LCD 1 X 16
* Utilis en mode 4 bits
* avec initialisation "HARDWARE RESET"
*
* LCD Module 68HC11F1 PORT G
* ---------- ---------------
* 1 - Gnd Gnd
* 2 - +5 +5
* 3 - Vo (PG0 avec OC2 un jour :-)
* LCD Module 68HC11F1 PORT G
* ---------- ---------------
* 4 - RS - 0=instruction Bit 1
* - 1=data
* 5 - R/W! - 0=write, 1=read Bit 2
* 6 - Enable (220 ns mini) Bit 3
* 7 - D0
* 8 - D1
* 9 - D2
* 10 - D3
* 11 - D4 (4 bit path) Bit 4
* 12 - D5 (4 bit path) Bit 5
* 13 - D6 (4 bit path) Bit 6
* 14 - D7 (4 bit path) Bit 7
* Equivalences utilis'es avec un offset $1000
*
PORTA EQU $00
DDRA EQU $01 Port A data direction register
PORTG EQU $02
DDRG EQU $03 Port G data direction register
PORTD EQU $08
DDRD EQU $09 Port D data direction register
PORTE EQU $0A PORT E
CFORC EQU $0B
OC1M EQU $0C
OC1D EQU $0D
TCNT EQU $0E Timer Counter
TIC1 EQU $10 IC1 Timer compare register
TIC2 EQU $12 IC2 Timer compare register
TIC3 EQU $14 IC3 Timer compare register
TOC1 EQU $16 OC1 Timer compare register
TOC2 EQU $18 OC2 Timer compare register
TOC3 EQU $1A OC3 Timer compare register
TOC4 EQU $1C OC4 Timer compare register
TI4_O5 EQU $1E IC4/OC5 Timer compare register
TCTL1 EQU $20 Timer control register 1
TCTL2 EQU $21 Timer control register 2
TMSK1 EQU $22 Timer Mask register 1
TFLG1 EQU $23 Timer Flag register 1
TMSK2 EQU $24 Timer Mask register 2
TFLG2 EQU $25 Timer Flag register 2
PACTL EQU $26 Pulse Accu. control register
PACNT EQU $27 Pulse Accu. counter register
SPCR EQU $28 SPI control register
SPSR EQU $29 SPI status register
SPDR EQU $2A SPI data register
BAUD EQU $2B Baudrate selector
SCCR1 EQU $2C SCI control register 1
SCCR2 EQU $2D SCI control register 2
SCSR EQU $2E SCI status register
SCDR EQU $2F SCI Rx/Tx data register
ADCTL EQU $30 A/D control register
ADR1 EQU $31 A/D result register 1
ADR2 EQU $32 A/D result register 2
ADR3 EQU $33 A/D result register 3
ADR4 EQU $34 A/D result register 4
BPROT EQU $35 Block Protect
OPT2 EQU $38 system configuration options 2 register
OPTION EQU $39 system configuration options register
PPROG EQU $3B EEPROG Prog register
HPRIO EQU $3C High Priority
CONFIG EQU $3F CONFIG register
CSCTL EQU $5D Chip Select control
* Memory configuration equates
*
RAMSTR EQU $0000
RAMEND EQU $03FF
IEESTR EQU $0E00
EEPROM EQU $8000
REGBASE EQU $1000
REGEND EQU $105F
BIOS EQU EEPROM
*** Constants ***
TDRE EQU $80
RDRF EQU $20
CR EQU 13
LF EQU 10
* Variables du programme
*
ORG RAMSTR
lineN RMB 1
DDRAM_add RMB 1
STATMSB RMB 1
LCDSTATUS RMB 1
* Octet d'tat pour l'interuption de RTI
*
RTI_STAT: RMB 1 bit 0: compteur pour mesure sur AN0/AN3
* ou AN4/AN7
* bit 8: flag pour premire acquisition, si 0
* alors c'est la premire fois, sinon 1
* valeur de mesure des convertisseurs AD
*
AN_0: RMB 1
AN_1: RMB 1
AN_2: RMB 1
AN_3: RMB 1
AN_4: RMB 1
AN_5: RMB 1
AN_6: RMB 1
AN_7: RMB 1
*
* variable pour la routine d'interpolation linaire
*
P: RMB 1 valeur fournie par l'ADC
P1: RMB 1 borne mini SCAN_TBL
Val1: RMB 1 valeur mini
P2: RMB 1 borne maxi SCAN_TBL
Val2: RMB 1 valeur maxi
K: RMB 1 coeficient (rapport entre borne et mesure)
Iquot: RMB 2 quotient de la division entire ( droite de la virgule)
Fquot: RMB 2 quotient de la fraction de la division ( gauche de la virgule)
Res1: RMB 2 rsultat de la routine d'valuation
*
* variables diverses
*
Signe: RMB 1 indicateur de signe 0= positif,
* si <>0 alors negatif
Buffer RMB 10 buffer de sorite utilis par plusieurs routines
Counter RMB 1 utilis par la routine: 'decimal'
bcdbuf: RMB 6
Rpm_max: RMB 2 Rgime maxi mesur
Spd_max: RMB 1 Vitesse maxi mesure
Spd_delay: RMB 1 temps avant passage de la vitesse 0
* quand le rgime < Rpm_mini
*** Program code ***
ORG EEPROM
START:
LDS #RAMEND la pile est en $03FF
LDX #REGBASE "X" contien l'add de base des registres.
CLR CSCTL,X disable all chip select
* pas utile si pas excut sur HC11F1
CLR OPT2,X port G normal, port C normal, 4xE disable
BSET OPTION,X $80 Set AD converter ON
LDAA #%00000011 RTI prescaler set to E/2^16
STAA PACTL,X soit 16.384ms @ 16MHz
LDAA #%01000011 Prescaler set to E/16, soit 4us, TOF 262.14ms
STAA TMSK2,X bit 8 1 autorise INT sur Timer Overflow
* bit 7 1 autorise INT sur Real Time Int.
CLR PORTG,X E=0, R/W=0, RS=0
LDAA #$FF port G en sortie
STAA DDRG,X
JSR INIT_LCD initialise le LCD
LDY #mess
JSR TEXTE
*** MAIN LOOP ***
LOOP: BRA LOOP
************************ Subroutines *******************************
INIT_LCD: JSR WAITI attend la fin du HARDWARE reset
LDAA #%00100000
STAA PORTG,X E=0, R/W=0, RS=0
BSET PORTG,X $08 E=1, R/W=0, RS=0
BCLR PORTG,X $08 E=0, R/W=0, RS=0
BSR CHKSTAT8
LDAA #%00101000 mode 4 bits, 2 lignes, caractre 5x8
BSR LCD_CMD
LDAA #%00001110 Display ON, Cursor ON, Blink OFF
BSR LCD_CMD
LDAA #%00000110 Auto Inc, Cur. shift R, no Disp shift
BSR LCD_CMD
JSR LCD_CLEAR
JSR LCD_HOME
RTS
*** ENVOIE D'UNE COMMANDE ***
LCD_CMD: PSHA
ANDA #$F0
STAA PORTG,X E=0, R/W=0, RS=0
BSET PORTG,X $08 E=1, R/W=0, RS=0
BCLR PORTG,X $08 E=0, R/W=0, RS=0
PULA
LSLA
LSLA
LSLA
LSLA
STAA PORTG,X E=0, R/W=0, RS=0
BSET PORTG,X $08 E=1, R/W=0, RS=0
BCLR PORTG,X $08 E=0, R/W=0, RS=0
BSR CHKSTAT4 attend fin de l'tat BUSY
RTS
*** ENVOIE DE DATA ***
WR_DATA: PSHA
ANDA #$F0
ORAA #%00000010
STAA PORTG,X E=0, R/W=0, RS=1
BSET PORTG,X $08 E=1, R/W=0, RS=1
BCLR PORTG,X $08 E=0, R/W=0, RS=1
PULA
LSLA
LSLA
LSLA
LSLA
ORAA #%00000010
STAA PORTG,X E=0, R/W=0, RS=1
BSET PORTG,X $08 E=1, R/W=0, RS=1
BCLR PORTG,X $08 E=0, R/W=0, RS=1
BSR CHKSTAT4
LDAA DDRAM_add utile pour ne pas se proccuper
INCA de la gestion du passage du
STAA DDRAM_add 8me au 9me caractre
CMPA #$58
BLO WR_DATA1
CLRA
BRA WR_DATA2
WR_DATA1: CMPA #8
BLO WR_DATA3
LDAA #$50
WR_DATA2: STAA DDRAM_add
JSR LCD_CMD
WR_DATA3: RTS fin de la partie utile :-)
* Routine de test du BUSY en mode 8 bits
CHKSTAT8: LDAA #%00000100
STAA PORTG,X E=0, R/W=1, RS=0
LDAA #$0F port G, 4 bits MSB en entre
STAA DDRG,X
CHKSTAT9: BSET PORTG,X $08 E=1, R/W=1, RS=0
LDAA PORTG,X
BCLR PORTG,X $08 E=0, R/W=1, RS=0
ANDA #$80 encore BUSY?
BNE CHKSTAT9 boucle si oui
LDAA #$FF port G en sortie
STAA DDRG,X
RTS
*** ENVOIE UN MESSAGE ***
* Y = pointe sur l'adresse ou est stock le message
TEXTE: LDAA 0,Y
BEQ TEXTE1
BSR WR_DATA
INY
BRA TEXTE
TEXTE1: RTS
* Routine de test du BUSY en mode 4 bits
CHKSTAT4: LDAA #%00000100
STAA PORTG,X E=0, R/W=1, RS=0
LDAA #$0F port G, 4 bits MSB en entre
STAA DDRG,X
CHKSTAT5: BSET PORTG,X $08 E=1, R/W=1, RS=0
LDAA PORTG,X
ANDA #$F0
STAA STATMSB
BCLR PORTG,X $08 E=0, R/W=1, RS=0
BSET PORTG,X $08 E=1, R/W=1, RS=0
LDAA PORTG,X
BCLR PORTG,X $08 E=0, R/W=1, RS=0
LSRA
LSRA
LSRA
LSRA
ORAA STATMSB ajoute le MSB au LSB
STAA LCDSTATUS sauve le tout en LCDSTATUS
ANDA #$80 encore BUSY?
BNE CHKSTAT5 boucle si oui
LDAA #$FF port G en sortie
STAA DDRG,X
RTS
*** CLEAR LCD ***
LCD_CLEAR: CLRA envoie une commande CLEAR vers le LCD
STAA DDRAM_add met jour DDRAM_add
LDAA #$01 code le commande CLEAR
JSR LCD_CMD
RTS
*** HOME LCD ***
LCD_HOME: CLRA envoie une commande HOME vers le LCD
STAA DDRAM_add met a jour DDRAM_add
LDAA #$02 code de la commande HOME
JSR LCD_CMD
RTS
*** tempo environ 100 ms ***
* j'ai mis #50000 dans Y car j'utilise un quartz de 16MHz
* si vous utilisez un 8MHz vous pouvez mettre #25000
WAITI: PSHY 5
LDY #50000 4
WAITI1: JMP WAITI2 3
WAITI2: DEY 4
BNE WAITI1 3
PULY 6
RTS 5
************************* ZONE DE MESSAGE *******************************
mess: fcc "TEST"
fcb 0
************************* VECTEURS D'INTERUPTIONS ************************
v_sci:
v_spi:
v_paie:
v_pao:
v_to:
v_toc5:
v_toc4:
v_toc3:
v_toc2:
v_toc1:
v_tic3:
v_tic2:
v_tic1:
v_rti:
v_irq:
v_xirq:
v_swi:
v_iot:
v_copf:
v_copcmf:
JMP START
ORG $FFC0
ZMB 22
FDB v_sci SCI vector
FDB v_spi SPI vector
FDB v_paie pulse accumulator input edge
FDB v_pao pulse accumulator overflow
FDB v_to timer overflow
FDB v_toc5 timer output compare 5
FDB v_toc4 timer output compare 4
FDB v_toc3 timer output compare 3
FDB v_toc2 timer output compare 2
FDB v_toc1 timer output compare 1
FDB v_tic3 timer input capture 3
FDB v_tic2 timer input capture 2
FDB v_tic1 timer input capture 1
FDB v_rti real time interupt
FDB v_irq masquable interupt
FDB v_xirq non masquable interupt
FDB v_swi software interupt
FDB v_iot illegal opcode trap
FDB v_copf cop failure
FDB v_copcmf cop clock monitor fail
FDB START reset
END