Si ça t'intéresse, j'ai (dans une autre galaxie lointaine..) écris une routine pour contrôler via une liaison série "custom" un afficheur 8 bits // en utilisant un registre à décalage (liaison déportée)
Je prépare le mot à transmettre et je l'envoie bit par bit en comptant le nombre de coup d'horloge.
Code:;********************************************************************************* ;** ** ;** ROUTINES DE GESTION DU MODULE LCD ** ;** ** ;********************************************************************************* ;-------------------------------------------------------------------------------- ; ROUTINE D'INITIALISATION DU LCD ; ; variables utilisées : ;-------------------------------------------------------------------------------- LCD_INIT call T1s ; tempo d'1s pour l'auto-init de l'afficheur movlw 0x38 ; chargement du mode de fonctionnement (8 bits, 2 lignes 16 car) call LCD_CMD ; envoi de la commande au LCD call T25ms ; tempo de 25ms (tant de prise en compte par l'afficheur) movlw 0x0C ; afficheur ON, curseur OFF, clignotement OFF call LCD_CMD ; envoi de la commande au LCD call T25ms ; tempo de 25ms (tant de prise en compte par l'afficheur) movlw 0x01 ; call LCD_CMD ; envoi de la commande au LCD call T25ms ; tempo de 25ms (tant de prise en compte par l'afficheur) movlw 0x06 ; mode incrément, décalage OFF call LCD_CMD ; envoi de la commande call T25ms ; tempo de 25ms (tant de prise en compte par l'afficheur) call LCD_CLS ; Efface et Home call T25ms ; tempo de 25ms (tant de prise en compte par l'afficheur) ; L'afficheur est initialisé ; enregistrement des symboles "custom" call LCD_SY1 ; enegistrement du symbôle n°1 (0x00) call LCD_SY2 ; enegistrement du symbôle n°2 (0x01) call LCD_SY3 ; enegistrement du symbôle n°3 (0x02) return ;-------------------------------------------------------------------------------- ; ROUTINE D'ENVOI D'UNE DONNEE/COMMANDE contenue dans W ; ; variables utilisées : local1, local2, cpt1 ;-------------------------------------------------------------------------------- LCD_L1 movlw 0x80 ; code pour aller a la ligne 1 goto LCD_CMD ; on saute a l'envoi LCD_L2 movlw 0xC0 ; code pour aller a la ligne 2 goto LCD_CMD ; on saute a l'envoi LCD_L3 movlw 0x94 ; code pour aller a la ligne 3 goto LCD_CMD ; on saute a l'envoi LCD_L4 movlw 0xD4 ; code pour aller a la ligne 4 goto LCD_CMD ; on saute a l'envoi LCD_CLS movlw 0x01 ; code pour effacer l'ecran et revenir au debut de ligne 1 LCD_CMD bcf local2, 0 ; on va envoyer une commande => RS=0 goto LCD_TX ; on saute a l'envoi LCD_ESPACE movlw ' ' ; affiche un espace LCD_DAT bsf local2, 0 ; on va envoyer une donnée => RS=1 LCD_TX bcf lcd_en ; on efface la ligne de validation movwf local1 ; sauvegarde de l'octet a envoyer dans local1 movlw .8 ; nombre de bits à envoyer movwf cpt1 ; dans cpt1 LCD_TX2 bcf lcd_data ; on efface la ligne serie btfsc local1, 7 ; le bit de poids fort est il à '0' ? bsf lcd_data ; NON, on ecrit 1 sur la ligne serie bsf lcd_clk ; front montant sur l'horloge bcf lcd_clk ; front descandant sur l'horloge rlf local1, F ; on decale vers la gauche l'octet a envoyer decfsz cpt1, F ; il reste cpt1=ctp1-1 bits a traité, cpt1 vaut il '0' ? goto LCD_TX2 ; NON, il reste des bits a envoyer, on boucle bcf lcd_data ; on efface la ligne série btfsc local2, 0 ; RS est il a '0' ? bsf lcd_data ; NON, on ecrit 1 sur la ligne serie pour positionner RS du LCD bsf lcd_en ; front montant sur la validation bcf lcd_en ; front descandant sur la validation ; on va perdre 60µs le temps que l'afficheur traite la donnée movlw .16 movwf cpt1 LCD_bcl1 decfsz cpt1, F ; cpt1=cpt1-1 on perd 1 cycle = tempo 1µs goto LCD_bcl1 ; on perd 2 cycle = tempo 2µs return ; L'octet a été envoyé, retour au programme appelant ;--------------------------------------------------------------------------------
-----