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
Bonjour à toute l'équipe du forum
Code : Tout sélectionner
;---------------------------------------------------------GESTION AFFICHEUR-----------------------------------------------------------------
; TITRE: Gestion d'un afficheur LCD graphique
; DATE: 10/11/2018
; AUTEUR: nondediode
; PIC UTILISE: PIC16F877
; Gestion PP845 version 2019
; le quartz est de 4MHz
; essai JMarc Version 1,01
;----------------------------------------------------Brochage du PIC sur la carte---------------------------------------------------------
;
; Port | Broche | E/S | Description
; RA0 | 02 | S | Relais "MUTE"
; RA1 | 03 | S | Relais "PHASE"
; RA2 | 04 | S | LED droite
; RA3 | 05 | S | LED gauche
; RA4 | 06 | S | Relais de cde HT gauche et droit
; RA5 | 07 | S | Relais statique gauche et droit
; RB0 | 33 | E | Inter "on / off"
; RB1 | 34 | E | Bouton poussoir "OK"
; RB2 | 35 | S | Data Write afficheur
; RB3 | 36 | S | Data Read afficheur
; RB4 | 37 | S | Chip Enable
; RB5 | 38 | S | C/D
; RB6 | 39 | S | Font Size Select
; RB7 | 40 | S | Reset
; RC0 | 15 | S | Adressage entrée audio bit A
; RC1 | 16 | S | Adressage entrée audio bit B
; RC2 | 17 | S | Adressage entrée audio bit C
; RC3 | 18 | S | Adressage entrée audio bit D
; RC4 | 23 | S | LEDs Rouge droit et gauche
; RC5 | 24 | E | Bouton poussoir "INPUT"
; RC6 | 25 | E | Bouton poussoir "PHASE"
; RC7 | 26 | E | Bouton poussoir "MUTE"
; RD0 | 19 | S | Sortie bit D7 du LCD
; RD1 | 20 | S | Sortie bit D6 du LCD
; RD2 | 21 | S | Sortie bit D5 du LCD
; RD3 | 22 | S | Sortie bit D4 du LCD
; RD4 | 27 | S | Sortie bit D3 du LCD
; RD5 | 28 | S | Sortie bit D2 du LCD
; RD6 | 29 | S | Sortie bit D1 du LCD
; RD7 | 30 | S | Sortie bit D0 du LCD
;--------------------------------------------------DIRECTIVE D'ASSEMBLAGE POUR MPLAB-------------------------------------------------------
list p=16f877
#include <p16f877.inc>
radix dec ; on travaille en décimal par défaut
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC
OPTIONVAL EQU B'00001111'
;-------------------------------------------------Definition de la RAM------------------------------------------------------
cblock 0x20
DATA_L
DATA_H
CMD
endc
cblock 0x70
w_temp : 1 ; Sauvegarde registre W
status_temp : 1 ; sauvegarde registre STATUS
FSR_temp : 1 ; sauvegarde FSR (si indirect en interrupt)
PCLATH_temp : 1 ; sauvegarde PCLATH (si prog>2K)
Tempj : 1
delai1_LED_TEMOIN : 1
delai2_LED_TEMOIN : 1
temptmr0 : 1
temp1tmr1 : 1
STATUS_TEMP ; interruptcontextsave for STATUS
PCLATH_TEMP ; interruptcontextsave for PCLATH
COUNT1 ; delaycounter 1
COUNT2 ; delaycounter 2
COUNT3 ; delaycounter 3
DATA_EE_ADDR ; data EEPROM address buffer
DATA_EE_DATA ; data EEPROM data buffer
endc
;-------------------------------------------------Definition des constantes------------------------------------------------------
#DEFINE LED_TEMOIN PORTA,1
#DEFINE LED_TEMOIN2 PORTA,0
#DEFINE LCD_WR PORTB,2 ; RB2 | 35 | S | Data Write afficheur
#DEFINE LCD_RD PORTB,3 ; RB3 | 36 | S | Data Read afficheur
#DEFINE LCD_CE PORTB,4 ; RB4 | 37 | S | Chip Enable
#DEFINE LCD_CD PORTB,5 ; RB5 | 38 | S | C/D
#DEFINE LCD_FS PORTB,6 ; RB6 | 39 | S | Font Size Select
#DEFINE LCD_RESET PORTB,7 ; RB7 | 40 | S | Reset
LCD_DATA EQU PORTD
;--------------------------------------------Definition des registres temporaires------------------------------------------------------
;--------------------------------------------Directives des programmes------------------------------------------------------
;=====================================Macro=====================================
led_cligno_lent macro
movlw 0x28 ; longueur
movwf delai1_LED_TEMOIN
movlw 0x5A ; fréquence
movwf delai2_LED_TEMOIN
clrf temp1tmr1
endm
led_cligno_rapide macro
movlw 0x08 ; longueur
movwf delai1_LED_TEMOIN
movlw 0x0A ; fréquence
movwf delai2_LED_TEMOIN
clrf temp1tmr1
endm
led_cligno_flash macro
movlw 0x29 ; longueur
movwf delai1_LED_TEMOIN
movlw 0x2A ; fréquence
movwf delai2_LED_TEMOIN
clrf temp1tmr1
endm
CtlAff macro ctr ; envoyer commande
movlw ctr
movwf CMD
call Envoi_cmd
endm
DataAff_8 macro x1,x2 ; envoyer commande et data 8 bits
movlw x1
movwf CMD
movlw x2
movwf DATA_L
call Envoi_data_8
call Envoi_cmd
endm
DataAff_16 macro x1,x2 ; envoyer commande et data 16 bits
movlw x1
movwf CMD
movlw (x2) / 0x100
movwf DATA_H
movlw (x2) % 0x100
movwf DATA_L
call Envoi_data_16
call Envoi_cmd
endm
;===============================================================================
org 0x000 ; Debut du programme principale
goto START ; Saut à START
;*****************************************************************************
; ROUTINE INTERRUPTION *
;*****************************************************************************
; sauvegarder registres
;---------------------
org 0x004 ; adresse d'interruption
movwf w_temp ; sauver registre W
swapf STATUS,w ; swap status avec résultat dans w
movwf status_temp ; sauver status swappé
movf FSR , w ; charger FSR
movwf FSR_temp ; sauvegarder FSR
bsf STATUS,RP0 ; sélectionner banque1
btfss PIE1,TMR1IE ; tester si interrupt autorisée
goto intsw1 ; non sauter
bcf STATUS,RP0 ; oui, sélectionner banque0
btfss PIR1,TMR1IF ; oui, tester si interrupt en cours
goto intsw1 ; non sauter
MOVLW 0x3C ; int toute le 100ms
MOVWF TMR1H
MOVLW 0xB3
movwf TMR1L
incf temp1tmr1,f
movf delai2_LED_TEMOIN,w ; on test si Xfois
subwf temp1tmr1,W
btfss STATUS,Z
goto suite_led_temoin
bcf LED_TEMOIN
; bsf LED_TEMOIN
clrf temp1tmr1
goto sautintsw9
suite_led_temoin
movf delai1_LED_TEMOIN,w
subwf temp1tmr1,W
btfss STATUS,Z
goto sautintsw9
bsf LED_TEMOIN
; bcf LED_TEMOIN ; inversion des sorties pour la platine essais
sautintsw9
bcf PIR1,TMR1IF ; effacer flag interupt
intsw1
bcf STATUS,RP0 ; oui, sélectionner banque0
; restaurer registres
; -------------------
restorereg
bcf STATUS,RP0
movf FSR_temp, w ; charger FSR sauvé
movwf FSR ; restaurer FSR
swapf status_temp,w ; swap ancien status, résultat dans w
movwf STATUS ; restaurer status
swapf w_temp,f ; Inversion L et H de l'ancien W
; sans modifier Z
swapf w_temp,w ; Réinversion de L et H dans W
; W restauré sans modifier status
retfie
;-------------------------------------------------INITIALISATION------------------------------------------------------
START
; Registre d'options (banque 1)
; -----------------------------
BANKSEL OPTION_REG ; sélectionner banque 1
movlw OPTIONVAL ; charger masque
movwf OPTION_REG ; initialiser registre option
; registres interruptions (banque 1)
; ----------------------------------
bsf INTCON,PEIE ; autoriser interruptions périphériques
bcf STATUS,RP0 ; passer banque 0
; autoriser interruptions (banque 0)
; ----------------------------------
bsf T1CON,0X4
bcf T1CON,0X5
MOVLW 0x3C ; int toute le 100ms
MOVWF TMR1H
MOVLW 0xB3
movwf TMR1L
BSF T1CON,TMR1ON ; on TMR1 bit a 1
CLRF PORTA ; Remise à 0 du port A
CLRF PORTB ; Remise à 0 du port B
CLRF PORTC ; Remise à 0 du port C
CLRF PORTD ; Remise à 0 du port D
CLRF PORTE ; Remise à 0 du port E
bsf STATUS,RP0 ; Banque 1
clrf TRISA ; PortA en sortie
movlw b'00000110'
movwf ADCON1 ; sortie digital
; PORTA, PORTB, PORTC, and PORTE outputs
CLRF TRISB ; PORTD defaults to input
CLRF TRISC
CLRF TRISE
BSF PIE1,TMR1IE ; valide le TMR1
bcf STATUS,RP0 ; Banque 0
led_cligno_lent
bsf INTCON,GIE ; valider interruptions
bsf LCD_WR ; RB2 | 35 | S | Data Write afficheur
bsf LCD_RD ; RB3 | 36 | S | Data Read afficheur
bsf LCD_CE ; RB4 | 37 | S | Chip Enable
bsf LCD_CD ; RB5 | 38 | S | C/D
bsf LCD_FS ; font 6x8
bsf LCD_RESET ; RB7 | 40 | S | Reset
call Delay50mS
bcf LCD_RESET ; RB7 | 40 | S | Reset
call Delay50mS
bsf LCD_RESET
CtlAff 0x80 ; select CG ROM afficheur et mode OR 10000000
call Delay50mS
DataAff_16 0x42, 0x0000 ; set grp en 0000h
call Delay50mS
DataAff_16 0x43, 40 ; set grp 6x8
call Delay50mS
DataAff_16 0x40, 0x1700 ; set txt en 1700h
call Delay50mS
DataAff_16 0x41, 40 ; set txt 6x8 (40 caractères par ligne)
call Delay50mS
CtlAff 0xa0 ; épaisseur curseur 1 ligne (1 à 8) 10100000
call Delay50mS
CtlAff 0x9c ; afficher grp/txt et cacher curseur 10011100
call Delay50mS
DataAff_16 0x24, 0x1700 ; écrire en haut à gauche
call Delay50mS
DataAff_8 0xc0, 'D'-32 ; afficher 'D'
call Delay50mS
led_cligno_rapide
loop
nop
GOTO loop ; boucle principale
;-------------------------------------------------Programme tempo------------------------------------------------------
Delay50mS
MOVLW 0x40 ; Charge la valeur dans W
MOVWF COUNT1 ; Transfert de W sur COUNT1
MOVWF COUNT2 ; Transfert de W sur COUNT2
DECFSZ COUNT1,F ; On décrémente COUNT1,F
GOTO $-1 ; Comptage de boucle
DECFSZ COUNT2,F ; On décrémente COUNT2,F
GOTO $-3 ; Comptage de boucle
RETURN
Delay
MOVWF COUNT3 ; Transfert de W sur COUNT3
CALL Delay50mS ; Appel de l'étiquette Delay50mS
DECFSZ COUNT3,F ; On décrémente COUNT3,F
GOTO $-2 ; Comptage de boucle
RETURN
;===============================================================================
Envoi_cmd
bsf LCD_CD ; etat haut pour commande
bcf LCD_CE ; Chip Enable
movf CMD,w
movwf LCD_DATA
bcf LCD_WR ; Data Write afficheur actif etat bas
nop
bsf LCD_WR
bsf LCD_CE ; Chip Disable
return
Envoi_data_8
bcf LCD_CD ; etat bas pour données
bcf LCD_CE ; Chip Enable
movf DATA_L,w
movwf LCD_DATA
bcf LCD_WR ; Data Write afficheur actif etat bas
nop
bsf LCD_WR
bsf LCD_CE ; Chip disable
return
Envoi_data_16
bcf LCD_CD ; etat bas pour données
bcf LCD_CE ; Chip Enable
movf DATA_L,w
movwf LCD_DATA
bcf LCD_WR ; Data Write afficheur actif etat bas
nop
bsf LCD_WR
movf DATA_H,w
movwf LCD_DATA
bcf LCD_WR ; Data Write afficheur actif etat bas
nop
bsf LCD_WR
bsf LCD_CE ; Chip disable
return
END
C'est un 16F877 ou un 16F877A ? il y avait des références au 2 types.
Le cblock en 0x70 avait une taille supérieure à 16, gênant
J'espère que ça clignote encore :)
Bonjour à toute l'équipe du forum
-
nondediode
Amateur- Messages : 148
- Enregistré en : novembre 2018
- Localisation : Lyon
satinas a écrit :???????
DataAff_8 0xc0,0x1700 ; afficher 'D'. Modif effectué
Pour éviter d'avoir des problèmes de tabulations dans les sources, il faut régler Mplab pour remplacer les tabulations par des espaces. C'est dans le menu Edit/Properties/File Type, cocher "Insert spaces"
Ma version Mplab est la 5.5, je n'ai pas Edit/properties dans ce module
C'est un 16F877 ou un 16F877A ? il y avait des références au 2 types.
16f877-20/P
J'ai testé le code, rien de mieux.
La LED clignote tjrs
Bonjour à toute l'équipe du forum
Bonjour à toute l'équipe du forum
-
nondediode
Amateur- Messages : 148
- Enregistré en : novembre 2018
- Localisation : Lyon
Bonjour à toute l'équipe du forum
bonjour nondediode,satinas,JJE,temps-x,Jérémy et tout le monde
Merci Satinas pour la correction de CE et de l'espace memoire, il faut vraiment que j'ouvre cette datasheet
Nondediode, la commande CtlAff 0x80 veut dire appel de la macro CtlAff et passage du parametre 0x80
la macro est
donc concrètement la ligne CtlAff 0x80 sera effacé et remplacé par
pareil pour la ligne
qui sera remplacé par
change les valeurs en fonction de la datasheet de ton écran que tu nous a posté en début de post, on ne sait jamais
Satinas, je vais essayer d'envoyer du graphisme comme tu m'as appris pour le ILI9341 si j'arrive a comprendre cette doc
Merci Satinas pour la correction de CE et de l'espace memoire, il faut vraiment que j'ouvre cette datasheet
Nondediode, la commande CtlAff 0x80 veut dire appel de la macro CtlAff et passage du parametre 0x80
la macro est
Code : Tout sélectionner
CtlAff macro ctr ; envoyer commande
movlw ctr
movwf CMD
call Envoi_cmd
endm
donc concrètement la ligne CtlAff 0x80 sera effacé et remplacé par
Code : Tout sélectionner
movlw 0x80
movwf CMD
call Envoi_cmd
pareil pour la ligne
Code : Tout sélectionner
DataAff_16 0x24, 0x1700 ; écrire en haut à gauche
qui sera remplacé par
Code : Tout sélectionner
movlw 0x24 ; chargement de la valeur pour la commande
movwf CMD ; envoi dans la variable pour traitement lors de l'appel de la sous routine Envoi_cmd
movlw 0x17 ; première partie de 0x1700
movwf DATA_H ; envoi dans la variable
movlw 0x00 ; seconde partie de 0x1700
movwf DATA_L ; envoi dans la variable
call Envoi_data_16
call Envoi_cmd
change les valeurs en fonction de la datasheet de ton écran que tu nous a posté en début de post, on ne sait jamais
Satinas, je vais essayer d'envoyer du graphisme comme tu m'as appris pour le ILI9341 si j'arrive a comprendre cette doc
Bonjour à toute l'équipe du forum
-
nondediode
Amateur- Messages : 148
- Enregistré en : novembre 2018
- Localisation : Lyon
Bonjour à toute l'équipe du forum
Code : Tout sélectionner
DataAff_16 0x24, 0x1700 ; écrire en haut à gauche
0x24 est la commande d'apres ton data cheet de l'affichage du texte et 0x1700 la valeur d'ou il doit etre affiché. tu peux toujours essayer avec une valeur inférieure ou supérieure, c,est ce que j'essai de comprendre
Bonjour à toute l'équipe du forum
JMarc le graphique c'est pareil que le mode texte. On se positionne dans la ram graphique, et on remplit des lignes de pixels, au lieu de lignes de caractères.
On renseigne une position avec la commande 0x24 suivie de l'adresse 16 bits en ram texte ou graphique.
Donc 0x1700 pour 1ère ligne et 1ère colonne texte dans notre cas, et 0x0000 pour le graphique.
la position est auto-incrémentée si l'on remplit avec la commande 0xc0.
Le mode texte a aussi un curseur clignotant, commande 0x21 suivie de la valeur 16 bits (ligne*256)+colonne. Il n'a rien à voir avec la position.
Faut pas trop s'acharner, le hard est-il bon, vaut mieux avoir toujours les pièces en double, ça peut éviter des prises de tête. Il faut vérifier à l'oscillo que les signaux arrivent en bon état au lcd.
La grosse cavalerie, faire une boucle qui envoie un caractère dans toute la ram, faut le faire bosser ce pic :)
Tester aussi le curseur clignotant
CmdAff 0x9f
DataAff_16 0x21, 0
Dans MplabX, il doit aussi y avoir moyen de remplacer les tabulations par des espaces, cela n'empêche pas d'utiliser les tabulations dans l'éditeur.
On renseigne une position avec la commande 0x24 suivie de l'adresse 16 bits en ram texte ou graphique.
Donc 0x1700 pour 1ère ligne et 1ère colonne texte dans notre cas, et 0x0000 pour le graphique.
la position est auto-incrémentée si l'on remplit avec la commande 0xc0.
Le mode texte a aussi un curseur clignotant, commande 0x21 suivie de la valeur 16 bits (ligne*256)+colonne. Il n'a rien à voir avec la position.
Faut pas trop s'acharner, le hard est-il bon, vaut mieux avoir toujours les pièces en double, ça peut éviter des prises de tête. Il faut vérifier à l'oscillo que les signaux arrivent en bon état au lcd.
La grosse cavalerie, faire une boucle qui envoie un caractère dans toute la ram, faut le faire bosser ce pic :)
Tester aussi le curseur clignotant
CmdAff 0x9f
DataAff_16 0x21, 0
Dans MplabX, il doit aussi y avoir moyen de remplacer les tabulations par des espaces, cela n'empêche pas d'utiliser les tabulations dans l'éditeur.
Bonjour à toute l'équipe du forum
Bonjour à toute l'équipe du forum
Bonjour,
pour éviter ces décalages lors de copier-coller, ou si l'on charge le source dans un éditeur de texte ayant des réglages de tabulation différents.
Code : Tout sélectionner
movlw 0x24 ; chargement de la valeur pour la commande
movwf CMD ; envoi dans la variable pour traitement lors de l'appel de la sous routine Envoi_cmd
movlw 0x17 ; première partie de 0x1700
movwf DATA_H ; envoi dans la variable
movlw 0x00 ; seconde partie de 0x1700
movwf DATA_L ; envoi dans la variable
call Envoi_data_16
call Envoi_cmd
pour éviter ces décalages lors de copier-coller, ou si l'on charge le source dans un éditeur de texte ayant des réglages de tabulation différents.
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 93 invités