Sida 1 av 1

PIC16F690 LCD display 4 bit mode C

Postat: 12 april 2013, 21:43:31
av LarsJ
Har en PIC16F690 som jag vill koppla ihop med en LCD som jag köpt på ELFA, https://www.elfa.se/elfa3~se_sv/elfa/in ... &toc=20352
Ur databladet har jag försökt förberett LCD i 4bit mode med lcd_init() vid start.
Men problemet är att LCD inte skriver ut något, tror det beror på var markören är positioneras( där man ska börja skriva ut), dvs lcd_goto.
Jag kan inte lista ut riktigt hur man säger var markören ska vara enligt, men det finns en adress lista som jag tror är vad positionen ska vara
adress.png
.
Har satt den till 0x80 bara. Är det någon som kan lista ut vad som är problemet kan vara?

Jag använder mig av MPLAB X och HI-TECH C compiler.
De olika lcd funktionerna i koden kommer ursprungligen från HI-TECH C compiler example.
Här nedan är koden, ni får ursäkta att det blir så mycket kod men vill vara grundlig.

Kod: Markera allt

 * File:   LCD_test.c
 * Author: Lars
 
 * LED_RS =RA1
 * LED_EN =RA2
 * LED_RW= Ground
 * 4-bit mode
 * RC0=LED_DB4
 * RC1=LED_DB5
 * RC2=LED_DB6
 * RC3=LED_DB7
 *
 *RC5 = Ground
 *RC6 = Ground
 *RC7 = Ground
 */

#include <htc.h> 
#include <pic16f690.h> 
#include <stdio.h>  
#include <pic.h>  


#define _XTAL_FREQ 4000000

#define	LCD_RS RA1
#define LCD_EN RA2

#define LCD_DATA PORTC

#define	LCD_STROBE()	((LCD_EN = 1),(LCD_EN=0))


__CONFIG(FOSC_INTRCIO & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_ON & IESO_ON & FCMEN_ON);

void lcd_init()
{
	char init_value;
     ANSEL=0x00;
    ANSELH=0x00; //disable analoga inportar på RC6,RC7, (RB4,RB5)

	init_value = 0x03;
	TRISAbits.TRISA1=0;     //output mode
    TRISAbits.TRISA2=0;     //output mode
	TRISC=0x00;             //output mode
	LCD_RS = 0;
	LCD_EN = 0;
	//Funktion set
	__delay_ms(45);	
	LCD_DATA= init_value; //PORTC=0x03=0b0000 0011
	LCD_STROBE();
	//Funktion set
	__delay_us(42);
	LCD_DATA = 0x02;
	LCD_STROBE();
	LCD_DATA = 0x08;    //F=0 Character format 5x7 dots, N=1 Display in two lines
	LCD_STROBE();
	//Funktion set
	__delay_us(42);
	LCD_DATA = 0x02;
	LCD_STROBE();
	LCD_DATA = 0x08;    //F=0 Character format XXXX dots, N=1 Display in two lines
	LCD_STROBE();

	//Display ON/OFF control
	__delay_us(42);
	LCD_DATA = 0x00;
	LCD_STROBE();
	LCD_DATA = 0x0F; //D=1 display on, C=1 cusors on, B=1 cursor position on
	LCD_STROBE();
	//Display clear
	__delay_us(42);
	LCD_DATA = 0x00;
	LCD_STROBE();
	LCD_DATA = 0x01;
	LCD_STROBE();
	//Entry mode set
	__delay_ms(2);
	LCD_DATA = 0x00;
	LCD_STROBE();
	LCD_DATA = 0x07; ///S=1 display shift on, I/D=1 increment by 1
	LCD_STROBE();
}

/* write a byte to the LCD in 4 bit mode */
void lcd_write(unsigned char c)
{
	__delay_us(40);
	LCD_DATA = ( ( c >> 4 ) & 0x0F );   // send 4 high bit
    LCD_STROBE();
	LCD_DATA = ( c & 0x0F );            // send 4 low bit
    LCD_STROBE();
}

/*
 * 	Clear and home the LCD
 */
void lcd_clear(void)
{
	LCD_RS = 0;
	lcd_write(0x1);
	__delay_ms(2);
}

/* write a string of chars to the LCD */
void lcd_puts(const char * s)
{
	LCD_RS = 1;	// write characters
	while(*s)
	lcd_write(*s++);
}

/* write one character to the LCD */
void lcd_putch(char c)
{
	LCD_RS = 1;	// write characters
	lcd_write( c );
}


/*
 * Go to the specified position
 */
void lcd_goto(unsigned char pos)
{
	LCD_RS = 0;
	lcd_write(0x80+pos);
}


void main(){
        lcd_init();
        lcd_goto(0x04);	
        lcd_puts("HEJ");


	for(;;);
}
Fil för de som vill ha
LCD_test.c
.


Mvh Lars J.
Tack i förhand!
Direkt länk till datablad https://www1.elfa.se/data1/wwwroot/asse ... ng_tds.pdf

Re: PIC16F690 LCD display 4 bit mode C#

Postat: 12 april 2013, 22:18:46
av ragstian
Hei.

Har du koplet potmeter for justering av LCD kontrast?

http://www.oppod.com/services/notes-info-59.html

R

Re: PIC16F690 LCD display 4 bit mode C#

Postat: 12 april 2013, 22:53:14
av johano
C#?

/j

Re: PIC16F690 LCD display 4 bit mode C#

