Gestion d'un afficheur graphique REV4
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 )
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 :
  • 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 :
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 OUT FUNCTION DESCRIPTION 1 FGND Frame Ground ( connected to Metal Bezel ) 2 GND Ground ( Signal Ground ) 3 Vdd Power Supply ( 5V ) 4 Vee Power Supply for LCD Drive ( should be variable ) ~ -10V à -15V 5 /WR Data Write 6 /RD Data Read 7 /CE Chip Enable 8 C/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 9 NC No connection 10 /RST Reset Signal 11 DB0 Data Bit 0 12 DB1 Data Bit 1 13 DB2 Data Bit 2 14 DB3 Data Bit 3 15 DB4 Data Bit 4 16 DB5 Data Bit 5 17 DB6 Data Bit 6 18 DB7 Data Bit 7 19 FS Select of Font 0 H : 6*8 L : 8*8 20 RV Reverse connect to Vdd: Positive mode GND: Negative mode

CHARACTERISTIC

Timing Chart

Liste des commandes 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

télécharger le projet complet rev4