Вы находитесь на странице: 1из 4

;**************************************** ;* LCD_INIT.ASM * ;**************************************** ; ; Routines indispensables la mise en route d'un afficheur LCD en mode 4 Bits.

. ; Pour l'adapter sur une autre config (port d'entres / sorties) voir ci dessous ; les quivalences (EQU) et Defininitions de termes (DEFINE). ; ;******************************************************************************* ****** ;* Equivalences et Dfinitions de termes * ;******************************************************************************* ****** ; ; Reservation en RAM ; CBLOCK 0x030 ; MSD:1 ; Temporary register, Holds Most Significant Digit of BI N to BCD conversion LSD:1 ; Temporary register, Holds Least Significant Digit of B IN to BCD conversion TEMP_LCD:1 ; Temporary register CHAR:1 ; Temporary register, Holds value to send to LCD module. ENDC ;Fin de la zone ; ; Attention aux masques, il faudra les intervertir si l'on travaille sur des bit s de poids fort ; d'un port de PIC. ; MASQUE_L EQU 0x0F ; Masque pour les 4 LSB pour un afficheur gr sur 4 bits MASQUE_H EQU 0xF0 ; Masque pour les 4 MSB pour un afficheur gr sur 4 bits ; ;**************************************** ;* Caractres de commande LCD * ;**************************************** ; CLR_DISP EQU 0x01 ; Clear the Display CURS_HOME EQU 0x02 ; Remettre le curseur au dbut (attente de 1,5ms) ENTRY_DEC EQU 0x04 ; Set Entry Mode DECrement, No shift ENTRY_DEC_S EQU 0x05 ; ENTRY_INC EQU 0x06 ; Set Entry Mode Increment, No shift ENTRY_INC_S EQU 0x07 ; DISP_OFF EQU 0x08 ; Display off DISP_ON EQU 0x0C ; Display on DISP_ON_C EQU 0x0E ; Display on, Cursor on DISP_ON_B EQU 0x0F ; Display on, Cursor on, Blink cursor CURS_DISPl_CL EQU 0x10 ; Shift the cursor to the Left CURS_DISPl_CR EQU 0x14 ; Shift the cursor to the Right CURS_DISPl_SL EQU 0x18 ; Shift the entire display to the Left CURS_DISPl_SR EQU 0x1C ; Shift the entire display to the Right ; FUNC_SET EQU 0x20 ; Code Function Set additionner avec les valeurs ci-dessous. DL_8 EQU 0x10 ; Data Lenght 8 bits DL_4 EQU 0x00 ; Data Lenght 4 bits N_DISP_LIN1 EQU 0x00 ; Number of Display Line (si =0: 1 ligne, si = 8

0: 2 lignes) N_DISP_LIN2 0: 2 lignes) CHAR_FONT57 iel CHAR_FONT510 ciel jamais ; ;

EQU EQU EQU

0x08 0x00 0x04