Postat: 12 april 2013, 22:54:37
av sodjan
> Har satt den till 0x80 bara.

Adressen ?
Det du klippte in från databladet visade ju adresser
00-0F och 40-0F, varför sätta den till 80 ?

Re: PIC16F690 LCD display 4 bit mode C#

Postat: 12 april 2013, 23:33:50
av LarsJ
ragstian skrev:Hei.

Har du koplet potmeter for justering av LCD kontrast?

http://www.oppod.com/services/notes-info-59.html

R
Japp , det har jag gjort. En 10k potentiometer som är satt på typ 4.5k.
Har skruvat på den lite men av någon anledning inte trott det var något fel utan programmeringen där men nu när du säger det så testa jag och skruva på den å tro schöen att det kommer det man skrev!! så bra alltså.

TUSEN TACK för det ragstian


johano, jag menade såklart C, vet ej vad jag fick det ifrån.


Har nu en ytterligare fråga om hur man skriver ut en variabel av typ int och string i samma, säg

Kod: Markera allt

void main(){
        int v=65;
        char buffer[20];
        itoa(bufferr,v,10);
        lcd_init();
        lcd_goto(0x04);
        lcd_puts("v=" buffer);
Jag får 65 på displayen, vill gärna ha lcd_puts("v=" buffer) men den syntaxen fungerar inte. Jag skulle vilja text och talet samtidigt i samma utskrivning.
Vet någon något smart lösningen på det?
man kan skriva två gånger ut förs v= sedan buffer

En snabb fråga med kan man använda båda raderna på displayen om man har 4 bit mode?

Mvh
Lars J.

Re: PIC16F690 LCD display 4 bit mode C#

Postat: 12 april 2013, 23:37:32
av LarsJ
sodjan skrev:> Har satt den till 0x80 bara.

Adressen ?
Det du klippte in från databladet visade ju adresser
00-0F och 40-0F, varför sätta den till 80 ?

Det stod så i exemplet som kom med HI-TECH C compiler, så jag lät det stå kvar när jag publicera koden här. Jag har allt testat med att byta till lägre men då såg jag ingen skillnad. Men nu visade det sig vara kontrasten som spökade :)

Mvh
Lars J.

Re: PIC16F690 LCD display 4 bit mode C

Postat: 12 april 2013, 23:47:23
av Krille Krokodil
Markören följer aktuell minnesadress, du sätter den med Set DDRAM, se s. 11 i databladet.

Re: PIC16F690 LCD display 4 bit mode C#

Postat: 27 april 2013, 00:51:30
av void
LarsJ skrev:Har nu en ytterligare fråga om hur man skriver ut en variabel av typ int och string i samma, säg

Kod: Markera allt

void main(){
        int v=65;
        char buffer[20];
        itoa(bufferr,v,10);
        lcd_init();
        lcd_goto(0x04);
        lcd_puts("v=" buffer);
Jag får 65 på displayen, vill gärna ha lcd_puts("v=" buffer) men den syntaxen fungerar inte. Jag skulle vilja text och talet samtidigt i samma utskrivning. Vet någon något smart lösningen på det? man kan skriva två gånger ut förs v= sedan buffer

En snabb fråga med kan man använda båda raderna på displayen om man har 4 bit mode?

Mvh
Lars J.
Om du har gott om minne kan du använda "sprintf":

Kod: Markera allt

sprintf(buffer, "v= %d", v);
lcd_puts(buffer);
Som sagt (s)printf äter en del minne så jag brukar undvika dessa. "strcat" kan vara ett alternativ. Skaffa en C-bok, t.ex. "The C Programming Language ANSI C Version" av K&R.

Man kan skriva till alla positioner i teckenbufferten, även i 4-bit mode.

Re: PIC16F690 LCD display 4 bit mode C

Postat: 27 april 2013, 11:24:57
av Krille Krokodil

Kod: Markera allt

// Skriver värdet av en byte decimalt med början på position
void LCD_PlaceByte (unsigned char position, unsigned char byte){

	if(byte / 100 != 0){
		LCD_PlaceCharacter(position, 0x30 + byte/100); 	// "0" är ASCII 0x30
		position++;
		byte -= 100 * (byte/100);		// Tar bort *100-delen ur talet
	}

	LCD_PlaceCharacter(position, 0x30 + byte/10);
	LCD_WriteCharacter(0x30 + byte % 10);

}                                      

Re: PIC16F690 LCD display 4 bit mode C#

Postat: 28 april 2013, 18:54:01
av LarsJ
Om du har gott om minne kan du använda "sprintf":

Kod: Markera allt

sprintf(buffer, "v= %d", v);
lcd_puts(buffer);
Som sagt (s)printf äter en del minne så jag brukar undvika dessa. "strcat" kan vara ett alternativ. Skaffa en C-bok, t.ex. "The C Programming Language ANSI C Version" av K&R.

Man kan skriva till alla positioner i teckenbufferten, även i 4-bit mode.
Okej, använder sprintf funkar fint fint tack för det!
Så det funkar att skriva till alla positioner även i 4-bit mode, okej bra att veta. Har ej hunnit testa det än.
Mvh
Lars J.

Re: PIC16F690 LCD display 4 bit mode C

Postat: 28 april 2013, 19:58:39
av sodjan
Du kan alltid göra exakt samma saker mot en HD44780
LCD i 4 och 8 bit mode! Den enda skillnaden är hur data
skickas, d.v.s en 8-bit bit eller 2 4-bit bitar...

För övrigt är det ingen som helst skillnad.