Goede middag,
Ik heb al eventjes door het forum lopen neuzen maar ik kan maar nieks vinden dat me een stap dichter helpt met mijn probleem. Het doel: een lcd aansturen (klinkt simpel...).
Ik maak gebruik van de PIC16F1939 + 2x20LCD (Controller). Ik programmeer in C en gebruik de Hi tech C compiler (light versie die bij MPLab zit).
Genoeg specs denk ik. Probleem dat ik ervaar is dat de LCD geen tekst toont.
Als de LCD opstart (zonder pic) krijg ik zwarte hokjes op de bovenste regel (wat normaal is). Als ik vervolgens initialiseer krijg ik een leeg scherm met een cursus die knipperd (is de bedoeling dus ik veronderstel dat de initialisatie klopt). Wanneer ik nu data doorstuur krijg ik 2 mogelijkheden (afhankelijk van de string die ik stuur) gaat de bovenste regel zwart of schuift de cursor op maar zie ik geen tekst.
Ik heb mijn contrast enz ingesteld en bekeken en deze zou inorde moeten zijn (want ik zie mijn cursor goed). Ik kan mijn cursor ook verplaatsen (zolang ik geen data doorstuur).
De code die ik gebruik is het voorbeeldprogramma van hi tech zelf.
Main.C
#include <htc.h>
#include "lcd.h"
#ifndef _XTAL_FREQ
// Unless specified elsewhere, 4MHz system frequency is assumed
#define _XTAL_FREQ 32000000
#endif
void
main(void)
{
OSCCON = 0b11110000; //instellen oscillator (32MHz)
CM1CON0 = 0x00; //comperators uitschakelen
CM2CON0 = 0x00;
TRISB = 0x00;
PORTB = 0x00;
RB1 = 1;
__delay_ms(1000); //even wachten
lcd_init();
lcd_goto(0); // select first line
lcd_puts("1");
lcd_goto(0x40); // Select second line
RB0 = 0;
//
while (1) {
RB0 = 1;
__delay_ms(500);
RB0 = 0;
__delay_ms(500);
}
}
LCD.c
/*
* LCD interface example
* Uses routines from delay.c
* This code will interface to a standard LCD controller
* like the Hitachi HD44780. It uses it in 4 bit mode, with
* the hardware connected as follows (the standard 14 pin
* LCD connector is used):
*
* PORTD bits 0-3 are connected to the LCD data bits 4-7 (high nibble)
* PORTA bit 3 is connected to the LCD RS input (register select)
* PORTA bit 1 is connected to the LCD EN bit (enable)
*
* To use these routines, set up the port I/O (TRISA, TRISD) then
* call lcd_init(), then other routines as required.
*
*/
#ifndef _XTAL_FREQ
// Unless specified elsewhere, 4MHz system frequency is assumed
#define _XTAL_FREQ 32000000
#endif
#include <htc.h>
#include "lcd.h"
#define LCD_RS RA3
#define LCD_RW RA2
#define LCD_EN RA1
#define LCD_DATA PORTD
#define LCD_STROBE() ((LCD_EN = 1), (__delay_us(10)), (LCD_EN=0))
/* write a byte to the LCD in 4 bit mode */
void
lcd_write(unsigned char c)
{
__delay_us(40);
LCD_DATA = ( ( c >> 4 ) & 0x0F );
LCD_STROBE();
LCD_DATA = ( c & 0x0F );
LCD_STROBE();
__delay_ms(10);
}
/*
* 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);
}
/* initialise the LCD - put into 4 bit mode */
void
lcd_init()
{
char init_value;
ADCON1 = 0x06; // Disable analog pins on PORTA
init_value = 0x3;
TRISA=0;
TRISD=0;
LCD_RS = 0;
LCD_EN = 0;
LCD_RW = 0;
__delay_ms(15); // wait 15mSec after power applied,
LCD_DATA = init_value;
LCD_STROBE();
__delay_ms(5);
LCD_STROBE();
__delay_us(200);
LCD_STROBE();
__delay_us(200);
LCD_DATA = 2; // Four bit mode
LCD_STROBE();
lcd_write(0x28); // Set interface length
lcd_write(0xF); // Display On, Cursor On, Cursor Blink
lcd_clear(); // Clear screen
lcd_write(0x5); // Set entry Mode
}
Ik heb net nog even de aansluitingen gecontroleerd en alles blijkt goed aangesloten te zijn, niet tegenstaande:
RA3 => RS
RA2 => RW
RA1 => EN
RD0 => DB4
RD1 => DB5
RD2 => DB6
RD3 => DB7
Het enige dat ik nog kan denken is uit de datasheet een ietwat slecht omschrijving van hoe de data moet doorgestuurd worden:
For 4-bit interface data, only four bus lines (DB4 to DB7) are used for transfer. Bus lines DB0 to DB3 are
disabled. The data transfer between the ST7066 and the MPU is completed after the 4-bit data has been
transferred twice. As for the order of data transfer, the four high order bits (for 8-bit operation, DB4 to DB7) are
transferred before the four low order bits (for 8-bit operation, DB0 to DB3). The busy flag must be checked (one
instruction) after the 4-bit data has been transferred twice. Two more 4-bit operations then transfer the busy flag
and address counter data.
Moet ik nu 2maal de 8 bit data sturen of gewoon dat ik m'n data moet opsplitsen en in 2 delen sturen (high nibble eerst) zo is het nu geprogrammeerd.
Ik hoop dat er iemand mij kan helpen, ik hoop dat ik zelf genoeg heb opgezocht en genoeg informatie heb gepost. Alvast bedankt!
Tijmerd
Bart Hiddink
Bart Hiddink is Ideetron; electronics and projects, http://www.ideetron.nl. LoRaWAN Nutcase.
Je doet er goed aan om de datasheet van de controller te lezen.
Ik heb net de andere datasheet bekeken, maar begrijp niet zo goed de initialisatie methode.
op blz 11 van de DS wordt deze procedure voorgested. de eerste stappen snap ik. Maar na 'Wait time > 100us' ben ik verloren, dan staan er geen tijden meer aangegeven enz.
nochtans de LCD toont een blinkende cursor, dus is m'n LCD normaal toch goed geïnitialiseerd?
Bedankt,
Tijmerd
Probleem opgelost:
#define LCD_RS RA3
#define LCD_RW RA2
#define LCD_EN RA1
Veranderd naar:
#define LCD_RS LATA3
#define LCD_RW LATA2
#define LCD_EN LATA1
Toch bedankt 
Tijmerd