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