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 .
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(;;);
}
Mvh Lars J.
Tack i förhand!
Direkt länk till datablad https://www1.elfa.se/data1/wwwroot/asse ... ng_tds.pdf