If you want to use it as digital I/O you must put this into your init routine:
ADCON1=6;
#include <pic.h>
//#include <delay.h>
void delay_ms()
{
for(int k=0;k<100;k++);
}
void lcd_cmd(char ch)
{
PORTD=ch; //sending character element on port
PORTC=0x04;
delay_ms(100); //to wait for character to write on lcd
PORTC=0x00;
}
void lcd_data(char ch)
{
PORTD=ch;
PORTC=0x05;
delay_ms(100);
PORTC=0x01;
}
void init_lcd()
{
lcd_cmd(0x38); // function set (set interface length)
lcd_cmd(0x0E); //enable cursor display
//lcd_cmd(0x01); //clear display
//lcd_cmd(0x06); //entry mode set
//lcd_cmd(0x1C); //move cursor
}
void main(void)
{
char str[] = "Welcome";
int len;
int i;
TRISC=0;
TRISD=0;
init_lcd();
len=sizeof(str);
for( i=0;i<=len;i++) //for sending commands character by character
{
lcd_data(str);
}
lcd_cmd(0x0c);
lcd_cmd(0x02);
}
this will work better
Very useful code. Is it written for any LCD having a Hitachi HD44780 controller chip?
Secondly whats the function of following commands
lcd_cmd(0x0c);
lcd_cmd(0x02);
Thanks
#include <pic.h>
//#include <delay.h>
void delay_ms()
{
for(int k=0;k<100;k++);
}
void lcd_cmd(char ch)
{
PORTD=ch; //sending character element on port
PORTC=0x04;
delay_ms(100); //to wait for character to write on lcd
PORTC=0x00;
}
void lcd_data(char ch)
{
PORTD=ch;
PORTC=0x05;
delay_ms(100);
PORTC=0x01;
}
void init_lcd()
{
lcd_cmd(0x38); // function set (set interface length)
lcd_cmd(0x0E); //enable cursor display
//lcd_cmd(0x01); //clear display
//lcd_cmd(0x06); //entry mode set
//lcd_cmd(0x1C); //move cursor
}
void main(void)
{
char str[] = "Welcome";
int len;
int i;
TRISC=0;
TRISD=0;
init_lcd();
len=sizeof(str);
for( i=0;i<=len;i++) //for sending commands character by character
{
lcd_data(str);
}
lcd_cmd(0x0c);
lcd_cmd(0x02);
}
this will work better
void lcd_init()
{
char init_value;
init_value = 0x3;
TRISB=0;
TRISD=0;
LCD_RS = 0;
LCD_EN = 0;
DelayMs(15); // wait 15mSec after power applied,
LCD_DATA = init_value;
lcd_EN_toggle();
DelayMs(50);
LCD_DATA = init_value;
lcd_EN_toggle();
DelayUs(200);
LCD_DATA = init_value;
lcd_EN_toggle();
DelayUs(200);
LCD_DATA = 2; // Four bit mode
lcd_EN_toggle();
lcd_write(0x28); // Set interface length
lcd_write(0xF); // Display On, Cursor On, Cursor Blink
lcd_clear(); // Clear screen
lcd_write(0x6); // Set entry Mode
}
void lcd_write(unsigned char c)
{
DelayUs(400);
LCD_DATA = ( ( c >> 4 ) & 0x0f );
lcd_EN_toggle();
LCD_DATA = ( c & 0x0f );
lcd_EN_toggle();
}
#define LCD_RS RD7
//#define LCD_RW RB0
#define LCD_EN RD6
#define LCD_DATA PORTB
#define DelayUs(x) { unsigned char _dcnt; \
_dcnt = (x)/((12MHZ)/(XTAL_FREQ))|1; \
while(--_dcnt != 0) \
continue; }
Any ideas where I should look for the solution?
Btw. is there any harm using RB0..RB2 ports for the control wires since those aren't used for anything else? Or is there something that must be done differently for data port definition?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?