Gestion d'un afficheur graphique REV4 - Ressources > Affichage et gestion clavier/menus - Articles et téléchargements
Gestion d'un afficheur graphique REV4 - Ressources > Affichage et gestion clavier/menus - Articles et téléchargements
Pseudo Pass se souvenir de moi     Créer un compte
ARTICLES et TELECHARGEMENTS ~ FORUMS ~ LIENS  
 
             
 
proposer
 
   
             
 
Catégories
 
   
             
 
Recherche
 
   
 

Gestion d'un afficheur graphique REV4

Publié par darknight le 05/11/2009 (6242 lectures)
A base de contrôleur Toshiba T6963c et en assembleur

***************************************************************
Note de mise à jour rév 4 :


  • déplacement de l'ajout des fonts utilisateurs dans la fonction LCD_INIT
  • ajout de texte attribut ( reverse , blinking , inhibit, .... )
  • ajout de fonction d'effacement de zone ( graphic, attribut et text )


TODO : à debugger : si les  attributs sont  en $1400 bug d'affichage du à la progress bar verticale


Note de mise à jour rév 3 :

  • ajout de caractères utilisateur
  • ajout d'un barre graphe horizontale et verticale lié au potentiomètre.
  • ajout de test suite à l'action sur les boutons poussoirs


