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
Ecran tactile ILI9341
Bonjour a tous
Voici mon avancement sur l’écran que ma proposé Satinas et vous trouverez le lien ici https://www.banggood.com/fr/2_4-Inch-TFT-LCD-Shield-240320-Touch-Board-Display-Module-With-Touch-Pen-For-Arduino-UNO-p-1171082.html?rmmds=search
Datasheet du ILI9341 : ILI9341
Programme simple, juste l'initialisation puis affichage d'un petit rectangle
voir la présentation par notre ami Temps-x ecran TFT
la macro pour l'envoi des commandes et des données
l'initialisation
et le petit programme qui affiche une fenetre et fait une inversion d'affichage
si essai d'eteindre l'ecran pour tester les commandes et qu'il n'y a rien d'afficher, l'ecran reste allumé et on a l'impression que la commande ne fonctionne pas.
si un dessin est affiché, alors nous voyons bien que la commande agis
Voici mon avancement sur l’écran que ma proposé Satinas et vous trouverez le lien ici https://www.banggood.com/fr/2_4-Inch-TFT-LCD-Shield-240320-Touch-Board-Display-Module-With-Touch-Pen-For-Arduino-UNO-p-1171082.html?rmmds=search
Datasheet du ILI9341 : ILI9341
Programme simple, juste l'initialisation puis affichage d'un petit rectangle
voir la présentation par notre ami Temps-x ecran TFT
la macro pour l'envoi des commandes et des données
Code : Tout sélectionner
Envoi_cmd
bcf LCD_RS
clrf LATD
bcf LCD_WR
nop
bsf LCD_WR
movwf LATD
bcf LCD_WR
nop
bsf LCD_WR
return
Envoi_data_8
bsf LCD_RS
movwf LATD
bcf LCD_WR
nop
bsf LCD_WR
clrf LATD
return
Envoi_data_16
bsf LCD_RS
clrf LATD
bcf LCD_WR
nop
bsf LCD_WR
movwf LATD
bcf LCD_WR
nop
bsf LCD_WR
clrf LATD
return
l'initialisation
Code : Tout sélectionner
;****************************************************************
; Debut initialisation
;*****************************************************************
Tempo_10ms .100
bcf LCD_CS
bsf LCD_WR
bsf LCD_RD
bsf LCD_RST
Tempo_10ms .20
bcf LCD_RST
Tempo_10ms .10
bsf LCD_RST
Tempo_10ms .20
movlw 0x01 ; reset
rcall Envoi_cmd
Tempo_10ms .10
movlw 0x3A ; colmod
rcall Envoi_cmd
movlw 0x55 ; 16 bits/pixel 65K couleurs rgb 565 '1010101'
rcall Envoi_data_16
movlw 0x11 ; sleep out
rcall Envoi_cmd
movlw 0x29 ; ecran on
rcall Envoi_cmd
;************************Fin de l'initialisation********
et le petit programme qui affiche une fenetre et fait une inversion d'affichage
Code : Tout sélectionner
movlw D'216'
movwf c1 ; quelques variables pour les boucles
movlw D'255'
movwf c2
movlw .20
movwf c3
movlw D'255'
movwf c01
;***************************************************** rectangle 1
movlw 0x2A ; set colonne adress
rcall Envoi_cmd
movlw 0x1F
rcall Envoi_data_16
movlw .100
rcall Envoi_data_16
movlw 0x1F
rcall Envoi_data_16
movlw .100
rcall Envoi_data_16
movlw 0x2B ; set page
rcall Envoi_cmd
movlw 0x1F
rcall Envoi_data_16
movlw .100
rcall Envoi_data_16
movlw 0x1F
rcall Envoi_data_16
movlw .100
rcall Envoi_data_16
movlw 0x2C ; memory write
rcall Envoi_cmd
boucle2
movlw 0xF0 ; 1 pixel rouge
rcall Envoi_data_8
movlw 0x00
rcall Envoi_data_8
movlw 0x00 ; 1 pixel rouge
rcall Envoi_data_8
movlw 0x08
rcall Envoi_data_8
decfsz c01,f
bra boucle2
decfsz c02,f
bra boucle2
Tempo_10ms .100
altern
movlw 0x21 ; display inversion on
rcall Envoi_cmd
movlw 0x00
Tempo_10ms .300
movlw 0x20 ; display inversion off
rcall Envoi_cmd
movlw 0x00
rcall Envoi_cmd
Tempo_10ms .300
bra altern
si essai d'eteindre l'ecran pour tester les commandes et qu'il n'y a rien d'afficher, l'ecran reste allumé et on a l'impression que la commande ne fonctionne pas.
si un dessin est affiché, alors nous voyons bien que la commande agis
Ecran tactile ILI9341
Ecran tactile ILI9341
Bonsoir Satinas
Ok j'essai demain en Envoi_data_8
Je ne comprend pas la datasett, Pour les commandes aussi j'envoie en 2 fois sinon cela ne fonctionne pas mais je ré vérifie demain soir
Pour la largeur et hauteur de colum adress et page adress, la première donnés me done la marge du rectangle et la seconde donnée la largeur (hauteur pour page) mais les deux autres données ?
Comment faire pour afficher plusieurs rectangles ? Car ils se superposes pour l'instant
Ok j'essai demain en Envoi_data_8
Je ne comprend pas la datasett, Pour les commandes aussi j'envoie en 2 fois sinon cela ne fonctionne pas mais je ré vérifie demain soir
Pour la largeur et hauteur de colum adress et page adress, la première donnés me done la marge du rectangle et la seconde donnée la largeur (hauteur pour page) mais les deux autres données ?
Comment faire pour afficher plusieurs rectangles ? Car ils se superposes pour l'instant
Ecran tactile ILI9341
Bonjour JMarc,
Le contrôleur ILI9341 attend des commandes 8 bits. Ces commandes permettent de remplir des registres qui définissent son comportement. Selon les commandes les données envoyées sont de taille différente :
- 0 octet (display ou sleep off/on)
- 1 octet pour les réglages divers
- 2 octets pour les couleurs ou coordonnées 16 bits (octet poids fort, ensuite octet poids faible)
- 15 octets pous les corrections gamma
- ...
La commande 0x3a doit être suivie d'un octet pour déclarer qu'on travaille avec des couleurs 16 bits (0x55).
La commande 0x36 idem, elle définit entre-autres l'orientation. L'octet comporte 4 bits de réglage :
- flag inversion des x et y (mode portrait ou paysage)
- flag rotation à 180° sur les x
- flag rotation à 180° sur les y
- flag inversion du rouge et du bleu (à voir, dépend du lcd)
La commande 0x2a envoie les coordonnées en x des 2 points qui délimitent le rectangle à remplir (confusion, pas de marge ni largeur)
Les coordonnées sont sur 16 bits car 319 est supérieur à 255, et elles ont pour origine le haut/gauche de l'écran. Donc derrière cette commande on envoie 2 valeurs 16 bits. Idem avec 0x2b pour les y.
La commande 0x2c envoie aussi des valeurs 16 bits, les couleurs de tous les points du rectangle plein.
Ton sous-programme Send_Data_16 est un bon début pour envoyer une valeur 16 bits, mais comme il envoie toujours 0x00 comme octet de poids fort, on ne peut envoyer que des valeurs 16 bits de 0 à 255.
Il est suffisant pour les premiers essais avec des coordonnées de faible valeur. Il vaut mieux de toute façon ne pas dépasser 239 tant que l'on ne maîtrise pas encore l'orientation du lcd.
Tu peux aussi l'utiliser pour envoyer les couleurs 16 bits, en te limitant à des valeurs inférieures à 256.
Le format des couleurs 16 bits étant rgb565 -> B'rrrrrggggggbbbbb'
Exemple du noir 0x0000, ou du bleu 0x001f B'0000000000011111'
Ensuite il faudra revoir Send_Data_16 pour qu'il envoie du vrai 16 bits 0x0000 à 0xFFFF. J'avais utilisé une macro pour faire ça sans me replonger dans l'assembleur, mais toi, c'est différent, faut rentrer dans le moteur :)
Il faut shifter les 8 bits de poids fort, les envoyer avec Send_Data_8, puis envoyer les 8 bits de poids faible.
Dans ton code fais un Send_Data_8 derrière les commandes 0x3A et 0x36, et 2 Send_Data_16 derrière 0x2A ou 0x2B (toi, tu en fais 4)
J'espère que c'est compréhensible, je veux pas t'embrouiller ...
Bonne journée
Le contrôleur ILI9341 attend des commandes 8 bits. Ces commandes permettent de remplir des registres qui définissent son comportement. Selon les commandes les données envoyées sont de taille différente :
- 0 octet (display ou sleep off/on)
- 1 octet pour les réglages divers
- 2 octets pour les couleurs ou coordonnées 16 bits (octet poids fort, ensuite octet poids faible)
- 15 octets pous les corrections gamma
- ...
La commande 0x3a doit être suivie d'un octet pour déclarer qu'on travaille avec des couleurs 16 bits (0x55).
La commande 0x36 idem, elle définit entre-autres l'orientation. L'octet comporte 4 bits de réglage :
- flag inversion des x et y (mode portrait ou paysage)
- flag rotation à 180° sur les x
- flag rotation à 180° sur les y
- flag inversion du rouge et du bleu (à voir, dépend du lcd)
La commande 0x2a envoie les coordonnées en x des 2 points qui délimitent le rectangle à remplir (confusion, pas de marge ni largeur)
Les coordonnées sont sur 16 bits car 319 est supérieur à 255, et elles ont pour origine le haut/gauche de l'écran. Donc derrière cette commande on envoie 2 valeurs 16 bits. Idem avec 0x2b pour les y.
La commande 0x2c envoie aussi des valeurs 16 bits, les couleurs de tous les points du rectangle plein.
Ton sous-programme Send_Data_16 est un bon début pour envoyer une valeur 16 bits, mais comme il envoie toujours 0x00 comme octet de poids fort, on ne peut envoyer que des valeurs 16 bits de 0 à 255.
Il est suffisant pour les premiers essais avec des coordonnées de faible valeur. Il vaut mieux de toute façon ne pas dépasser 239 tant que l'on ne maîtrise pas encore l'orientation du lcd.
Tu peux aussi l'utiliser pour envoyer les couleurs 16 bits, en te limitant à des valeurs inférieures à 256.
Le format des couleurs 16 bits étant rgb565 -> B'rrrrrggggggbbbbb'
Exemple du noir 0x0000, ou du bleu 0x001f B'0000000000011111'
Ensuite il faudra revoir Send_Data_16 pour qu'il envoie du vrai 16 bits 0x0000 à 0xFFFF. J'avais utilisé une macro pour faire ça sans me replonger dans l'assembleur, mais toi, c'est différent, faut rentrer dans le moteur :)
Il faut shifter les 8 bits de poids fort, les envoyer avec Send_Data_8, puis envoyer les 8 bits de poids faible.
Dans ton code fais un Send_Data_8 derrière les commandes 0x3A et 0x36, et 2 Send_Data_16 derrière 0x2A ou 0x2B (toi, tu en fais 4)
J'espère que c'est compréhensible, je veux pas t'embrouiller ...
Bonne journée
Ecran tactile ILI9341
Bonjour Satinas
je ne tenais plus ce matin, j'ai changé Envoi_data_16 en Envoi_data_8 et miracle la couleur est là
Tes explications sont tres claires, merci, la preuve, j'y arrive
bien sur je vais faire tout cela avec des macros pour que le source soit plus clair
Du coup en changeant les octets de couleurs, j'arrive à écrire dans la fenêtre.
Je suppose qu'il faut faire une fenêtre par lettre
je ne tenais plus ce matin, j'ai changé Envoi_data_16 en Envoi_data_8 et miracle la couleur est là
Tes explications sont tres claires, merci, la preuve, j'y arrive
Code : Tout sélectionner
movlw 0x36 ; memory access control
rcall Envoi_cmd
movlw b'11111100'
rcall Envoi_data_8
Code : Tout sélectionner
movlw 0x2A ; set colonne adress
rcall Envoi_cmd
movlw 0x00
rcall Envoi_data_8
movlw 0x0F
rcall Envoi_data_8
movlw .0
rcall Envoi_data_8
movlw .100
rcall Envoi_data_8
bien sur je vais faire tout cela avec des macros pour que le source soit plus clair
Du coup en changeant les octets de couleurs, j'arrive à écrire dans la fenêtre.
Je suppose qu'il faut faire une fenêtre par lettre
Ecran tactile ILI9341
Ecran tactile ILI9341
Ecran tactile ILI9341
Ca avance, bravo.
Ton sous-programme Envoi_Cmd doit n'envoyer qu'un seul octet, tu as peut être déjà rectifié entre-temps.
Pour bien comprendre la différence entre macro et sous-programme, revoir le cours Bigonoff.
Les macros sont un truc en plus ajouté à l'assembleur, qui devient un MACRO-assembleur. Elles sont traitées avant la phase d'assemblage car ce n'est que du traitement de texte.
bye
Ton sous-programme Envoi_Cmd doit n'envoyer qu'un seul octet, tu as peut être déjà rectifié entre-temps.
Pour bien comprendre la différence entre macro et sous-programme, revoir le cours Bigonoff.
Les macros sont un truc en plus ajouté à l'assembleur, qui devient un MACRO-assembleur. Elles sont traitées avant la phase d'assemblage car ce n'est que du traitement de texte.
bye
Ecran tactile ILI9341
Ecran tactile ILI9341
Bonsoir JMarc, satinas, jérémY, et tous le forum,
JMarc pour ta ténacité, et satinas pour tes conseils, ne vous inquiété pas je vous suis de loin, enfin de très loin.
Actuellement j'ai mis temporairement la programmation de l'écran de coté, car je fais un PCB pour y mettre l'écran, pour divers PIC,
Je la mettrais à disposition sur le forum, une fois terminer.
Je vous souhaite une bonne continuation. ( I will come back )
A+
JMarc pour ta ténacité, et satinas pour tes conseils, ne vous inquiété pas je vous suis de loin, enfin de très loin.
Actuellement j'ai mis temporairement la programmation de l'écran de coté, car je fais un PCB pour y mettre l'écran, pour divers PIC,
Je la mettrais à disposition sur le forum, une fois terminer.
Je vous souhaite une bonne continuation. ( I will come back )
A+
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 86 invités