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