Hallo,
Ik ben aan het experimenteren met de C18 compiler en had graag eens een lcd aangestuurd.
Maar nu lukt dit niet, heb al van alles geprobeert, waarschijnlijk een klein foutje...
Hardware connecties: DB4-7 van display aan RB0-3, E-lijn display aan RB4, RS aan RB5 en RW aan RB6
Software main:
#include <p18f1220.h>
#include <xlcd.h>
#include <delays.h>
#pragma config OSC = INTIO2, FSCM = OFF, IESO = OFF, PWRT = OFF, BOR = OFF, WDT = OFF, MCLRE = OFF, STVR = OFF, LVP = OFF, DEBUG = OFF
void init (void);
void DelayFor18TCY(void);
void DelayPORXLCD (void);
void DelayXLCD (void);
void main (void)
{
init();
//char data="a";
// configure external LCD
OpenXLCD( FOUR_BIT & LINE_5X7 );
//putsXLCD(data);
putrsXLCD("test");
}
void init(void)
{
ADCON1 = 0b00001111; //RA0 - 3 => Digataal
OSCCONbits.IRCF0 = 1; //
OSCCONbits.IRCF1 = 1; //Op 8 MHZ zetten interne klok
OSCCONbits.IRCF2 = 1; //
TRISA = 0; //PortA => output
PORTA = 0;
//TRISB = 0; //PortB => output
//PORTB = 0;
// configureer het LCD
//OpenXLCD( FOUR_BIT & LINE_5X7 );
}
/****** LCD Delay Routines *****/
void DelayFor18TCY( void )
{
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
}
void DelayPORXLCD (void)
{
Delay1KTCYx(30); // Delay of 15ms
// Cycles = (TimeDelay * Fosc) / 4
// Cycles = (15ms * 8MHz) / 4
// Cycles = 30,000
return;
}
void DelayXLCD (void)
{
Delay1KTCYx(10); // Delay of 5ms
// Cycles = (TimeDelay * Fosc) / 4
// Cycles = (5ms * 8MHz) / 4
// Cycles = 10,000
return;
}
/* When in 4-bit interface define if the data is in the upper
* or lower nibble. For lower nibble, comment the #define UPPER
*/
//#define UPPER
/* DATA_PORT defines the port to which the LCD data lines are connected */
#define DATA_PORT PORTB
#define TRIS_DATA_PORT TRISB
/* CTRL_PORT defines the port where the control lines are connected.
* These are just samples, change to match your application.
*/
#define RW_PIN PORTBbits.RB6 /* PORT for RW */
#define TRIS_RW DDRBbits.RB6 /* TRIS for RW */
#define RS_PIN PORTBbits.RB5 /* PORT for RS */
#define TRIS_RS DDRBbits.RB5 /* TRIS for RS */
#define E_PIN PORTBbits.RB4 /* PORT for E */
#define TRIS_E DDRBbits.RB4 /* TRIS for E */
Zien jullie hier iets verkeerd aan?
MVG,
Mathieu
picsels
Volgend project: 7-seg gaming displays; dan dec-1982 labvoeding afmaken, dan funcgen met ad9833 afmaken, dan...
Ben meer van de PICBasic maar:
#define DATA_PORT PORTBhoe weet je nou of het laagste nibble of het hoogste nibble wordt gebruikt voor de 4 datalijnen?
Commentaar beter lezen ...
/* When in 4-bit interface define if the data is in the upper
* or lower nibble. For lower nibble, comment the #define UPPER
*/
//#define UPPER
Normaal in upper tenzij je anders aan geeft.
Ik weet kreeg ook geen lcd werkend met c18. Wat ik gedaan heb is de juiste routines gepakt en die in mijn source gezet.
Dus xlcd.h openen, de routines die je nodig hebt eruit halen en waar nodig aanpassen.
Zou u je code eventueel even kunnen mailen? Of hier op het forum zetten? Volgens mij is het toch de lower nibble?
RB0-RB3 en er staat als het de lower is dat upper in commentaar moet staan toch?
Het enige wat ik gebruikt heb is
void write_lcd(unsigned char data){
RS = 0;
RW = 0;
TRISB = 0;
DATA_POORT &=0xF0;
DATA_POORT |= ((data>>4)&0x0F);
EN = 1;
Delay18TCY(1);
EN = 0;
Delay18TCY(2);
}En als je een commando wilt schrijven RS=1. Moet je even in de datasheet kijken. Of in de xlcd header, daar staan ze ook.
write_cmd(0b00101000); //function set
Delay1KTCYx(DELAY);
write_cmd(0b00001100); //disp set
Delay1KTCYx(DELAY);
write_cmd(0b00010100); //entry mode
Delay1KTCYx(DELAY);
write_cmd(0b00000010); //home
Delay1KTCYx(DELAY);
write_cmd(0b10000000); //0Heb ik gebruikt om het lcd op gang te krijgen.
Als je ook user input op je lcd wilt heb je nog wat extra code nodig.