|
|
View previous topic :: View next topic |
Author |
Message |
sonicdeejay
Joined: 20 Dec 2005 Posts: 112
|
Working LCD.c driver for Samsung based chip |
Posted: Thu Feb 09, 2006 11:13 am |
|
|
I am using PIC18F2525 with a 2x16 matric LCD based on S6A0069 and works well so far...(thx to PCM programmer for his helps)
This is my lcdmod.c
Code: |
struct lcd_pin_map { // This structure is overlayed
BOOLEAN enable; // on to an I/O port to gain
BOOLEAN rs; // access to the LCD pins.
BOOLEAN rw; // The bits are allocated from
BOOLEAN unused; // low order up. ENABLE will
int data : 4; // be pin B0.
} lcd;
#if defined(__PCH__)
#if defined use_portb_lcd
#byte lcd = 0xF81 // This puts the entire structure
#else
#byte lcd = 0xF83 // This puts the entire structure
#endif
#else
#if defined use_portb_lcd
#byte lcd = 6 // on to port B (at address 6)
#else
#byte lcd = 8 // on to port D (at address 8)
#endif
#endif
#if defined use_portb_lcd
#define set_tris_lcd(x) set_tris_b(x)
#else
#define set_tris_lcd(x) set_tris_d(x)
#endif
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the second line
BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
// These bytes need to be sent to the LCD
// to start it up.
// The following are used for setting
// the I/O port direction register.
struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in
BYTE lcd_read_byte() {
BYTE low,high;
set_tris_lcd(LCD_READ);
lcd.rw = 1;
delay_cycles(1);
lcd.enable = 1;
delay_cycles(1);
high = lcd.data;
lcd.enable = 0;
delay_cycles(1);
lcd.enable = 1;
delay_us(1);
low = lcd.data;
lcd.enable = 0;
set_tris_lcd(LCD_WRITE);
return( (high<<4) | low);
}
//Modified code to fit S6A0069 chip based LCD
void lcd_send_nibble( BYTE n ) {
lcd.data = n;
delay_cycles(1);
lcd.enable = 1;
delay_us(2);
lcd.enable = 0;
}
//Orignal LCD format
/*void lcd_send_nibble( BYTE n ) {
lcd.data = n;
delay_cycles(1);
lcd.enable = 1;
delay_us(2);
lcd.enable = 0;
}*/
void lcd_send_byte( BYTE address, BYTE n ) {
lcd.rs = 0;
while ( bit_test(lcd_read_byte(),7) ) ;
lcd.rs = address;
delay_cycles(1);
lcd.rw = 0;
delay_cycles(1);
lcd.enable = 0;
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
//Modified code to fit S6A0069 chip based LCD
void lcd_init() {
set_tris_lcd(LCD_WRITE);
lcd.rs = 0;
lcd.rw = 0;
lcd.enable = 0;
delay_ms(30);
lcd_send_nibble(0x02);
delay_us(1);
lcd_send_nibble(0x02);
delay_us(1);
lcd_send_nibble(0x0C);
delay_us(45);
lcd_send_nibble(0x00);
delay_us(1);
lcd_send_nibble(0x0F);
delay_us(45);
lcd_send_nibble(0x00);
delay_us(1);
lcd_send_nibble(0x01);
delay_ms(2);
lcd_send_nibble(0x00);
delay_us(1);
lcd_send_nibble(0x06);
delay_ms(2);
}
//Orignal LCD format
/*
void lcd_init() {
BYTE i;
set_tris_lcd(LCD_WRITE);
lcd.rs = 0;
lcd.rw = 0;
lcd.enable = 0;
delay_ms(15);
for(i=1;i<=3;++i) {
lcd_send_nibble(3);
delay_ms(5);
}
lcd_send_nibble(2);
for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING[i]);
}*/
void lcd_gotoxy( BYTE x, BYTE y) {
BYTE address;
if(y!=1)
address=lcd_line_two;
else
address=0;
address+=x-1;
lcd_send_byte(0,0x80|address);
}
void lcd_putc( char c) {
switch (c) {
case '\f' : lcd_send_byte(0,1);
delay_ms(2);
break;
case '\n' : lcd_gotoxy(1,2); break;
case '\b' : lcd_send_byte(0,0x10); break;
default : lcd_send_byte(1,c); break;
}
}
|
Last edited by sonicdeejay on Fri Feb 24, 2006 5:21 pm; edited 1 time in total |
|
|
sonicdeejay
Joined: 20 Dec 2005 Posts: 112
|
|
Posted: Mon Feb 20, 2006 7:19 pm |
|
|
In my main program..
Code: | #include <18F2525.h> // Call for PIC18F2525 Driver
#device ICD=TRUE
#device ADC=10 // Use 10bits ADC
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=16000000) // 16Mhz Crystal is Used
#use rs232(baud=9600, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8) // RS232 Configuration for COM Port Communication
#define use_portb_lcd TRUE // Using Port B for LCD Display
#include <lcdmod.c> // This is Where I call for lcdmod.c
#byte PORTB = 0xf81
#byte PORTC = 0xf82
#include <stdlib.h>
#include <math.h> |
|
|
|
sonicdeejay
Joined: 20 Dec 2005 Posts: 112
|
|
Posted: Sun Feb 26, 2006 6:29 am |
|
|
My physical connection is ...
Code: | LCD - PIC18F2525
VSS - GND
VDD - 5V
V0 - O/P from variable ressitor (20KOhm)
R/S - PORT_B1
R/W - PORT_B2
E - PORT_B0
DB0 - NC (not connected)
DB1 - NC (not connected)
DB2 - NC (not connected)
DB3 - NC (not connected)
DB4 - PORT_B4
DB5 - PORT_B5
DB6 - PORT_B6
DB7 - PORT_B7 |
|
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|