[Utiliser un afficheur LCD]
[CodeVision]

Je ne vais pas vous faire un tuto sur l’utilisation d’un afficheur LCD intéligent, vous en trouverez des tonnes en cherchant un peu sur google.
Par contre comment s’en servir en deux coups
de cueillere à pot avec CodeVision c’est déjà
plus intéressant.
Il permet de générer automatiquement une partie du code nécessaire à la gestion de l'afficheur.
Tools->CodeWizardAVR->LCD
1. Choisir Le port sur lequel l'afficheur sera connecté.
2. Choisir le nombre de caractères par ligne (LCD 2x16 =>16)
3. Le cablage qui doit être réalisé.
File -> Generate, Save and Exit
Le code qui est alors automatiquement généré :
#include <90s8535.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 ;PORTC #endasm #include <lcd.h> // Declare your global variables here void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port A initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00; DDRA=0x00; // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // Port C initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00; // Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped TCCR0=0x00; TCNT0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off GIMSK=0x00; MCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off // Analog Comparator Output: Off ACSR=0x80; // LCD module initialization lcd_init(16); while (1) { // Place your code here }; } |
| Broche N° | Nom | Niveau | Fonction |
| 1 | Vss | 0V | Alimentation |
| 2 | Vcc | 5V | Alimentation |
| 3 | V0 | 0 à 5V | Contraste |
| 4 | RS | H/L | 0 = instruction 1 = caractère |
| 5 | R/W | H/L | 0 = écriture 1 = lecture |
| 6 | E | H --> L | Enable (front descendant) |
| 7 | D0 | H/L | Donnée LSB |
| 8 | D1 | H/L | Donnée |
| 9 | D2 D2 | H/L | Donnée |
| 10 | D3 | H/L | Donnée |
| 11 | D4 | H/L | Donnée |
| 12 | D5 | H/L | Donnée |
| 13 | D6 | H/L | Donnée |
| 14 | D7 | H/L | Donnée MSB |
| 15 | A | 0 à 5V | Anode - LED de rétro éclairage |
| 16 | K | 0V | Cathode - LED de rétro éclairage |
Fonction de niveau bas:
void _lcd_ready(void)
Attend que le LCD soit prêt à recevoir une commande.
Cette fonction doit être appelée avant l’envoi d’une commande au LCD avec la fonction _lcd_write_data.
void _lcd_write_data(unsigned char data)
Envoi une commande au LCD. Cette fonction peut être utilisée pour modifier la configuration du LCD.
EX:
/* Active l’affichage du curseur */ _lcd_ready(); _lcd_write_data(0xe); |
La commande 0xe ou 1110b correspond à une commande Display on/off control avec D=1 (display on) C=1 (cursor on) B=0 (blink off)
| ADDRESSES INSTRUCTION | RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
| Display clear | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| Cursor home | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | * |
| Entry mode set | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | I/D | S |
| Display on/off control | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | B |
| Cursor display shift | 0 | 0 | 0 | 0 | 0 | 1 | S/C | R/L | * | * |
| Function set | 0 | 0 | 0 | 0 | 1 | DL | 1 | 0 | * | * |
| CG RAM address set | 0 | 0 | 0 | 1 | ACC | |||||
| DD RAM address set | 0 | 0 | 1 | ADD | ||||||
| Busy flag/address read | 0 | 1 | BF | AC | ||||||
| CG RAM/DD RAM data write | 1 | 0 | Write data | |||||||
| CG RAM/DD RAM data read | 1 | 1 | Read data | |||||||
* = le niveau importe, donc la valeur du bit n'est pas prise en compte
ACC = adresse de la CG RAM
ADD = adresse de la DD RAM, correspond à l'adresse courante du curseur
AC = Address Counter, utilisé pour les adresses des DD et CG RAM
I/D = 1/0 : increment/decrement
S/C = 1/0 : display shift/cursor move
S = 1/0 : display shift/freeze
R/L = 1/0 : right/left shift
D = 1/0 : display on/off
DL = 1/0 : 8/4 bits data bus
C = 1/0 : cursor on/off
BF = 1/0 : during/end of internal operation
B = 1/0 : character at cursor position blinks/does not blinks
void lcd_write_byte(unsigned char addr, unsigned char data);
Ecrit un octet dans le générateur de caractère du LCD ou dans la RAM d’affichage.
EX:
#include <90s8535.h> /*L'afficheur LCD est connecté au port C*/ #asm .equ __lcd_port=0x15 ;PORTC #endasm #include <lcd.h> typedef unsigned char byte; /* La caractère qu'on veut créer (une flèche)*/ flash byte char0[8]={ 0b0000000, 0b0001111, 0b0000011, 0b0000101, 0b0001001, 0b0010000, 0b0100000, 0b1000000}; /* La fonction utilisée pour définir le caractère */ void define_char(byte flash *pc,byte char_code) { byte i,a; a=(char_code<<3) | 0x40; for (i=0; i<8; i++) lcd_write_byte(a++,*pc++); } void main(void) { /* Initialisation de l'afficheur LCD 2 lignes 16 colonnes */ lcd_init(16); /* Définit le caractère */ define_char(char0,0); /* Affiche à partir de la ligne 0 et de la colonne 0 la chaîne de caractère */ lcd_gotoxy(0,0); lcd_putsf("Caractere 0:"); /* Affiche le caractère */ lcd_putchar(0); while (1); /* Boucle sans fin */ } |
Fonction de niveau haut:
unsigned char lcd_read_byte(unsigned char addr);
Lit un octet dans le générateur de caractère du LCD ou dans la RAM d’affichage.
unsigned char lcd_init(unsigned char lcd_columns)
Initialise le LCD, efface l’afficheur et met le pointeur d’affichage sur la 1ere ligne et la 1ere colonne. Le nombre de colonnes doit être spécifié. Le curseur n’est pas affiché.
Cette fonction retourne 1 si le LCD est détecté et 0 si ce n’est pas le cas.
C’est la première fonction qui doit être appelée avant les autres fonctions de niveau haut.
void lcd_clear(void)
Efface l’afficheur et met le pointeur d’affichage sur la 1ere ligne et la 1ere colonne.
void lcd_gotoxy(unsigned char x, unsigned char y)
Déplace le pointeur d’affichage à la colonne x et la ligne y. La numérotation des lignes et des colonnes commence à 0.
void lcd_putchar(char c)
Affiche le caractère c à la position du pointeur d’affichage.
void lcd_puts(char *str)
Affiche la chaîne de caractère contenue dans la SRAM. A utiliser pour l'affichage de variables.
Pour afficher un entier ou un flottant, il doit être préalablement convertit en chaîne de caractère.
Pour ceci, utiliser les fonctions de conversion de la librairie stdlib.h comme floa pour la conversion de flottants ou itoa pour un entier.
EX:
ftoa (variable_float, 3, variable_str); // Convertir la variable en une chaîne de caractères avec 3 décimales lcd_puts(variable_str); // Affichage de la variable |
void lcd_putsf(char flash *str)
Affiche la chaîne de caractère contenue dans la FLASH.
#include <90s8535.h> #asm .equ __lcd_port=0x15 ;PORTC #endasm #include <lcd.h> void main(void) { lcd_init(16); lcd_putsf("Jelectronique"); while (1); } |


