Bonsoir,
Tout d’abord je tien a préciser que c’est le premier LCD sur le quelle je travaille depuis que j’ai démarré l’aventures des PIC.
Ayant pu récupère un LCD de type KS0713 sur un D.A.P de créative HS, et voulais l’utiliser pour mes montages électronique,
je me suis donc lancer dans l’aventure en cherchant un maximum d’informations sur ce LCD.
Je suis donc tombé sur ce lien http://www.techdesign.be/projects/042/042.htm
Ou j’ai pu trouver un code en C++ pour PIC18F452 et les datasheet me permettant ainsi de comprendre comment utiliser mon LCD.
Le petit souci est que je ne programme pas en c++ et que je ne dispose pas non plu d’un PIC18F452.
J’ai donc tenté d’écrire le début de l’initialisation de mon LCD en ASM pour un PIC16F627, mais j’errais voulu avoir vos avis sur ce que j’ai déjà fait.
source du code : http://users.skynet.be/fb138099/627_04_LCD.asmCode:;********************************************************************** ; * ; Programme pour réalisation d'un controleur LCD KS0713 * ; * ; * ;********************************************************************** ; * ; NOM: LED_DS * ; Date: 16/10/2006 * ; Version: 1.0 * ; Circuit: LCD KS0713 * ; Auteur: Dreamstyle * ; * ;********************************************************************** ; * ; Fichier requis: P16F627.inc * ; * ;********************************************************************** ; * ; Notes: controleur du LCD KS0713 * ; * ;********************************************************************** LIST p=16F627 ; Définition de processeur #include <p16F627.inc> ; Définitions de variables __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF & _MCLRE_OFF ; '__CONFIG' précise les paramètres encodés dans le processeur au moment de ; la programmation du processeur. Les définitions sont dans le fichier include. ; Voici les valeurs et leurs définitions : ; _CP_ON Code protection ON : impossible de relire ; _CP_OFF Code protection OFF ; _PWRTE_ON Timer reset sur power on en service ; _PWRTE_OFF Timer reset hors-service ; _WDT_ON Watch-dog en service ; _WDT_OFF Watch-dog hors service ; _LP_OSC Oscillateur quartz basse vitesse ; _XT_OSC Oscillateur quartz moyenne vitesse ; _HS_OSC Oscillateur quartz grande vitesse ; _RC_OSC Oscillateur à réseau RC ;********************************************************************* ; ASSIGNATIONS * ;********************************************************************* OPTIONVAL EQU B'00001000' ; Valeur registre option ;********************************************************************* ; DEFINE * ;********************************************************************* #DEFINE MI PORTA,0 ; LCD_MI #DEFINE E PORTA,1 ; LCD_E #DEFINE RW PORTA,2 ; LCD_RW #DEFINE RS PORTA,3 ; LCD_RS #DEFINE RST PORTA,4 ; LCD_RST #DEFINE CS1B PORTA,6 ; LCD_CS1B #DEFINE DB0 PORTB,0 ; DB0 #DEFINE DB1 PORTB,1 ; DB1 #DEFINE DB2 PORTB,2 ; DB2 #DEFINE DB3 PORTB,3 ; DB3 #DEFINE DB4 PORTB,4 ; DB4 #DEFINE DB5 PORTB,5 ; DB5 #DEFINE DB6 PORTB,6 ; DB6 #DEFINE DB7 PORTB,7 ; DB7 #DEFINE LCD_PORT TRISB ; LCD_PORT #DEFINE LED_LCD_STATUS PORTA,7 ; LED ;********************************************************************* ; MACRO * ;********************************************************************* ; #### Sortie ON #### ;EX: ;--- ;LED_1_ON macro ; bsf LED1 ; endm ;________________________________________________________________ ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° ; Bank 0 & 1 & 2 & 3 ; ------------------ goto_bank0 macro ; sélectionner banque 0 bcf STATUS,RP0 bcf STATUS,RP1 endm goto_bank1 macro ; sélectionner banque 1 bsf STATUS,RP0 bcf STATUS,RP1 endm goto_bank2 macro ; sélectionner banque 2 bcf STATUS,RP0 bsf STATUS,RP1 endm goto_bank3 macro ; sélectionner banque 3 bsf STATUS,RP0 bsf STATUS,RP1 endm ;********************************************************************* ; DECLARATIONS DE VARIABLES * ;********************************************************************* BUSY_1 EQU 0x7B ; variable nécessaire a la temporisation de 500µS NB_TEMPO EQU 0x7C ; variable pour indiquer le nombre de tempo de 500µS a effectuer CBLOCK 0x020 ; début de la zone variables ; /!\ ATTENTION : a ne pas utiliser si on définit ; des mémoires manuellement ENDC ; fin des déclarations memory avec attribution automatique ( :1) ;********************************************************************** ; DEMARRAGE SUR RESET * ;********************************************************************** org 0x000 ; Adresse de départ après reset goto init ; Adresse 0: initialiser ;********************************************************************* ; INITIALISATIONS * ;********************************************************************* init clrf PORTA ; Sorties portA à 0 clrf PORTB ; sorties portB à 0 bsf STATUS,RP0 ; sélectionner banque 1 clrf EEADR ; permet de diminuer la consommation movlw OPTIONVAL ; charger masque movwf OPTION_REG ; initialiser registre option ; Effacer RAM ; ------------ movlw 0x020 ; initialisation pointeur movwf FSR ; pointeur d'adressage indirec init1 clrf INDF ; effacer ram incf FSR,f ; pointer sur suivant movf FSR, w sublw 0x080 btfss STATUS, Z goto init1 ; non, boucler movlw 0x0A0 ; initialisation pointeur movwf FSR ; pointeur d'adressage indirec init2 clrf INDF ; effacer ram incf FSR,f ; pointer sur suivant movf FSR, w sublw 0x0F0 btfss STATUS, Z goto init2 ; non, boucler bsf STATUS, IRP ; je passe en Bank 2&3 (pour accès indirecte) movlw 0x020 ; initialisation pointeur movwf FSR ; pointeur d'adressage indirec init3 clrf INDF ; effacer ram incf FSR,f ; pointer sur suivant movf FSR, w sublw 0x050 btfss STATUS, Z goto init3 ; non, boucler bcf STATUS, IRP ;; je revin en Bank 0&1 (pour accès indirecte) ; initialisations spécifiques ; ---------------------------- clrf TRISA ; TRISA en sortie (banque1) clrf LCD_PORT ; LCD DB en sortie (banque1) ; bcf LCD_DB0 ; LCD_DB0 en sortie (banque1) ; bcf LCD_DB1 ; LCD_DB1 en sortie (banque1) ; bcf LCD_DB2 ; LCD_DB2 en sortie (banque1) ; bcf LCD_DB3 ; LCD_DB3 en sortie (banque1) ; bcf LCD_DB4 ; LCD_DB4 en sortie (banque1) ; bcf LCD_DB5 ; LCD_DB5 en sortie (banque1) ; bcf LCD_DB6 ; LCD_DB6 en sortie (banque1) ; bcf LCD_DB7 ; LCD_DB7 en sortie (banque1) bcf STATUS,RP0 ; repasser banque 0 MOVLW B'00000111' ;Disable Comparator module's MOVWF CMCON goto start ; sauter au programme principal ;********************************************************************* ; CODE ERREUR * ;********************************************************************* ERR#1 ERR#2 ERR#3 ERR#4 ;********************************************************************* ; LES CALL IDEPENDENT * ;********************************************************************* ;************************************\ ; TEMPO 500 µS ;************************************/ START_TEMPO movwf NB_TEMPO ; Temporisation : dure 500µs x "la valeur contenue dans W" boucle movlw .123 movwf BUSY_1 boucle1 NOP decfsz BUSY_1,1 goto boucle1 decfsz NB_TEMPO,1 goto boucle return ;************************************\ ; LED_LCD_STATUS ON/OFF ;************************************/ led@ON bsf LED_LCD_STATUS return led@OFF bcf LED_LCD_STATUS return ;********************************************************************* ; SOUS PROGRAMMES * ;********************************************************************* ;********************************************************************* ; PROGRAMME PRINCIPAL * ;********************************************************************* start movlw .200 ;// 200x 500µS call START_TEMPO ;// TEMPO 100 ms bsf CS1B ;// LCD sélectioner bcf RST ;// RST 0 movlw .20 ;// 20x 500µS call START_TEMPO ;// TEMPO 10 ms bsf RST ;// RST 1 movlw .2 ;// 2x 500µS call START_TEMPO ;// TEMPO 1 ms BCF RS ;// RS 0 BCF RW ;// RW 0 movlw 0xe2 ;// reset movwf LCD_PORT ;// Envoyer commande movlw .30 ;// 30 x 500µS call START_TEMPO ;// TEMPO 15 ms movlw 0xa0 ;// ADC select: normal movwf LCD_PORT ;// Envoyer commande movlw .30 ;// 30 x 500µS call START_TEMPO ;// TEMPO 15 ms movlw 0xc0 ;// SHL select: movwf LCD_PORT ;// Envoyer commande movlw .30 ;// 30 x 500µS call START_TEMPO ;// TEMPO 15 ms movlw 0xb2 ;// LCD bias select movwf LCD_PORT ;// Envoyer commande movlw .30 ;// 30 x 500µS call START_TEMPO ;// TEMPO 15 ms movlw 0x2c ;// Voltage converter ON movwf LCD_PORT ;// Envoyer commande movlw .30 ;// 30 x 500µS call START_TEMPO ;// TEMPO 15 ms movlw 0x2e ;// Voltage regulator ON movwf LCD_PORT ;// Envoyer commande movlw .30 ;// 30 x 500µS call START_TEMPO ;// TEMPO 15 ms movlw 0x2f ;// Voltage follower ON movwf LCD_PORT ;// Envoyer commande movlw .30 ;// 30 x 500µS call START_TEMPO ;// TEMPO 15 ms movlw 0x25 ;// Regulator resistor select 0x20..0x27 movwf LCD_PORT ;// Envoyer commande movlw .30 ;// 30 x 500µS call START_TEMPO ;// TEMPO 15 ms movlw 0x81 ;// Reference voltage register set movwf LCD_PORT ;// Envoyer commande movlw .30 ;// 30 x 500µS call START_TEMPO ;// TEMPO 15 ms movlw 0x18 ;// Reference voltage 0..63 movwf LCD_PORT ;// Envoyer commande movlw .30 ;// 30 x 500µS call START_TEMPO ;// TEMPO 15 ms movlw 0x40 ;// initial display line 0x40..0x7f movwf LCD_PORT ;// Envoyer commande movlw .30 ;// 30 x 500µS call START_TEMPO ;// TEMPO 15 ms movlw 0xa7 ;// Reverse display ON movwf LCD_PORT ;// Envoyer commande movlw .30 ;// 30 x 500µS call START_TEMPO ;// TEMPO 15 ms movlw 0xaf ;// display ON movwf LCD_PORT ;// Envoyer commande movlw .30 ;// 30 x 500µS call START_TEMPO ;// TEMPO 15 ms ;-----------FIN DE L'INITIALISATION DU LCD----------- bsf STATUS,RP0 ;// repasser banque 1 movlw 0xFF ;// B'11111111' movwf LCD_PORT ;// LCD_PORT en entrer (banque1) bcf STATUS,RP0 ;// repasser banque 0 bsf RW ;// RW 1 TEST_LCD_ON btfss DB5 ;// Tester so DB5 = 1 call led@ON ;// NON, LED_LCD_STATUS = ON call led@OFF ;// OUI, LED_LCD_STATUS = OFF goto TEST_LCD_ON ;// Boucler END ;// directive FIN de programme ;-----------!!!!!!!!!!!!!!!!!! END !!!!!!!!!!!!!!!!!!--------------
Alors j’ai déjà quelques questions …
Première question est que normalement je devrai avoir ma LED « LED_LCD_STATUS » allumé. Car je lie le registre DB5 du LCD, et vu que normalement après l’initialisation, le LCD devrai être sur ON.
Je pense donc qu’il doit y avoir un problème.
Read Status : http://users.skynet.be/fb138099/READ_S.JPG
2em question, j’ai configuré mon LCD pour fonctionner en mode « Reverse display ON » ce qui voudrais dire (si je ne me trompe pas) que mon LCD devrai être avec les PIXEL noir, même si je n’ai encore envoyé de données à l’afficher LCD, une fois l’initialisation terminer.
Alors que ici rien !
3em question, ce qui me parais bizarre dans mon code, c’est que contrairement à la version C++ du code programmer pour le PIC18F452 sur le quelle je me suis quand même baser avec l’aide du datasheet pour créé mon code ASM, c’est que je n’ai pas de clock.
Étant donnée que je travaille en mode 8 bit et non en série comme le code C++ sur le quelle je me suis basé, j’errais donc voulu savoir si j’ai mal comprit le datasheet et si il me faut aussi gérer un clock, et dans le cas ou je dois le gérer si vous pourriez m’en dire quelques mots.
Voila je remercie d’avance déjà tout ceux qui ont lu mon post et m’aiderons a la réalisation de se programme.
Je joins si dessous les datasheet que j’ai trouvés sur le contrôleur KS0713.
Datasheet :
http://docs-europe.electrocomponents...6b806dda2d.pdf
http://www.ortodoxism.ro/datasheets/...c/mXyzvqzy.pdf
-----