Note de mise à jour rév 2 :

  • modif de la source en fin d'article : rév 2
  • bugfix dans l'initialisation + gestion automatique du nombre de caractère par ligne en fonction de l'état de la broche FS ( font select )
  • ajout d'une fonction d'incrémentation de la position du curseur. 
  • ajout de la fonction convertion décimal vers  BCD et BCD vers décimal ( article : http://www.68hc08.net/modules/publisher/item.php?itemid=68 )
  • affichage d'entrée CAN avec l'utilisation de la fonction BCD / décimal ( potentiomètre + capteur de luminosité et axe X et Y de l'accélerometre de la carte démo )

***************************************************************
Exemple avec l'affichage d'un graphique :

exemple

Référence de l'écran :
DG-24128-01  utilisé avec une carte démo 9s08aw60



Caracteres disponibles






























Brochage de l'écran


PIN NO.PIN OUTFUNCTION  DESCRIPTION
1FGND Frame Ground ( connected to Metal Bezel )
2GND Ground ( Signal Ground )
3Vdd Power Supply ( 5V )
4Vee Power Supply for LCD Drive ( should be variable )  ~ -10V à -15V 
5/WR Data Write
6/RD Data Read
7/CE Chip Enable
8C/D WR=’L’, C/D=’H’: Command Write
 WR=’L’, C/D=’L’: Data Write
 RD=’L’, C/D=’H’: Status Read
 RD=’L’, C/D=’L’: Data Read
9NC No connection
10/RST Reset Signal
11DB0 Data Bit 0
12DB1 Data Bit 1
13DB2 Data Bit 2
14DB3 Data Bit 3
15DB4 Data Bit 4
16DB5 Data Bit 5
17DB6 Data Bit 6
18DB7 Data Bit 7
19FS Select of Font    0
H : 6*8
L : 8*8 
20RV Reverse    
connect to Vdd: Positive mode
GND: Negative mode 



AC CHARACTERISTIC

(VDD=5.0V±10%, VSS=0V, Ta=0 to 50°)

Item

Symbol

Test Condition

Min.

Max.

Unit

C/D setup time

tCDS

-

100

-

nS

C/D Hold time

tCDH

-

10

-

CE, RD, WR pulse width

tCDS, tCDS, tCDS,

-

80

-

Data setup time

tDS

-

80

-

Data hold time

tDH

-

40

-

Access time

tACC

-

-

150

Output hold time

tOH

-

10

50

Timing Chart






Liste des commandes

CommandCodeD1D2Function
Register Set00100001

00100010

00100100
X addressX addressCursor pointer set
Data00HOffset register set
Low AddressHigh AddressAddress pointer set
Control Word Set01000000Low addressHigh addressText home address set
01000001Columns00HText area set
01000010Low addresshigh addressGraphic home address set
01000011Columns00HGraphic area set
Mode Set1000x000--‘OR’ mode
1000x001‘EXOR’ mode
1000x011‘AND’ mode
1000x100‘Text attribute’ mode
10000xxxInternal CG ROM mode
100111xxExternal CG ROM mode
Display Mode10010000--Display off
1001xx10Cursor on, blink off
1001xx11Cursor on, blink on
100101xxText on, graphic off
100110xxText off, graphic on
100111xxText on, graphic on
Cursor Pattern Select10100000--1 line cursor
101000012 lines cursor
101000103 lines cursor
101000114 lines cursor
101001005 lines cursor
101001016 lines cursor
101001107 lines cursor
101001118 lines cursor
Data Auto Read/Write10110000--Data auto write set
10110001Data auto read set
10110010Auto read
Data Read/Write11000000Data Data write and ADP increment
11000001-Data read and ADP increment
11000010DataData write and ADP decrement
11000011-Data read and ADP decrement
11000100DataData write and ADP nonvariable
11000101-Data read and ADP nonvariable
Screen Peak 11100000--Screen peak
Screen Copy11101000--Screen copy
Bit Set/Reset11110xxx--Bit reset
11111xxxBit set
1111x000Bit0(LSB)
1111x001Bit1
1111x010Bit2
1111x011Bit3
1111x100Bit4
1111x101Bit5
1111x110Bit6
1111x111Bit7(MSB)


X means ‘don’t care’.


Communication avec l'écran


Principe :

Avant l'envoi ou la lecture de donnée, il faut s'assurer que l'écran est prêt à traiter la demande.
C'est le registre status qui nous donne l'état du LCD :et il peut être lu suivant ces états :

RD  =  L
WR  = H
CE  = L
C / D  = H
D0 to D7 Status word

                           




























Note 1: il est nécessaire de lire STA0 and STA1 en même temps.
There is a possibility of erroneous operation due to a hardware interrupt.
Note 2: For most modes STA0 / STA1 are used as a status check.
Note 3: STA2 and STA3 are valid in Auto mode; STA0 and STA1 are invalid


Exemple


Brochage

;*****************
;* LCD CONTROLS  *
;*****************
PTG2 = !wr    ( write actif à l'état bas )
PTG3    = !rd   ( read actif à l'état bas )
PTF4    = !ce   ( chip enable actif à l'état bas )
PTF5    = c/!d  ( command / data )
PTC5    = fs    ( font select )
PTC3    = rv    ( reverse )
PORTA= DATA  ( bus de données )


;**************************************
;* LCD STATUS CHECK *
;**************************************
LCD_STATUS: MOV #$00,PTADD ;PORTA EN ENTREE
            BSET PTFD_PTFD5,PTFD ;LCD C/!D
            BCLR PTGD_PTGD3,PTGD ;!RD
            BCLR PTFD_PTFD4,PTFD ;LCD chip enable
            PSHA ; sauvegarde l'accu A
CHECK1:     LDA PTAD
            AND #$03 ; garde les 2 derniers bits ( STA0 et STA1 )
            CMP #$03 ; verifie si ces 2 bits sont à 1
            BNE CHECK1 ; STA0 et STA1 = 1 ? non on recommence
            BSET PTFD_PTFD4,PTFD ;LCD chip disable
            BSET PTGD_PTGD3,PTGD ;!RD
            MOV #$FF,PTADD ;PORTA EN SORTIE
            PULA ; restore l'accu A
            RTS
;*******************************************


status


Procédure d'envoi d'une commande avec 1 ou 2 données






Envoi d'une donnée


  • Envoi de la donnée sur le bus de donnes
  • Broche C/D sur position DATA
  • Broche WR actif 
  • Pulse sur la broche CE
  • Bbroche WR inactif

;***************************************
;* LCD SEND DATA 1 BYTE *
;***************************************
LCD_SEND_D1: JSR LCD_STATUS  ; status ok ?
             PSHH
             PSHX
             CLRH
             LDX #DIRECT_PR ; ou CLRX ( direct_pr = direct page register = $00 )
             STA PTAD,X ; la donnée est envoyé sur le PORTA
             PULX
             PULH
             BCLR PTFD_PTFD5,PTFD ;LCD C/!D ; c'est un donnée la broche 8 = 0
             BCLR PTGD_PTGD2,PTGD ;!WR ; ecriture actif
             BCLR PTFD_PTFD4,PTFD ;LCD chip enable ; on valide la donnée
             JSR TEMPOLCD ; min 80ns
             BSET PTFD_PTFD4,PTFD ;LCD chip disable
             BSET PTGD_PTGD2,PTGD ;!WR ;
             RTS

Note1 : il est toujours important de sauvegarder les registres ( ici H et X ) afin d'eviter les bugs.
Note2 : si la broche CE est connecté au GND, c'est la broche WR qui valide la donnée



Envoi d'une commande


Même principe que la donnée mais la broche C/D sur commande

;***************************************
;* LCD COMMAND SEND *
;***************************************
LCD_SEND_C: JSR LCD_STATUS
            PSHH
            PSHX
            CLRH
            LDX #DIRECT_PR
            STA PTAD,X
            PULX
            PULH
            BSET PTFD_PTFD5,PTFD ;LCD C/!D
            BCLR PTGD_PTGD2,PTGD ;!WR
            BCLR PTFD_PTFD4,PTFD ;LCD chip enable
            JSR TEMPOLCD
            BSET PTFD_PTFD4,PTFD ;LCD chip disable
            BSET PTGD_PTGD2,PTGD ;!WR
            RTS


Procédure d'envoi de données en autowrite mode



NOTE: Set address pointer est l'adresse où l'on souhaite écrire les données.
 
Lorsque le mode auto est actif, la lecture du status doit s'effectuer sur STA2 pour la lecture et STA3 pour l'écriture,  la donnée transmise / recue incrémente automatique le pointeur d'adresse.


;*******************************************
;* LCD STATUS CHECK FOR WRITE AUTO MODE *
;;*******************************************
STATUS_AUTO_WR: MOV #$00,PTADD ;PORTA EN ENTREE
                BSET PTFD_PTFD5,PTFD ;LCD C/!D
                BCLR PTGD_PTGD3,PTGD ;!RD
                BCLR PTFD_PTFD4,PTFD ;LCD chip enable
                PSHA
CHECK3:  LDA PTAD
                AND #$08 ; isole STA3
                CMP #$08
                BNE CHECK3
                BSET PTFD_PTFD4,PTFD ;LCD chip disable
                BSET PTGD_PTGD3,PTGD ;!RD
                MOV #$FF,PTADD ;PORTA EN SORTIE
                PULA
                RTS


La fonction LCD_ADP permet l'envoi du pointeur d'adresse :

  • Envoi la variable "ADP_L" sur le bus de données,
  • Envoi la variable "ADP_H" sur le bus de données,
  • Envoi la commande $24.

;*******************************************            
;*  LCD ADRESS POINTER                     *      
;*******************************************                        
                       
 LCD_ADP:   JSR LCD_STATUS
            PSHA
            LDA ADP_L  ;pas de # devant sinon récupère l'adresse de la variable
            PSHH
            PSHX
            CLRH
            LDX #DIRECT_PR ; ou CLRX
            STA PTAD,X
            PULX
            PULH
            PULA
            BCLR PTFD_PTFD5,PTFD  ;LCD C/!D
            BCLR PTGD_PTGD2,PTGD  ;!WR
            BCLR PTFD_PTFD4,PTFD  ;LCD chip enable
            JSR TEMPOLCD  
            BSET PTFD_PTFD4,PTFD  ;LCD chip disable
            BSET PTGD_PTGD2,PTGD  ;!WR
            ;second byte
            JSR LCD_STATUS
            PSHA
            LDA ADP_H
            PSHH
            PSHX
            CLRH
            LDX #DIRECT_PR
            STA PTAD,X
            PULX
            PULH
            PULA
            BCLR PTFD_PTFD5,PTFD  ;LCD C/!D
            BCLR PTGD_PTGD2,PTGD  ;!WR
            BCLR PTFD_PTFD4,PTFD  ;LCD chip enable
            JSR TEMPOLCD
            BSET PTFD_PTFD4,PTFD  ;LCD chip disable
            BSET PTGD_PTGD2,PTGD  ;!WR
            PSHA
            LDA #ADPSET   ; $24 SET ADDRESS  POINTER
            JSR LCD_SEND_C      ;ADRESS POINTER  
            PULA
            RTS 


Initialisation de l'écran


Principe :

  • Définir le mode (OR / AND / EXOR / Attribut),
  • Définir l'adresse de la zone graphique (Graphic Home Adress),
  • Définir la largeur de la zone graphique,
  • Définir l'adresse de la zone de text (Text Home Adress),
  • Définir la largeur de la zone de text,
  • ( facultatif ) Position du curseur,
  • ( facultatif ) type de curseur (1 à 8 lignes).



 L'afficheur comporte une mémoire de 8K qui peut être définie comme suit :

$0000*****************
         *
Graphic     
$1400*****************
         *
Text attribut*
$1700*****************
         * 
Text          * 
$1C00****************
         *
CGRAM     * 
$1FFF ***************


Exemple avec FS = 0 ( 8*8 ) :

; command
TXHOME      EQU $40     ;SET TXT HOME ADDRESS
TXAREA      EQU $41     ;SET TXT AREA
GRHOME      EQU $42     ;SET GR HOME ADDRESS POSITION
GRAREA      EQU $43     ;SET GR AREA
CUR_SET     EQU $21     ;SET CURSOR POINTER
ADR_OFFSET  EQU $22     ;SET OFFSET REGISTER
ADPSET      EQU $24     ;SET ADDRESS  POINTER
AWRON       EQU $B0     ;SET AUTO WRITE MODE
AWROFF      EQU $B2     ;RESET AUTO WRITE/READ MODE
LCDONTEXT   EQU $95     ;graphic_OFF/text_ON/cursor_OFF
LCDONGRAPH  EQU $98     ;graphic_ON/text_OFF/cursor_OFF
LCDONALL    EQU $9F     ;graphic_ON/text_ON/cursor_BLINK
DATAWR_UP   EQU $C0     ;data write up
DATARD_UP   EQU $C1     ;data read up
LCD_BCLR    EQU $F0     ;BIT CLEAR
LCD_BSET    EQU $F8     ;BIT SET

;variable
VAR1:     DS.B   1
DATA1:    DS.B   1
DATA2:    DS.B   1
ADP_H:    DS.B   1   ;text high adress
ADP_L:    DS.B   1   ;text low adress
FILL_C    DS.B   1   ;ERASE LCD RAM WITH THIS CHARACTER
DISPLAYON DS.B 1
X_ADR     DS.B 1
Y_ADR     DS.B 1

;********************************************************************** ;****************** INIT BEGIN
MOV #$00,DATA1 ;GRAPHIC HOME ADRESS
MOV #$00,DATA2
JSR LCD_SEND_D2
; envoi DATA1 puis DATA2 vers le bus de données
LDA #GRHOME      ;GRAPHIC HOME ADDRESS POSITION = $42
JSR LCD_SEND_C ; envoi la commande stocké dans l'accu A
;******************
MOV #$1E,DATA1
MOV #$00,DATA2
JSR LCD_SEND_D2
LDA #GRAREA
JSR LCD_SEND_C ;GRAPHIC AREA
;******************

MOV #$00,DATA1
MOV #$17,DATA2
JSR LCD_SEND_D2
LDA #TXHOME     ;TXHOME = COMMAND TEXT HOME ADDRESS = $40
JSR LCD_SEND_C
;******************
MOV #$1E,DATA1 ; $1E = 30 : L'écran aura 30 caractères par ligne
MOV #$00,DATA2
JSR LCD_SEND_D2
LDA #TXAREA
JSR LCD_SEND_C ;TEXT AREA
;******************
LDA #$80 ; OR MODE
JSR LCD_SEND_C
;****************** INIT END ;**********************************************************************



Effacement de L'affichage:

  • Positionner le pointeur d'adresse : fonction LCD_ADP
  • activer l'autowrite mode
  • remplir la zone mémoire par $00
  • désactiver l'automode

            JSR LCD_ADP       ;ADRESS POINTER
            ;******************
            JSR AUTOWRITE    ; AUTO WRITE MODE ON
            ;******************
            JSR LCD_CLR      ;CLEAR SCREEN
            ;******************
            JSR RESET_AM      ;RESET AUTO MODE

;*******************************************            
;*  LCD CLEAR SCREEN                       *      
;*******************************************                
LCD_CLR:    PSHH
            PSHX
            LDHX #$0000      
            PSHA
            LDA FILL_C     ; FILL MEMORY WITH THIS VARIABLE CHARACTER
BLANK1:     JSR LCD_SEND_AWR ;Transmet la variable sur le bus de données 
            AIX #$1 ; incremente X
            CPHX #LCDMEM ; compare X à la valeur de LCDMEM 8K = $1FFF
            BNE BLANK1
            PULH
            PULX
            PULA
            RTS




Informations utiles

 



Pour la partie texte :

1 écran (1 page),
8*8 PIXELS = 30 caractères * 16 lignes = 480 caractères  = $01E0,
6*8 PIXELS = 40 caractères * 16 lignes = 640 caractères = $0280.

Pour la partie graphique :
240*128 = 30720 PIXELS = $7800






Logiciels

Paint : pour la conversion d'image en BMP monochrome.
BIG-LCD : pour la conversion d'image BMP monochrome en données hexa lisible pour divers microcontrolleurs . liens : http://www.abcelectronique.com/bigonoff/biglcd.php?par=c2eda
FastLCD :
http://www.fastavr.com/fastlcd.zip

Tags: LCD   code_source  


Fichiers liés à cet article
Nom de fichier Publié le Hits
Télécharger ce fichier Projet complet REV4 au 5/11/2009
.
04/12/2009 339

Article précédent Article suivant
Article précédent Gestion d'un LCD en mode 8 bits
Les commentaires appartiennent à leurs auteurs. Nous ne sommes pas responsables de leur contenu.
Auteur Commentaire en débat
maverick59
Posté le: 14/11/2009 14:47  Mis à jour: 14/11/2009 14:47
Accro
Inscrit le: 29/08/2006
De: cambrai
Contributions: 658
 Re: Gestion d'un afficheur graphique REV4
c'est chez moi ou le lien vers le projet ne fonctionne pas?
darknight
Posté le: 14/11/2009 15:59  Mis à jour: 14/11/2009 15:59
Accro
Inscrit le: 28/09/2005
De: In Space
Contributions: 156
 Re: Gestion d'un afficheur graphique REV4
le liens est hs je t'envoi le projet par mp si c possible.
petitours
Posté le: 04/12/2009 22:46  Mis à jour: 04/12/2009 22:46
Administrateur
Inscrit le: 24/09/2005
De:
Contributions: 290
 Re: Gestion d'un afficheur graphique REV4
problème résolu

désolé :bug:
Powered by XOOPS© The XOOPS Project
Contacter les administrateurs

Gestion d'un afficheur graphique REV4 - Ressources > Affichage et gestion clavier/menus - Articles et téléchargements