; Number of Display Line (si =0: 1 ligne, si = 8 ; Si N_DISP_LIN1, on peut avoir 5*7 point matric ; Si N_DISP_LIN1, on peut avoir 5*10 point matri ; avec N_DISP_LIN2.

;**************************************** ;* Afficheur 1 ligne 16 caractres. * ;**************************************** ; ; La ligne est divise en 2 zones de 8 caractres et les adresses du digit 8 9 ne se suivent pas. ; A1L_DIGIT0 EQU 0x80 ; Least Significant 7-bit are for address < 0xc0 A1L_DIGIT9 EQU 0xC0 ; Least Significant 6-bit are for address ; ; Entre de config LCD affecte aux diffrents port du 16F84 sur ma carte automate. ; LCD_DATA EQU PORTA ; de RA0 RA3 ; #DEFINE E PORTB,4 ; Sur PORTC RB4, Enable ; Le LCD est toujours sur Write. #DEFINE RS PORTB,5 ; Sur PORTB RB5, Register Select ; ;******************************************************************************* ****** ;* Routines ncessaires l'afficheur LCD TEMPO diverses * ;******************************************************************************* ****** ; WAIT_15ms MOVLW 10 GOTO W4MS WAIT_4ms MOVLW 3 ; 3 * 1,5ms = 4,5ms W4MS MOVWF TEMP_LCD B4ms CALL WAIT_1_5ms ; Pour ces tempos, on peut se permettre DECFSZ TEMP_LCD, F ; plusieurs CALL (ce n'est qu'au dbut ) GOTO B4ms ; RETURN ; WAIT_1_5ms MOVLW 150 ; 150 * 100 s = 1,5ms MOVWF LSD B15ms CALL BUSY_WAIT ; Pour ces tempos, on peut se permettre DECFSZ LSD, F ; plusieurs CALL (ce n'est qu'au dbut) GOTO B15ms ; RETURN ; BUSY_WAIT MOVLW ) Boucle1 MOVWF NOP MSD ; l'instruction fait 1 s (Quartz 4MHz) 25 ; une attente de 100 s suffira ; en dcimal (par dfaut pour le compilateur

DECFSZ MSD, F GOTO Boucle1 RETURN

; ;

; ; ;******************************************************************* ;* SEND_CHAR - Sends character to LCD * ;* This routine splits the character into the upper and lower * ;* nibbles and sends them to the LCD, upper nibble first. * ;* The data is transmitted on the PORT<3:0> pins * ;* La diffrence entre envoi de caractre et de commande * ;* correspond au bit RS * ;******************************************************************* ; SEND_CMD BCF RS ; Set LCD to command mode GOTO SEND SEND_CHAR BSF RS ; Set LCD to data mode SEND MOVWF CHAR ; Character to be sent is in W CALL BUSY_WAIT ; Wait for LCD to be ready (100 SWAPF CHAR,w ANDLW MASQUE_L ; Get upper nibble MOVWF MSD ; 4 bits de poids fort dans MSD MOVF LCD_DATA,w ; on doit conserver les valeurs t RA5 ANDLW MASQUE_H IORWF MSD,w ; le rsultat nouveau dans w MOVWF LCD_DATA ; Send data to LCD ; BCF RW ; Set LCD to write BSF E ; toggle E for LCD BCF E MOVF CHAR,w ANDLW MASQUE_L ; Get lower nibble MOVWF MSD ; 4 bits de poids fort dans MSD MOVF LCD_DATA,w ; on doit conserver les valeurs t RA5 ANDLW MASQUE_H IORWF MSD,w ; le rsultat nouveau dans w MOVWF LCD_DATA ; Send data to LCD BSF E ; toggle E for LCD BCF E RETURN ; INIT_LCD BCF E BCF RS ; Set LCD for Command mode ; BCF RW ; Write mode ; call WAIT_15ms ; tempo de 15ms movlw MASQUE_H andwf LCD_DATA,f movlw 0x03 ; Commande de mise en route iorwf LCD_DATA,f BSF E ; Set E high BCF E ; Set E low ; call WAIT_4ms ; tempo de 4ms BSF E ; Set E high (en fait le port a

s)

de RA4 e

de RA4 e

dj l'info)

BCF ; call BSF BCF ; call movlw andwf movlw iorwf BSF BCF ; call ; RETURN ; INIT_DISPLAY movlw nes CALL e ; MOVLW ur) CALL ; MOVLW CALL e ; MOVLW CALL e FIN_INIT_DISPLAY RETURN

E BUSY_WAIT E E BUSY_WAIT MASQUE_H LCD_DATA,f 0x02 LCD_DATA,f E E BUSY_WAIT

; Set E low ; 100 s ; Set E high (en fait le port a dj l'info) ; Set E low ; 100 s ; On indique le mode 4 bits ; Set E high ; Set E low ; 100 s

FUNC_SET+DL_4+N_DISP_LIN2 SEND_CMD DISP_OFF SEND_CMD DISP_ON SEND_CMD ENTRY_INC SEND_CMD

; Commande 4 bits, 2 lig

; Send This command to the Display Modul ; Display Off (recommendation constructe

; Display On, Cursor On ; Send This command to the Display Modul ; Set Entry Mode Inc., No shift ; Send This command to the Display Modul