PIC16F690 LCD display 4 bit mode C

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
LarsJ
Inlägg: 10
Blev medlem: 26 februari 2013, 18:19:56

PIC16F690 LCD display 4 bit mode C

Inlägg 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
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av LarsJ 12 april 2013, 23:38:00, redigerad totalt 1 gång.
ragstian
Inlägg: 3
Blev medlem: 21 oktober 2011, 07:54:01
Ort: Houston

Re: PIC16F690 LCD display 4 bit mode C#

Inlägg av ragstian »

Hei.

Har du koplet potmeter for justering av LCD kontrast?

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

R
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: PIC16F690 LCD display 4 bit mode C#

Inlägg av johano »

C#?

/j
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC16F690 LCD display 4 bit mode C#

Inlägg 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 ?
LarsJ
Inlägg: 10
Blev medlem: 26 februari 2013, 18:19:56

Re: PIC16F690 LCD display 4 bit mode C#

Inlägg 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.
Senast redigerad av LarsJ 13 april 2013, 00:25:40, redigerad totalt 1 gång.
LarsJ
Inlägg: 10
Blev medlem: 26 februari 2013, 18:19:56

Re: PIC16F690 LCD display 4 bit mode C#

Inlägg 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.
Användarvisningsbild
Krille Krokodil
Inlägg: 4062
Blev medlem: 9 december 2005, 22:33:11
Ort: Helsingborg

Re: PIC16F690 LCD display 4 bit mode C

Inlägg av Krille Krokodil »

Markören följer aktuell minnesadress, du sätter den med Set DDRAM, se s. 11 i databladet.
void
Inlägg: 119
Blev medlem: 8 juli 2007, 11:06:50
Ort: Enköping

Re: PIC16F690 LCD display 4 bit mode C#

Inlägg 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.
Användarvisningsbild
Krille Krokodil
Inlägg: 4062
Blev medlem: 9 december 2005, 22:33:11
Ort: Helsingborg

Re: PIC16F690 LCD display 4 bit mode C

Inlägg 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);

}                                      
LarsJ
Inlägg: 10
Blev medlem: 26 februari 2013, 18:19:56

Re: PIC16F690 LCD display 4 bit mode C#

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC16F690 LCD display 4 bit mode C

Inlägg 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.
Skriv svar