Je recherche des routines (testées) en assembleur pour commander un
afficheur LCD 16*2 en mode 4 bits (4 bits de données + R/W RS E).
De préférence compatibles avec une fréquence de 20 MHz pour le PIC
(problème de temporisations).
J'ai cherché plusieurs jours sur le Web et essayé pas mal de programmes
sans résultats.
Je commence à désespérer de parvenir à piloter l'afficheur dans un
programme personnel...
Le montage fonctionne car tout marche bien avec un programme dont je
n'ai que le code assemblé (.hex), donc presque impossible à modifier
(car très long : 8000 mots désassemblés c'est dur à comprendre sans les
annotations du code source...)
Merci d'avance !
--
Nicolas
Voir:
http://perso.wanadoo.fr/jf.fourcadier/relais/relais_ATV/relais_ATV.htm
--
73 et B5+ de Jean-François FOURCADIER F4DAY
website: http://perso.wanadoo.fr/jf.fourcadier
"SLO" <djslo...@ifrance.com> a écrit dans le message news:
3E4AF957...@ifrance.com...
Salut,
Voici un source qui fonctionne avec un PIC16F873 4 MHz et un afficheur
LCD 4 lignes 20 cars.
Pour une fréquence de 20 MHz il faudra probablement augmenter les
tempos Wait.
PORT B :
PORTB,0 ; RS
PORTB,1 ; E
PORTB,2 ; RW
PORTB,4 ; D0
PORTB,5 ; D1
PORTB,6 ; D2
PORTB,7 ; D3
;************************************************************************
;LCD_WritedStr : Ecriture d'une chaine (Data) sur l'afficheur LCD
*
; FSR = pointeur sur la chaîne
*
; W = adresse écran LCD [0x00..0x67]
*
;
*
; La chaîne est affichée jusqu'au caractère dont le code = 00
*
;
*
;************************************************************************
LCD_WritedStr
; Positionnement du curseur
BANKSEL dBank0
addlw h'80'
movwf dData
call LCD_WriteReg
LCD_WritedStr0
; W <- Caractère à afficher
movf INDF,w
; Fin si le code lu est = 0
btfsc STATUS,Z
; Z=1 donc code=0
goto LCD_WritedStrExit
; Z=0 donc code<>0 donc afficher
BANKSEL dBank0
movwf dData
call LCD_WriteCar
; Caractère suivant
incf FSR,f
goto LCD_WritedStr0
LCD_WritedStrExit
return
;************************************************************************
;LCD WriteStr : Ecriture d'une chaine sur l'afficheur LCD
*
;
*
; Le pointeur sur la chaine est censé être initialisé par un appel à
la *
; macro mIndex Adresse_chaine
*
;
*
;************************************************************************
LCD_WriteStr
; Initialise X au début de la table
BANKSEL dBank0
clrf dIndex
LCD_WriteStr0
; W<-Tab[Index]
call Indexer
PAGESEL LCD_WriteStr
; Positionnement bit Z
iorlw h'00'
; Fin si le code lu est = 0
btfsc STATUS,Z
goto LCD_WriteStr1
; Caractère <> 0 à imprimer
BANKSEL dBank0
movwf dData
call LCD_WriteCar
BANKSEL dBank0
incf dIndex,f
goto LCD_WriteStr0
LCD_WriteStr1
return
;************************************************************************
;LCD Init : Initialisation de l'afficheur LCD
*
;
*
;************************************************************************
LCD_Init
; Power On du LCD
; Temporisation 255 ms
movlw d'255'
call Wait
; Initialise le LCD avec Function Set: DL(1=8 bits)
; Présentation donnée MSB LCD sur PORTB
movlw b'00110000'
BANKSEL PORTB
movwf PORTB
; E=1 + RW=0 + RS=0
bcf PORTB,0 ; RS=0
bcf PORTB,2 ; RW=0
bsf PORTB,1 ; E=1
; Temporisation 1ms
movlw 10
call Wait
; E=0 + RW=0 + RS=0
BANKSEL PORTB
bcf PORTB,0 ; RS=0
bcf PORTB,2 ; RW=0
bcf PORTB,1 ; E=0
; Temporisation 1ms
movlw 10
call Wait
; Temporisation 5 ms
movlw d'5'
call Wait
; Initialise le LCD avec Function Set: DL(1=8 bits)
; Présentation donnée MSB LCD sur PORTB
movlw b'00110000'
BANKSEL PORTB
movwf PORTB
; E=1 + RW=0 + RS=0
bcf PORTB,0 ; RS=0
bcf PORTB,2 ; RW=0
bsf PORTB,1 ; E=1
; Temporisation 1ms
movlw 10
call Wait
; E=0 + RW=0 + RS=0
BANKSEL PORTB
bcf PORTB,0 ; RS=0
bcf PORTB,2 ; RW=0
bcf PORTB,1 ; E=0
; Temporisation 1ms
movlw 10
call Wait
; Initialise le LCD avec Function Set: DL(1=8 bits)
; Présentation donnée MSB LCD sur PORTB
movlw b'00110000'
BANKSEL PORTB
movwf PORTB
; E=1 + RW=0 + RS=0
bcf PORTB,0 ; RS=0
bcf PORTB,2 ; RW=0
bsf PORTB,1 ; E=1
; Temporisation 1ms
movlw 10
call Wait
; E=0 + RW=0 + RS=0
BANKSEL PORTB
bcf PORTB,0 ; RS=0
bcf PORTB,2 ; RW=0
bcf PORTB,1 ; E=0
; Temporisation 1ms
movlw 10
call Wait
; Initialise le LCD avec Function Set: DL(0=4 bits)
; Présentation donnée MSB LCD sur PORTB
movlw b'00100000'
BANKSEL PORTB
movwf PORTB
; E=1 + RW=0 + RS=0
bcf PORTB,0 ; RS=0
bcf PORTB,2 ; RW=0
bsf PORTB,1 ; E=1
; Temporisation 1ms
movlw 10
call Wait
; E=0 + RW=0 + RS=0
BANKSEL PORTB
bcf PORTB,0 ; RS=0
bcf PORTB,2 ; RW=0
bcf PORTB,1 ; E=0
; Temporisation 1ms
movlw 10
call Wait
; Initialise le LCD avec Function Set: DL(0=4 bits)+N(1=2
lignes)
BANKSEL dBank0
movlw b'00101000'
movwf dData
call LCD_WriteReg
; Initialise le LCD avec Entry Mode Set: I/D(0=Décrémentation
DDRAM)+S(0=No Shift)
BANKSEL dBank0
movlw b'00010100'
movwf dData
call LCD_WriteReg
; Initialise le LCD avec On/Off Control: D(1=On)+C(0=Curseur
Off)+B(0=Blink Off)
BANKSEL dBank0
movlw b'00001100'
movwf dData
call LCD_WriteReg
return
;************************************************************************
;LCD Cls : Efface l'écran LCD
*
;
*
; Envoi les codes Clear Display et Curseur Home
*
;
*
;************************************************************************
LCD_Cls
; Préparation du code CLS dans W
BANKSEL dBank0
movlw h'01'
movwf dData
call LCD_WriteReg
movlw d'200'
call Wait
return
;************************************************************************
;LCD_CurBlinkOn : Allume le curseur et le fait clignoter
*
;
*
;************************************************************************
LCD_CurBlinkOn
; Préparation du code Display dans W
BANKSEL dBank0
movlw h'0D'
movwf dData
call LCD_WriteReg
return
;************************************************************************
;LCD_CurBlinkOff : Eteint le curseur mais laisse l'écran allumé *
;
*
;************************************************************************
LCD_CurBlinkOff
; Préparation du code Display dans W
BANKSEL dBank0
movlw h'0C'
movwf dData
call LCD_WriteReg
return
;************************************************************************
;LCD WriteReg : Ecriture d'un caractère dans un registre LCD
*
; Reg contenu dans dData
*
;
*
; Data LCD sur PortB [b4..b7] en Output
*
; Data E=1 + RW=0 + RS=0 sur PortB [b0..b2] en Output
*
; Temporisation
*
; Data E=0 + RW=0 + RS=0 sur PortB [b0..b2] en Output
*
;
*
;************************************************************************
LCD_WriteReg
mIRQ_Off
; Présentation donnée MSB LCD sur PORTB
BANKSEL PORTB
movf PORTB,w
andlw h'0F'
movwf PORTB
BANKSEL dBank0
movf dData,w
andlw h'F0'
BANKSEL PORTB
iorwf PORTB,f
; E=1 + RW=0 + RS=0
bcf PORTB,0 ; RS=0
bcf PORTB,2 ; RW=0
bsf PORTB,1 ; E=1
; Temporisation 1ms
movlw 2
call Wait
; E=0 + RW=0 + RS=0
BANKSEL PORTB
bcf PORTB,0 ; RS=0
bcf PORTB,2 ; RW=0
bcf PORTB,1 ; E=0
; Présentation donnée LSB LCD sur PORTB
BANKSEL PORTB
movf PORTB,w
andlw h'0F'
movwf PORTB
BANKSEL dBank0
swapf dData,w
andlw h'F0'
BANKSEL PORTB
iorwf PORTB,f
; E=1 + RW=0 + RS=0
bcf PORTB,0 ; RS=0
bcf PORTB,2 ; RW=0
bsf PORTB,1 ; E=1
; Temporisation 1ms
movlw 2
call Wait
; E=0 + RW=0 + RS=0
BANKSEL PORTB
bcf PORTB,0 ; RS=0
bcf PORTB,2 ; RW=0
bcf PORTB,1 ; E=0
mIRQ_On
return
;************************************************************************
;LCD WriteCar : Ecriture d'un caractère en RAM LCD
*
; Car contenu dans dData
*
;
*
; Data LCD sur PortB [b4..b7] en Output
*
; Data E=1 + RW=0 + RS=1 sur PortB [b0..b2] en Output
*
; Temporisation
*
; Data E=0 + RW=0 + RS=1 sur PortB [b0..b2] en Output
*
;
*
;************************************************************************
LCD_WriteCar
mIRQ_Off
; Présentation donnée MSB LCD sur PORTB
BANKSEL PORTB
movf PORTB,w
andlw h'0F'
movwf PORTB
BANKSEL dBank0
movf dData,w
andlw h'F0'
BANKSEL PORTB
iorwf PORTB,f
; E=1 + RW=0 + RS=1
bsf PORTB,0 ; RS=1
bcf PORTB,2 ; RW=0
bsf PORTB,1 ; E=1
; Temporisation 1ms
movlw 2
call Wait
; E=0 + RW=0 + RS=1
BANKSEL PORTB
bsf PORTB,0 ; RS=1
bcf PORTB,2 ; RW=0
bcf PORTB,1 ; E=0
; Temporisation 1ms
movlw 2
call Wait
; Présentation donnée LSB LCD sur PORTB
BANKSEL PORTB
movf PORTB,w
andlw h'0F'
movwf PORTB
BANKSEL dBank0
swapf dData,w
andlw h'F0'
BANKSEL PORTB
iorwf PORTB,f
; E=1 + RW=0 + RS=1
bsf PORTB,0 ; RS=1
bcf PORTB,2 ; RW=0
bsf PORTB,1 ; E=1
; Temporisation 1ms
movlw 2
call Wait
; E=0 + RW=0 + RS=1
BANKSEL PORTB
bsf PORTB,0 ; RS=1
bcf PORTB,2 ; RW=0
bcf PORTB,1 ; E=0
mIRQ_On
return
On Thu, 13 Feb 2003 02:48:07 +0100, SLO <djslo...@ifrance.com>
wrote:
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
*** Usenet.com - The #1 Usenet Newsgroup Service on The Planet! ***
http://www.usenet.com
Unlimited Download - 19 Seperate Servers - 90,000 groups - Uncensored
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Merci quand même ! ;o)
--
Nicolas
J.F. FOURCADIER a écrit: