logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Sterowanie LCD 2x16 (16 pinów) przez PIC16F84A w trybie 4-bitowym – brak wyświetlania

Johny_p1 28 Sty 2009 19:05 2043 3
REKLAMA
  • #1 6067663
    Johny_p1
    Poziom 10  
    Posty: 33
    Witam serdecznie!

    Zabrałem się za oprogramowanie wyświetlacza LCD przy pomocy wspomnianego wyżej pic-a i jak to w życiu bywa wyświetlacz nie chce współpracować;)

    Podłączyłem wyswieltacz do Pica w następujący sposób

    LCD<->PIC

    RS- RA0
    RW na stałe do GND
    E - RA1
    D4 - RB0
    D5 - RB1
    D6 - RB2
    D7 - RB3

    Z podłączenia widać, że chciałbym sterować wyświetlaczem w trybie 4 bitowym. Wtedy zgodnie z informacjami, które udało mi się zebrać najpierw należy zapisać do wyświetlacza starsze 4 bity danych (podając opadające zbocze na wejście E), a następnie młodsze 4-bity. Po włączeniu wyświetlacz jednak przechodzi automatycznie w tryb pracy 8-bitowy więc należy go najpierw zmienić . Wszystko jest jasne, jednak pomimo wielu prób nadal nic nie wyświetla. Podświetla się i na tym się kończy jego działanie.

    Jest to wyświetlacz 2x16, który posiada 16, a nie jak w większości źródeł w internecie 14 linij sterowania. Dodatkowo posiada jeszcze z boku dwa dodatkowe wejścia. Nie wiem do czego mogą one służyć i może z tego powodu nie działa.

    Druga sprawa dotyczy trzeciego portu wyświetlacza (kontrast), który zgodnie ze schematami jakie widziałem w internecie powinien zostać podłączony przez regulowany rezystor 4,7kOm-a. Ja nie miałem takiego, dlatego połączyłem dwa rezystory 0,5kOm-a i 1KOm szeregowo i sygnał na port numer 3 podciągnąłem z pomiędzy tych rezystorów. Napięcie zasilające 5V. Jednak czy jest ten syg podłączony czy nie, nie ma to wpływu na stan wyświetlacza... :(

    Oto kod, który napisałem (używam sygnału zegarowego 8Mhz):


    
    #include 16f84.h
    
    
    N 			EQU 0x0C
    FIXDELAY	EQU 0x0D
    TMP equ 11h
    
    #define E porta,1
    #define RS porta,0
     
    
    ;*******************************************************************
    
    	    org 0x00
    
    START	
    		CLRF	porta		
    		CLRF	portb		
    		MOVLW	0x00		
    		BSF		RP0			
    		MOVWF	trisa		
    		MOVWF	trisb		
    		BCF		RP0			
    		MOVLW	0xE6		
    		CALL 	NDELAY		
            MOVLW	0xE6		
    		CALL 	NDELAY		
    
    
    INITLCD	BCF		RS
    		
            movlw .2            ;przejscie w tryb 4-bitowy
            movwf portb
            CALL ENABLEPULSE
            MOVLW	0xFF		
    		CALL 	NDELAY	
    
    
            movlw .8            ;wyłącz wyświetlacz
            call WR_CMD
    
            movlw .1            ;wyczyść wyswietlacz
            call WR_CMD
    
    		movlw .2            ;powrót karetki
            call WR_CMD
            
            movlw .15            ;wyswietlacz on, miganie on, kursor on
            call WR_CMD
    
            movlw .8            ;entry mode, auto-incrementacja
            call WR_CMD
            	
            	
    
    MAIN
    
    		movlw 80h           ;ustalenie adresu poczatkowego na 00h
            call WR_CMD
    
     		movlw A'p'
    		call WR_DATA
    		movlw A'i'
    		call WR_DATA
    		movlw A'c'
    		call WR_DATA
    
    FOREVER
    		nop
    		goto FOREVER
                    
    
    
    
    
    ;*******************************************************************
    ENABLEPULSE      ;opadające zbocze sygnału E (zapis instrukcji do wyswietlacza)
    
    			
    			BSF	E	
    			CALL DELAY200
    			CALL DELAY200
                CALL DELAY200
                CALL DELAY200
    			BCF E
                CALL DELAY200
    			CALL DELAY200
                CALL DELAY200
                CALL DELAY200
    			RETURN
    
    
    ;************************************************************************
    
    WR_DATA    ;zapis danej do wyświetlacza
    		bsf RS
            goto ET_WR
    
    WR_CMD     ;zapis instrukcji do wyswietlacza (w trybie 4-bitowym)
            bcf RS
    ET_WR   bsf E
    		movwf TMP
            swapf TMP,0
            movwf portb  
            MOVLW	0x04		
    		CALL 	NDELAY
            bcf E  
            MOVLW	0x04	
    		CALL 	NDELAY	
            bsf E
            movlw TMP
            movwf portb  
    		MOVLW	0x04		
    		CALL 	NDELAY
            bcf E  
            MOVLW	0x04	
    		CALL 	NDELAY	
            bsf E
            MOVLW	0x0F	
    		CALL 	NDELAY	
            return	
    		
    
    
    ;***********************************************************************************
    
    NDELAY
    			MOVWF N				; N is delay multiplier
    NOTOVER		CALL DELAY200		; Call for 200us
    			CALL DELAY200		; Call for 200us
    			DECFSZ N, 1			; Decrease N by 1
    			GOTO NOTOVER		; The delay isn't done
    			RETURN
    	
    ;***********************************************************************************
    
    DELAY200	
    			MOVLW 0xC8			; 200 LOOPS
    			MOVWF FIXDELAY		; 200us fixed delay
    NOTDONE200	DECFSZ FIXDELAY, 1 	; Decrement of FIXDELAY
    			GOTO NOTDONE200		; If 200us isn't up go back to NOTDONE200
    			RETURN				; If 200us is up then return to instruction.
    
    ;***********************************************************************************
    
    DELAY50	
    			MOVLW 0x32			; 50 LOOPS
    			MOVWF FIXDELAY		; 50us fixed delay
    NOTDONE50	DECFSZ FIXDELAY, 1 	; Decrement of FIXDELAY
    			GOTO NOTDONE50		; If 50us isn't up go back to NOTDONE50
    			RETURN				; If 50us is up then return to instruction.
    
    			END
    
    


    Gdyby ktoś miał taki problem i miał jakieś informacje na ten temat, uprzejmie proszę o pomoc...

    Pozdrawiam!
  • REKLAMA
  • #2 6071375
    Johny_p1
    Poziom 10  
    Posty: 33
    Problem rozwiązałem:)

    Pozdrwawiam
  • REKLAMA
  • #4 6092585
    Johny_p1
    Poziom 10  
    Posty: 33
    Problem był w procedurze WR_CMD, chodziło o zapis najpierw starszego potem młodszego nibla. Zapis pierwszej czwórki bitów był prawidłowy, jednak druga czwórka nie była zapisywana poprawnie.
    Należy dokonać następującej modyfikacji kodu:

    
    
    WR_CMD     ;zapis instrukcji do wyswietlacza (w trybie 4-bitowym)
            bcf RS
    ET_WR   bsf E
    		movwf TMP
            swapf TMP,0
            movwf portb 
            movwf TMP 
            MOVLW	0x03		
    		CALL 	NDELAY
            bcf E  
            MOVLW	0x03	
    		CALL 	NDELAY	
            bsf E
            swapf TMP,0
            movwf portb 
    		MOVLW	0x03		
    		CALL 	NDELAY
            bcf E  
            MOVLW	0x03	
    		CALL 	NDELAY	
            bsf E
            return	
    
    
REKLAMA