En cours de test, ne pas prendre le code pour l'instant, Merci
Mise en fonction des Lcd 2x16, Lcd 4x16, Lcd 2x20, Lcd 2x40, en mode 4 bits avec microcontrôleur Pic18F26K22, voici son datasheet
Schéma lcd 2x16
Schéma lcd 4x16
Le code est compatible actuellement pour tout microcontrôleur Microchip 8 bits, de la série 18Fxxxx de plus le code ci-dessous fonctionne pour Lcd 2x16, Lcd 4x16
Le code
Le code ASM a été écrit avec jens file Editor 3.95
Code : Tout sélectionner
;***********************************************************************************************
Errorlevel-302 ; Supprime le message "Ensure that bank bits are correct"
radix dec ; par defaut en mode décimal
list p=18f26K22 ; processeur utilisé
#include <p18f26K22.inc> ; Définitions des constantes
;***********************************************************************************************
; CONFIG11H
CONFIG FOSC = INTIO67
CONFIG FCMEN = OFF
CONFIG IESO = OFF
; CONFIG2L
CONFIG PWRTEN = OFF
CONFIG BOREN = OFF
CONFIG BORV = 190
; CONFIG2H
CONFIG WDTEN = OFF
CONFIG WDTPS = 1
; CONFIG3H
CONFIG CCP2MX = PORTC1
CONFIG PBADEN = OFF
CONFIG CCP3MX = PORTC6
CONFIG HFOFST = OFF
CONFIG T3CMX = PORTC0
CONFIG P2BMX = PORTC0
CONFIG MCLRE = INTMCLR
; CONFIG4L
CONFIG STVREN = OFF
CONFIG LVP = OFF
CONFIG XINST = OFF
CONFIG DEBUG = OFF
; CONFIG5L
CONFIG CP0 = OFF
CONFIG CP1 = OFF
CONFIG CP2 = OFF
CONFIG CP3 = OFF
; CONFIG5H
CONFIG CPB = OFF
CONFIG CPD = OFF
; CONFIG6L
CONFIG EBTR0 = OFF
; CONFIG6H
CONFIG EBTR1 = OFF
; CONFIG7L
CONFIG EBTR2 = OFF
; CONFIG7H
CONFIG EBTR3 = OFF
;*************************************** assignations *****************************************
#DEFINE lcd_port LATA ; D7 ==> RA0
; D6 ==> RA1
; D5 ==> RA2
; D4 ==> RA3
#DEFINE lcd_rs LATA,6 ; RS ==> RA6
#DEFINE lcd_e LATA,7 ; E ==> RA7
;**********************************************************************************************
;****************************** déclaration des variables *************************************
;**********************************************************************************************
CBLOCK H'0' ; bank0
loop1 :1
loop2 :1
loop3 :1
loop4 :1
loop5 :1
loop6 :1
lecture :1 ; utilisé pour macro : print
lettre :1
phrase :1 ; utilisé pour macro : print
vide :1 ; utilisé pour macro : espace
durée :1 ; utilisé pour macro : tempo
tmps :1
temps :1
res8 :1
res16 :1
adresse_low :1 ; utilisé pour macro : ecriture_eeprom, lecture_eeprom
adresse_high :1 ; utilisé pour macro : ecriture_eeprom, lecture_eeprom
donner :2 ; utilisé pour macro : ecriture_eeprom
ENDC
;********************************** "déclaration des macros" ***********************************
;************************* "Macro pour se positionner dans un tableau" *************************
tableau MACRO adresse
movlw UPPER(adresse) ;
movwf TBLPTRU ;
movlw HIGH(adresse) ;
movwf TBLPTRH ;
movlw LOW(adresse) ;
movwf TBLPTRL
ENDM
;************************** Macro pour écrit dans l'eeprom ************************************
ecriture_eeprom MACRO valeur1,valeur2,valeur3
movlw valeur1 ; adresse du poids fort
movwf adresse_high ;
movlw valeur2 ; adresse du poids faible
movwf adresse_low ;
movf valeur3,W ; donnée à écrire dans l'eeprom
movwf donner+0 ;
call eeprom_ecriture
ENDM
;*************************** Macro pour lire dans l'eeprom ************************************
lecture_eeprom MACRO valeur1,valeur2,valeur3
local nombre3,good_bye3
movlw valeur3
btfss WREG,0 ; valeur3 = 0 que pour les nombres
bra nombre3 ; valeur3 = 1 que pour les variables
movf valeur1,W ; adresse du poids fort
movwf adresse_high ;
movf valeur2,W ; adresse du poids faible
movwf adresse_low ;
bra good_bye3
nombre3
movlw valeur1
movwf adresse_high
movlw valeur2
movwf adresse_low
good_bye3
call eeprom_lecture
ENDM
;************************** "Macro pour afficher le texte sur l'écran" *************************
print MACRO valeur1,valeur2,valeur3,
local nombre5,good_bye5
movlw valeur3
btfss WREG,0 ; valeur3 = 0 que pour les nombres
bra nombre5 ; valeur3 = 1 que pour les variables
movf valeur1,W ;
movwf phrase ; longueur de la donnée
movf valeur2,W ;
movwf lecture ; départ de la donnée
bra good_bye5 ;
nombre5
movlw valeur1 ;
movwf phrase ; longueur de la donnée
;
movlw valeur2 ;
movwf lecture ; départ de la donnée
good_bye5
call affiche_lcd ;
ENDM
;********************* "Macro pour effacer les caractères par un espace " **********************
espace MACRO valeur1, valeur2
local nombre6,good_bye6
movlw valeur2
btfss WREG,0 ; valeur2 = 0 que pour les nombres
bra nombre6 ; valeur2 = 1 que pour les variables
movf valeur1,W ;
movwf vide ; nombre d'espace souhaité
bra good_bye6 ;
nombre6
movlw valeur1 ;
movwf vide ; nombre d'espace souhaité
good_bye6
call ajouter_espace
ENDM
;** "Macro pour faire une durée de temps, qui peut aller de 10 ms minimum à 2550 ms maximum "**
tempo MACRO valeur1, valeur2
local nombre7,good_bye7
movlw valeur2
btfss WREG,0 ; valeur2 = 0 que pour les nombres
bra nombre7 ; valeur2 = 1 que pour les variables
movf valeur1,W ;
movwf durée ; nombre d'espace souhaité
bra good_bye7 ;
nombre7
movlw valeur1 ;
movwf durée ; nombre d'espace souhaité
good_bye7
call _10ms
ENDM
;**************************** adresse de depart après reset **********************************
ORG H'0'
bra debut
;********************************* interruption haute priorité *********************************
ORG H'8'
retfie
;********************************* interruption basse priorité *********************************
ORG H'18'
retfie
debut
;***********************************************************************************************
movlb 0x0F ; BSR pointe sur la banque 15
;******************** "configuration de l'oscillateur du microcontrôleur" **********************
movlw B'01110100' ; oscillateur à 16 Mhz, fréquence stable si PLL (16 * 4)= 64 Mhz
; movlw B'01100100' ; oscillateur à 8 Mhz, fréquence stable si PLL (8 * 4) = 32 Mhz
; movlw B'01010010' ; oscillateur à 4 Mhz, fréquence stable
; movlw B'01000010' ; oscillateur à 2 Mhz, fréquence stable
; movlw B'00110010' ; oscillateur à 1 Mhz, fréquence stable
movwf OSCCON
movlw B'00000000' ;
movwf OSCCON2 ;
;**************************** configuration du registre OSCTUNE ********************************
movlw B'00000000' ; bit 6 à 1 : PLL * 4
movwf OSCTUNE ; bit 6 à 0 : PLL désactivé
;*************************** configuration du registre ANSELA **********************************
movlw B'00000000' ; en mode numérique :
movwf ANSELA ; en mode E/S : 2(RA0), 3(RA1), 4(RA2), 5(RA3), 7(RA5)
;**************************** configuration du registre ANSELB *********************************
movlw B'00000000' ; en mode numérique :
movwf ANSELB ; en mode E/S : 21(RB0), 22(RB1) 23(RB2), 24(RB3), 25(RB4), 26(RB5)
;**************************** configuration du registre ANSELC *********************************
movlw B'00000000' ; en mode numérique :
movwf ANSELC ; en mode E/S : 13(RC2), 14(RC3), 15(RC4), 16(RC5), 17(RC6), 18(RC7)
;*************************** configuration du registre ADCON0 **********************************
movlw B'00000000' ; b0 = ADON mise en service le convertiseur 0 = arrêt : 1 = marche
movwf ADCON0 ; b1 = GO/DONE indique la fin de la conversion analogique, et permet de lancer la conversion
; b2 à b6 = réglage de la sélection du canal
;*************************** configuration du registre ADCON1 **********************************
movlw B'00000001' ; b2 à b3 = 00 : selection de la tension de reférence, Vref+ = Vss
movwf ADCON1 ; b0 à b1 = 00 : selection de la tension de reférence, Vref- = Vdd
;*************************** configuration du registre ADCON2 **********************************
movlw B'00001101' ; b0 à b2 = FOSC/64
movwf ADCON2 ; b3 à b5 = 16 TAG
;
; b7 = détermine si le résultat de la conversion
; sera justifié à droite = 1 ou à gauche = 0
;************************* configuration du registre CM1CON0 & CM2CON0 *************************
movlw B'00000000' ; comparateur 1 off
movwf CM1CON0
movlw B'00000000' ; comparateur 2 off
movwf CM2CON0
;*********************** "configuration du pwm du microncontrôleur" ****************************
movlw D'99' ; réglage du "débordement" de TMR2
movwf PR2 ; PR2 D'99' donc fréquence à 1250 Hz avec prédiviseur à 16
movlw B'00000110' ; diviseur pour réduire ou augmenter pwm
movwf T2CON ;
;
movlw B'00001100' ; "1100" 4 bits mode pwm, "00" 2 bits pour variation du rapport cyclique
; movwf CCP1CON ; désactivé le pwm sur RC2
; movwf CCP2CON ; désactivé le pwm sur RC1
;************ configuration des registres TRISA & TRISB & TRISC & TRISE en bank 1 **************
movlw B'00000000' ; RA0(2), RA1(3), RA2(4), RA3(5), RA4(6), RA5(7), RA6(10), RA7(9)
movwf TRISA ;
movlw B'01110011' ; RB0(21), RB1(22), RB2(23), RB3(24), RB4(25), RB5(26), RB6(27), RB7(28)
movwf TRISB ;
movlw B'00111001' ; RC0(11), RC1(12), RC2(13), RC3(14), RC4(15), RC5(16), RC6(17), RC7(18)
movwf TRISC ;
movlw B'00001000' ; RE3(1)
movwf TRISE ;
; VSS(8), VSS(19), VDD(20)
;**************************** configuration du registre INTCON2 ********************************
movlw B'00000000' ; B7 = 0 résistances en service
movwf INTCON2 ;
;**************************** configuration du registre WPUB ***********************************
movlw B'00000000' ; tirage de résistance sur :
movwf WPUB ; pas de tirage de résistance sur : RB0(21), RB1(22), RB2(23), RB3(24), RB4(25), RB5(26), RB6(27), RB7(28)
;**************************** configuration du registre INTCON *********************************
movlw B'00000000' ;
movwf INTCON ; interruption hors service
;************************************ départ du programme **************************************
movlb 0x00 ; BSR pointe sur la banque 0
;***********************************************************************************************
clrf PORTA
clrf PORTB
clrf PORTC
clrf LATA
clrf LATB
clrf LATC
;***********************************************************************************************
;*********************** "initialisation du mode 4 bits pour LCD 1602" *************************
;***********************************************************************************************
ini_lcd
movlw B'00000100' ; D5
call envoi ; mode 4 bits
call e_pulse
;----------------------------------------------------------------------------
movlw B'00000100' ; D5
call envoi ; mode 4 bits
call e_pulse
;----------------------------------------------------------------------------
movlw B'00000001' ; D7
call envoi ; mode 4 bits
call e_pulse
;----------------------------------------------------------------------------
call _40µs
;----------------------------------------------------------------------------
; "mode 1 ou 2 lignes du lcd"
movlw B'00000100' ; D5
call envoi ; utilisation de 2 ligne du LCD
call e_pulse
movlw B'00000011' ; D6, D7
call envoi
call e_pulse
;----------------------------------------------------------------------------
call _1640µs
;----------------------------------------------------------------------------
; "choix de voir le curseur"
movlw B'00000000'
call envoi ; autorise l'affichage, et cache le curseur
call e_pulse
movlw B'00000011' ; D6, D7
call envoi
call e_pulse
;----------------------------------------------------------------------------
call _40µs
;----------------------------------------------------------------------------
; "curseur de gauche à droite"
movlw B'00000000'
call envoi ; déplacement du curseur après l'apparition
call e_pulse ; d'un caractère de gauche à droite
movlw B'00000110' ; D5, D6
call envoi
call e_pulse
;----------------------------------------------------------------------------
call _40µs
;----------------------------------------------------------------------------
; "adresse d'écriture dans GGRAM pour création de caractére"
movlw b'00000010' ; D6
call envoi ; adresse d'écriture dans CGRAM à l'adresse 0x00
call e_pulse
movlw B'00000000'
call envoi
call e_pulse
;----------------------------------------------------------------------------
call _40µs
;----------------------------------------------------------------------------
; "création des caractères "é", "è", "ê", "à", "ç", "°C", "µ", "°" dans la GGRAM"
movlw D'64' ; longueur de la donnée
movwf temps
tableau creation ; macro : qui permets de se positionner à l'adresse demandé
ini_creaion
tblrd*+ ; effectue la lecture, et ensuite incrémente TBLPTR
movf TABLAT,W ; transfére la donnée récupére dans W
movwf lettre
call ecrit_lcd ; enregistrement des caractéres dans GGRAM
decfsz temps,F
bra ini_creaion
;***********************************************************************************************
call cls_lcd ; efface l'écran LCD
;***********************************************************************************************
rcall ligne1_lcd ; se placer sur la ligne 1
print 16,0,0 ; macro : longueur de la donnée,départ de la donnée, chiffre(0) ou varible(1)
; affiche : "Temps-x est sur "
rcall ligne2_lcd ; se placer sur la ligne 2
print 16,16,0 ; macro : longueur de la donnée,départ de la donnée, chiffre(0) ou varible(1)
; affiche : " Fantas-Pic "
tempo 200,0 ; macro : temps, chiffre(0) ou varible(1)
; 2000 ms pour laissé le temps de voir
;***********************************************************************************************
terminer
nop
bra terminer
;************** "efface l'écran, et raméne le curseur à la premier ligne du lcd" **************
cls_lcd
movlw B'00000000'
rcall envoi ; efface l'écran, et raméne le curseur au début
rcall e_pulse
movlw B'00001000'
rcall envoi
rcall e_pulse
rcall _1640µs
return
;********************** "H'80' se placer en début de la ligne 1 du lcd" ************************
ligne1_lcd
movlw B'00000001'
rcall envoi ; ligne 1 du lcd
rcall e_pulse
movlw B'00000000'
rcall envoi
rcall e_pulse
rcall _40µs
return
;********************** "H'C0' se placer en début de la ligne 2 du lcd" ************************
ligne2_lcd
movlw B'00000011'
rcall envoi ; ligne 2 du lcd
rcall e_pulse
movlw B'00000000'
rcall envoi
rcall e_pulse
rcall _40µs
return
;************************ "écrit ou créer, un caractére sur le lcd" ***************************
ecrit_lcd
movlw D'2'
movwf loop4
reecrit_lcd
clrf WREG
swapf lettre,F
btfsc lettre,0
bsf WREG,3
btfsc lettre,1
bsf WREG,2
btfsc lettre,2
bsf WREG,1
btfsc lettre,3
bsf WREG,0
rcall envoi
bsf lcd_rs
rcall e_pulse
bcf lcd_rs
decfsz loop4,F
bra reecrit_lcd
rcall _40µs
return
;************* "pour écrire dans les bits 0,1,2,3, sans toucher aux bits 4,5,6,7" **************
envoi
andlw B'00001111'
movwf loop5
btfsc lcd_port,7
bsf loop5,7
btfsc lcd_port,6
bsf loop5,6
btfsc lcd_port,5
bsf loop5,5
btfsc lcd_port,4
bsf loop5,4
movff loop5,lcd_port
return
;************************** "envoie une fin d'émision sur le lcd" *****************************
e_pulse
nop
bsf lcd_e
nop
bcf lcd_e
return
;****************************** "affiche le texte sélectionner" ********************************
affiche_lcd
tableau info ; macro : qui permets de se positionner à l'adresse demandé
bcf STATUS,C ; pour additionner, mettre carry à zéro pour
; ne pas avoir d'erreur sur l'addition
movf lecture,W ; emplacement du départ de la donnée
addwf TBLPTRL,F ; se positionner à l'adresse low
btfsc STATUS,C ; si retenu ajouter à l'adresse high
incf TBLPTRH,F ;
re_lire
tblrd*+ ; effectue la lecture, et ensuite incrémente TBLPTR
movf TABLAT,W ; transfére le caractère récupéredans dans TABLAT vers W
movwf lettre ; "lettre" contient la donnée
rcall ecrit_lcd ; écriture du caractère sur lcd
decfsz phrase,F ; "phrase" est la longueur du texte
bra re_lire ;
return
;************** "ajouter un espace, surtout utilisé pour effacer des caractères" ***************
ajouter_espace
; "écrit des espaces vide sur le lcd"
movlw ' '
movwf lettre
rcall ecrit_lcd
decfsz vide,F
bra ajouter_espace
return
;****************************** "pour écrit dans l'eeprom" *************************************
eeprom_ecriture
movf adresse_high,W ; adresse du poid fort
movwf EEADRH ;
movf adresse_low,W ; adresse du poid faible
movwf EEADR ;
movf donner+0,W ;
movwf EEDATA ; écriture de la donnée
bcf EECON1,EEPGD ; préparation à l'autorisation
bcf EECON1,CFGS ; access eeprom
bsf EECON1,WREN ; Enable writes
bcf INTCON,GIE ; couper les interruptions
btfsc INTCON,GIE ; contrôl si les interruptions sont bien coupés
bra $-D'2' ; remonte à la ligne 2 jusqu'a coupures des interruptions
movlw H'55' ; séquence spécifique (c'est comme ça, il faut le savoir)
movwf EECON2 ; séquence spécifique
movlw H'AA' ; séquence spécifique
movwf EECON2 ; séquence spécifique
bsf EECON1,WR ; lance une opération d'écriture
btfsc EECON1,WR ; on attend que l'operation d'ecriture soit finie (de l'ordre de la ms
bra $-D'2' ; remonte à la ligne 2 jusqu'a fin d'écriture
bcf EECON1, WREN ; interdiction de l'écriture
return
;******************************** "pour lire dans l'eeprom" ************************************
eeprom_lecture
movf adresse_high,W ; adresse du poid fort
movwf EEADRH ;
movf adresse_low,W ; adresse du poid faible
movwf EEADR ;
bcf EECON1,EEPGD ; préparation à la lecture
bcf EECON1,CFGS ; access EEPROM
bsf EECON1,RD ; lecture de l'EEPROM
movf EEDATA,W ; la valeur lue dans l'éeprom est placée dans W
movwf donner ; récupération du résultat
return
;**************** "pause de 10 millisecondes pour 18F avec horloge de 16 Mhz" ******************
_10ms
movlw D'241'
movwf loop1
movlw D'52'
movwf loop2
decfsz loop1
bra $-D'2'
decfsz loop2
bra $-D'6'
decfsz durée,F
bra _10ms
return
;**************** "pause de 1640 micro-secondee pour 18F avec horloge de 16 Mhz" ***************
_1640µs
movlw D'131'
movwf loop1
movlw D'9'
movwf loop2
decfsz loop1
bra $-D'2'
decfsz loop2
bra $-D'6'
return
;****************** "pause de 40 micro-seconde pour 18F avec horloge de 16 Mhz" ****************
_40µs
movlw D'53'
movwf loop1
decfsz loop1,F
bra $-D'2'
return
;***********************************************************************************************
;************************* "affichage des phrases, 255 octets maximum" *************************
;***********************************************************************************************
ORG H'8CA0' ; 36000
info
db "Temps-x est sur " ; longueur 16 départ 0
db " Fantas-Pic " ; longueur 16 départ 0
;***********************************************************************************************
;**************************** "création de 8 caractère pour le LCD" ****************************
;***********************************************************************************************
ORG H'8DCC' ; 36300
creation
; "création du caractère "é" dans la GGRAM"
db B'00000100',B'00001000',B'00001110',B'00010001',B'00011111',B'00010000',B'00001110',B'00000000'
; "création du caractère "è" dans la GGRAM"
db B'00000100',B'00000010',B'00001110',B'00010001',B'00011111',B'00010000',B'00001110',B'00000000'
; "création du caractère "ê" dans la GGRAM"
db B'00000100',B'00001010',B'00001110',B'00010001',B'00011111',B'00010000',B'00001110',B'00000000'
; "création du caractère "à" dans la GGRAM"
db B'00000100',B'00000010',B'00001110',B'00000001',B'00001111',B'00010001',B'00001111',B'00000000'
; "création du caractère "ç" dans la GGRAM"
db B'00001110',B'00010000',B'00010000',B'00010001',B'00001110',B'00000100',B'00001100',B'00000000'
; "création du caractère "û" dans la GGRAM"
db B'00000100',B'00001010',B'00010001',B'00010001',B'00010001',B'00010011',B'00001101',B'00000000'
; "création du caractère "°C" dans la GGRAM"
db B'00001000',B'00010100',B'00001000',B'00000110',B'00001000',B'00001000',B'00001001',B'00000110'
; "création du caractère "°" dans la GGRAM"
db B'00001000',B'00010100',B'00001000',B'00000000',B'00000000',B'00000000',B'00000000',B'00000000'
;******************* "écriture dans l'eeprom pendant la programmation du Pic" ******************
ORG H'F00000'
DE 'T','e','m','p','s','-','x',' ',' ',' ',' ',' ',' ',' ',' ',' '
End
Fichier à mettre dans le Pic : LCD2x16(Hex).zip
Fichier code : LCD2x16(code).zip
A+