; ; Afficheur_LCD.asm ; ; Created: 20/02/2021 16:36:17 ; Author : Christian ; ; Affiche sur un écran LCD (mode 8 bits) ; En première ligne : Christian ; En deuxième ligne : de LOCODUINO. ; PORT B PB0 RS = 0 instruction - RS = 1 donnée ; PB1 RW = 0 écriture - RW = 1 lecture ; PB2 E signal de validation ; PORT D D0-D7 ; .CSEG ; Initialisation des PORT B et D nop ldi r19, $FF out DDRB, r19 ; PORT B en sortie out DDRD, r19 ; PORT D en sortie ; Réglage des lignes de contrôle RS = PB0, RW = PB1, E = PB2 ldi r19, $00 out PORTB, r19 ; Lignes RS, RW et E à 0 ; Et LED_BUILTIN off ; Initialisation du LCD rcall LCD_INIT ; Display ON ldi r16, 0b00001111 ; Code display on, cursor on, blink on rcall LCD_REG ; Envoie code au LCD rcall delay_1MS ; Attente pour réponse LCD ; Clear display ldi r16, 0b00000001 ; Code pour effacer LCD rcall LCD_REG ; Envoie code au LCD rcall delay_1MS ; Attente pour réponse LCD rcall delay_1MS ; Temps > 1.52 ms ; Initialisation des registres ldi ZH, $00 ldi ZL, $C0 ; Initialisation Z-Register ($00C0 = 192) ; Affichage première ligne ldi r17, 10 ; Nombre de caractères du message 1 start_1: rcall delay_1MS ; Attente pour réponse LCD LPM r16, Z+ ; Caractère dans R16 rcall LCD_DATA ; Envoie caractère au LCD dec r17 ; Actualise nombre de caractères restant brne start_1 ; Recommence avec caractère suivant nop ; R17 = 0, message complet ; Position en mémoire d'affichage pour deuxième ligne rcall delay_1MS ; Attente pour réponse LCD cbi PORTB, 0 ; RS = 0 cbi PORTB, 1 ; RW = 0 ldi r16, 0b11000000 ; DB7 = 1 et adresse = 0x40 (début 2ème ligne) out PORTD, r16 ; Envoie le code au LCD rcall LCD_E ; Génère impulsion sur E ; Affichage deuxième ligne ldi r17, 14 ; Nombre de caractères du message 2 start_2: rcall delay_1MS ; Attente pour réponse LCD LPM r16, Z+ ; Caractère dans R16 rcall LCD_DATA ; Envoie caractère au LCD dec r17 ; Actualise nombre de caractères restant brne start_2 ; Recommence avec caractère suivant nop ; R17 = 0, message complet ; Allumage LED_BUILTIN et boucle infinie sbi PORTB, 5 ; LED_BUILTIN on infini: nop rjmp infini ; Boucle infinie fin de programme ; SOUS-PROGRAMMES ;************************************************************************ LCD_INIT: ; Initialise le LCD ldi r16, 0b00111000 ; LCD : 8 bits, 16 x 2, 5 x 7 rcall LCD_REG ; Envoie instruction rcall delay_5MS ; Attend 5 millisecondes ldi r16, 0b00111000 ; Idem deuxième fois rcall LCD_REG rcall delay_5MS ldi r16, 0b00111000 ; Idem troisième fois rcall LCD_REG rcall delay_5MS ; Total 15 millisecondes ret LCD_REG: ; Envoie instruction au LCD cbi PORTB, 0 ; PB0 = RS = 0 : instruction out PORTD, r16 rcall LCD_BUSY rcall LCD_E ; Génère impulsion sur E ret LCD_DATA: ; Envoie donnée au LCD cbi PORTB, 0 ; PB0 = RS = 0 : instruction out PORTD, r16 ; caractère sur le PORT D rcall LCD_BUSY ; Attend que LCD se libère sbi PORTB, 0 ; PB0 = RS = 1 : donnée rcall LCD_E ; Génère impulsion sur E ret LCD_BUSY: ; Attend tant que LCD non prêt sbi PORTB, 1 ; Met le LCD en mode lecture RW = 1 ldi r19, $00 out DDRD, r19 ; PORT D en entrée sbi PORTB, 2 ; Active signal E L_BUSY: sbic PIND, 7 ; Teste busy flag rjmp L_BUSY ; Bit = 1, recommence nop ; Bit = 0, LCD prêt ldi r19, $FF out DDRD, r19 ; PORT D en sortie cbi PORTB, 1 ; Met le LCD en mode écriture RW = 0 ret LCD_E: ; Active ligne E pendant 1 µs au moins sbi PORTB, 2 ; E = 1 rcall delay_500 ; Attente 500 ns rcall delay_500 ; Attente 500 ns cbi PORTB, 2 ; E = 0 ret delay_500: ; Attente de 500 ns (8 cycles de 62.5 ns) ; 3 cycles pour rcall nop ; 1 cycle pour nop ret ; 4 cycles pour ret delay_1MS: ; Attente de 1 milliseconde ldi r19, 21 ; Charge R19 clr r8 ; R8 = 0 (équivalent à 256) loop_1: dec r8 ; Boucle sur R8 brne loop_1 dec r19 ; Boucle sur R19 brne loop_1 ret delay_5MS: ; Attente de 5 millisecondes ldi r19, 104 ; Charge R19 clr r8 ; R8 = 0 (équivalent à 256) loop_5: dec r8 ; Boucle sur R8 brne loop_5 dec r19 ; Boucle sur R19 brne loop_5 ret ; MESSAGES ;*************************************************************************** .CSEG .ORG $0060 ; $0060 = 96 message_1: .DB 'C', 'h', 'r', 'i', 's', 't', 'i', 'a', 'n', ' ' message_2: .DB 'd', 'e', ' ', 'L', 'O', 'C', 'O', 'D', 'U', 'I', 'N', 'O', '.', ' '