Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : mazertoc
Lcd 2x16, Lcd 4x16, Lcd 2x20, Lcd 2x40
Bonjour tout le forum,
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
Fichier à mettre dans le Pic : LCD2x16(Hex).zip
Fichier code : LCD2x16(code).zip
A+
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+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 57 invités