LCDInfo.com
http://forum.lcdinfo.com/

Interfacing KS108 with PIC Microcontroller
http://forum.lcdinfo.com/viewtopic.php?f=9&t=483
Page 1 of 1

Author:  heijak [ Sun Jan 11, 2004 13:16 ]
Post subject:  Interfacing KS108 with PIC Microcontroller

Hi !

NO MORE PROBLEMS !!! IT WORKS !!! :D
The negative voltage for the contrast was the problem. The Code works - could be better but it works.

THANX !!!

Author:  juuva [ Sun Jan 11, 2004 20:17 ]
Post subject:  Re: Interfacing KS108 with PIC Microcontroller

heijak wrote:
void testdata() { //send displaydata to the lcd
//output_high(CS1);
//output_high(CS2);
output_high(RS);
//output_low(RW);
}


Since I don't know how you have connected LCD to pic I can't be sure what is wrong(if something with code is). But if you post link to scematics and specific display type (there are some differences between logic levels = inverted/noninverted inputs), then I believe that someone could help you with your problem.

Edit: Sorry I didn't read sourse well enough, missed point where CS-pins were set.

Author:  heijak [ Mon Jan 12, 2004 1:17 ]
Post subject: 

Hi !!
THANX for your reply.
I actually changed the code a bit. I think it's more readable that way. But it still doesnt work ... :cry: !!! Looks like that just the backlight is working .. :evil:

Something about the connections:
LCD -> PIC16f77
RS -> Port B Pin 7
RW -> Port B Pin 6
E -> Port B Pin 5
D0 -> Port B Pin 4
D1 -> Port B Pin 3
... D4 -> Port B Pin 0
D5 -> Port D Pin 7
D6-> Port D Pin 6
D7 -> Port D Pin 5
CS1 -> Port D Pin 4
CS2 -> Port D Pin 3
Reset -> Port D Pin 2
I used that schematic (replace the parallel port with the PIC16):
http://home.pi.be/~depippe/scheme.gif

Here is the "new" source-code:
#include <16F77.h>
#use delay(clock=20000000)
#define RS PIN_B7
#define RW PIN_B6
#define E PIN_B5
#define D0 PIN_B4
#define D1 PIN_B3
#define D2 PIN_B2
#define D3 PIN_B1
#define D4 PIN_B0
#define D5 PIN_D7
#define D6 PIN_D6
#define D7 PIN_D5
#define CS1 PIN_D4
#define CS2 PIN_D3
#define RESET PIN_D2
int i = 0;
int c = 0;

void pinsetup() {
set_tris_b(0); //port B all outputs
output_b(0); //output on port B all 0s
set_tris_d(0); //port D all outputs
output_d(0); //output on port D all 0s
output_high(RESET); //set Reset to 1, RESET not active ??
delay_ms(1000);
}

void startline() { //instruction to set display start line
output_high(CS1); //select cs1
output_low(CS2);
output_low(RS);
output_low(RW);
delay_ms(250);
output_high(E);
delay_ms(560);
output_low(D0); //display start line
output_low(D1);
output_low(D2);
output_low(D3);
output_low(D4);
output_low(D5);
output_high(D6);
output_high(D7);
delay_ms(50);
output_low(E);
delay_ms(560); //560
}

void setpage() { //instruction to set x address in addressregister
output_high(CS1); //select cs1
output_low(CS2);
output_low(RS);
output_low(RW);
delay_ms(250);
output_high(E);
delay_ms(560);
output_low(D0);
output_low(D1);
output_low(D2);
output_high(D3);
output_high(D4);
output_high(D5);
output_low(D6);
output_high(D7);
delay_ms(50);
output_low(E);
}

void setline() { //instruction to set y address in addresscounter
output_high(CS1); //select cs1
output_low(CS2);
output_low(RS);
output_low(RW);
delay_ms(250);
output_high(E);
delay_ms(560);
output_low(D0);
output_low(D1);
output_low(D2);
output_low(D3);
output_low(D4);
output_low(D5);
output_high(D6);
output_low(D7);
delay_ms(50);
output_low(E);
delay_ms(560);
}

void lcdstartup() { //send display on instruction to the lcd
output_low(E);
delay_ms(560);
output_high(CS1); //select cs1
output_low(CS2);
output_low(RS);
output_low(RW);
delay_ms(250);
output_high(E);
delay_ms(560);
output_high(D0); //display on sequence
output_high(D1);
output_high(D2);
output_high(D3);
output_high(D4);
output_high(D5);
output_low(D6);
output_low(D7);
delay_ms(50);
output_low(E);
delay_ms(560); //=>cs1 on
setpage();
setline();
startline();
i=1;
}

void jumping_e() { //changes E from 1 to 0
output_high(E);
delay_ms(550);
output_low(E);
delay_ms(560);
++c;
}

void testdata() { // should write 11111111 into dram
output_high(CS1); //select cs1
output_low(CS2);
output_high(RS);
output_low(RW);
delay_ms(250);
output_high(E);
delay_ms(560);
output_high(D0); //data for dram
output_high(D1);
output_high(D2);
output_high(D3);
output_high(D4);
output_high(D5);
output_high(D6);
output_high(D7);
delay_ms(50);
output_low(E); //=>write 11111111 into dram
while(c<20)
jumping_e();
}

void main() {
delay_ms(2000);
pinsetup();
if (i<1)
lcdstartup();
testdata();
}

Maybe someone finds a solution ...

Author:  konrad [ Fri Feb 06, 2004 21:52 ]
Post subject: 

Which compiler are you using?
If you are using CCS then the example glcd.c actually is for the ks0108.
I wrote my own driver before realising this.

If you still have problems I will post code.
:)

Author:  konrad [ Fri Feb 06, 2004 22:00 ]
Post subject: 

here is my code, I cannot post the ccs driver obviously
visit www.compysys1.com/workbench
there is a facility for converting bmps to raw data for use with the ks0108

#include "bmp.c"
#include "splash.c"

#byte PORTA= 0x0F80
#byte PORTB= 0x0F81
#byte PORTC= 0x0F82
#byte PORTD= 0x0F83

//board specific definitions for pins
#define lcd_enable PIN_C0 //Enable pin on LCD
#define lcd_cmd PIN_C1 //Data/Command Pin 4 on LCD
#define lcd_rw PIN_C2 //Read/Write Pin 5 on LCD
#define lcd_cs1 PIN_B1 //ChipSelect1 Pin 15 on LCD
#define lcd_cs2 PIN_B2 //ChipSelect2 Pin 16 on LCD
#define lcd_rst PIN_C5 //Reset Pin 17 on LCD

#byte lcd_data = PORTD //ensure PORTD is declared as a byte
#use fast_io(D)

#define LCD_LEFT 1
#define LCD_RIGHT 0

void lcd_init(void);
void lcd_write(int1 half);
void lcd_gotoxy(int8 x, int8 y);
void lcd_clrscr(void);
void lcd_newline(void);
void lcd_progress_bar(int8 x_start, int8 y_start, int8 length, int1 color);

CHAR CONST fonts[475]= { //dec ascii
0x00,0x00,0x00,0x00,0x00, //32 <Space>
0x00,0x00,0x4F,0x00,0x00, //33 !
0x00,0x07,0x00,0x07,0x00, //34 "
0x14,0x7F,0x14,0x7F,0x14, //35 #
0x24,0x2A,0x7F,0x2A,0x12, //36 $
0x23,0x13,0x08,0x64,0x62, //37 %
0x36,0x49,0x55,0x22,0x50, //38 &
0x00,0x05,0x03,0x00,0x00, //39 '
0x1C,0x22,0x41,0x00,0x00, //40 (
0x00,0x00,0x41,0x22,0x1C, //41 )
0x14,0x08,0x3E,0x08,0x14, //42 *
0x08,0x08,0x3E,0x08,0x08, //43 +
0x00,0x50,0x30,0x00,0x00, //44 ,
0x08,0x08,0x08,0x08,0x08, //45 -
0x00,0x60,0x60,0x00,0x00, //46 .
0x20,0x10,0x08,0x04,0x02, //47 /
0x3E,0x51,0x49,0x45,0x3E, //48 0
0x00,0x42,0x7F,0x40,0x00, //49 1
0x42,0x61,0x51,0x49,0x46, //50 2
0x21,0x41,0x45,0x4B,0x31, //51 3
0x18,0x14,0x12,0x7F,0x10, //52 4
0x27,0x45,0x45,0x45,0x39, //53 5
0x3C,0x4A,0x49,0x49,0x30, //54 6
0x01,0x71,0x09,0x05,0x03, //55 7
0x36,0x49,0x49,0x49,0x36, //56 8
0x06,0x49,0x49,0x49,0x3E, //57 9
0x00,0x36,0x36,0x00,0x00, //58 :
0x00,0x56,0x36,0x00,0x00, //59 ;
0x08,0x14,0x22,0x41,0x00, //60 <
0x14,0x14,0x14,0x14,0x14, //61 =
0x00,0x41,0x22,0x14,0x08, //62 >
0x02,0x01,0x51,0x09,0x06, //63 ?
0x32,0x49,0x79,0x41,0x3E, //64 @
0x7E,0x11,0x11,0x11,0x7E, //65 A
0x7F,0x49,0x49,0x49,0x36, //66 B
0x3E,0x41,0x41,0x41,0x22, //67 C
0x7F,0x41,0x41,0x22,0x1C, //68 D
0x7F,0x49,0x49,0x49,0x41, //69 E
0x7F,0x09,0x09,0x09,0x01, //70 F
0x3E,0x41,0x49,0x49,0x7A, //71 G
0x7F,0x08,0x08,0x08,0x7F, //72 H
0x00,0x41,0x7F,0x41,0x00, //73 I
0x20,0x40,0x41,0x3F,0x01, //74 J
0x7F,0x08,0x14,0x22,0x41, //75 K
0x7F,0x40,0x40,0x40,0x40, //76 L
0x7F,0x02,0x0C,0x02,0x7F, //77 M
0x7F,0x04,0x08,0x10,0x7F, //78 N
0x3E,0x41,0x41,0x41,0x3E, //79 O
0x7F,0x09,0x09,0x09,0x06, //80 P
0x3E,0x41,0x51,0x21,0x5E, //81 Q
0x7F,0x09,0x19,0x29,0x46, //82 R
0x46,0x49,0x49,0x49,0x31, //83 S
0x01,0x01,0x7F,0x01,0x01, //84 T
0x3F,0x40,0x40,0x40,0x3F, //85 U
0x1F,0x20,0x40,0x20,0x1F, //86 V
0x3F,0x40,0x38,0x40,0x3F, //87 W
0x63,0x14,0x08,0x14,0x63, //88 X
0x07,0x08,0x70,0x08,0x07, //89 Y
0x61,0x51,0x49,0x45,0x43, //90 Z
0x7F,0x41,0x41,0x00,0x00, //91 [
0x02,0x04,0x08,0x10,0x20, //92 \
0x00,0x00,0x41,0x41,0x7F, //93 ]
0x04,0x02,0x01,0x02,0x04, //94 ^
0x40,0x40,0x40,0x40,0x40, //95 _
0x00,0x01,0x02,0x04,0x00, //96 `
0x20,0x54,0x54,0x54,0x78, //97 a
0x7F,0x48,0x44,0x44,0x38, //98 b
0x38,0x44,0x44,0x44,0x20, //99 c
0x38,0x44,0x44,0x48,0x7F, //100 d
0x38,0x54,0x54,0x54,0x18, //101 e
0x08,0x7E,0x09,0x01,0x02, //102 f
0x0C,0x52,0x52,0x52,0x3E, //103 g
0x7F,0x08,0x04,0x04,0x78, //104 h
0x00,0x44,0x7D,0x40,0x00, //105 i
0x00,0x20,0x40,0x44,0x3D, //106 j
0x7F,0x10,0x28,0x44,0x00, //107 k
0x00,0x41,0x7F,0x40,0x00, //108 l
0x7C,0x04,0x18,0x04,0x78, //109 m
0x7C,0x08,0x04,0x04,0x78, //110 n
0x38,0x44,0x44,0x44,0x38, //111 o
0x7C,0x14,0x14,0x14,0x08, //112 p
0x08,0x14,0x14,0x18,0x7C, //113 q
0x7C,0x08,0x04,0x04,0x08, //114 r
0x48,0x54,0x54,0x54,0x20, //115 s
0x04,0x3F,0x44,0x40,0x20, //116 t
0x3C,0x40,0x40,0x20,0x7C, //117 u
0x1C,0x20,0x40,0x20,0x1C, //118 v
0x3C,0x40,0x30,0x40,0x3C, //119 w
0x44,0x28,0x10,0x28,0x44, //120 x
0x0C,0x50,0x50,0x50,0x3C, //121 y
0x44,0x64,0x54,0x4C,0x44, //122 z
0x08,0x36,0x41,0x00,0x00, //123 {
0x00,0x00,0x7F,0x00,0x00, //124 |
0x00,0x00,0x41,0x36,0x08, //125 }
// 0x00,0x08,0x04,0x08,0x04 //126 ~
0x7E,0x7E,0xFF,0x7E,0x7E //126 ~

};

//position on LCD, x = 0 - 127, y = 0 - 7
int8 x_position, y_position;

#define CS1_MAX_X 63 //chip 1 x range 0 - 63
#define CS2_MAX_X 127 //chip 1 x range 64 - 127

#define DISPLAY_ON 0x3F //LCD Display ON
#define DISPLAY_OFF 0x3E //LCD Display OFF
#define SET_X 0x40 //LCD SET X command, add x - 0 to 63
#define SET_Y 0xB8 //LCD SET Y command, add y - 0 to 7
#define SET_RAM_0 0xC0 //LCD RAM, used for scrolling add x - 0 to 63

void lcd_init(void)
{

//init LCD lines
set_tris_d(0x00);
lcd_data = 0x00;
output_high(lcd_cmd);
output_low(lcd_rw);
output_low(lcd_enable);
output_low(lcd_cs1);
output_low(lcd_cs2);

//reset LCD
output_high(lcd_rst);
delay_us(10);
output_low(lcd_rst);
delay_us(5);
output_high(lcd_rst);
delay_us(10);

//command mode
output_low(lcd_cmd);
lcd_data = DISPLAY_OFF;
lcd_write(LCD_LEFT);
lcd_write(LCD_RIGHT);
lcd_data = SET_RAM_0;
lcd_write(LCD_LEFT);
lcd_write(LCD_RIGHT);
lcd_gotoxy(0,0);
lcd_data = DISPLAY_ON;
lcd_write(LCD_LEFT);
lcd_write(LCD_RIGHT);
output_high(lcd_cmd);

x_position = 0;
y_position = 0;

return;
}



void lcd_write(int1 half)
{
delay_us(10);
if(half)
{
output_high(lcd_cs1);
output_low(lcd_cs2);
}
else
{
output_low(lcd_cs1);
output_high(lcd_cs2);
}
delay_us(5);
output_high(lcd_enable);
delay_us(5);
output_low(lcd_enable);
delay_us(5);

return;
}



void lcd_clrscr(void)
{
int8 x,y;

output_low(lcd_cmd);

lcd_data = DISPLAY_OFF;
lcd_write(LCD_LEFT);
lcd_write(LCD_RIGHT);

output_high(lcd_cmd);

for(y=0; y<8; y++)
{
output_low(lcd_cmd);

lcd_data = SET_Y + y;
lcd_write(LCD_LEFT);
lcd_write(LCD_RIGHT);

output_high(lcd_cmd);

for(x=0; x<64; x++)
{
lcd_data = 0;
lcd_write(LCD_LEFT);
lcd_write(LCD_RIGHT);
}
}

output_low(lcd_cmd);

lcd_data = DISPLAY_ON;
lcd_write(LCD_LEFT);
lcd_write(LCD_RIGHT);

output_high(lcd_cmd);

lcd_gotoxy(0,0);

return;
}


void lcd_putc( char c)
{
int16 index,count;
int8 x;

switch (c)
{
case '\f' :
lcd_clrscr();
break;

case '\n' :
lcd_newline();
break;

default :
//check there is space to print
if((x_position + 5) < CS2_MAX_X)
{ //print character
index = (int16)(c - 32) * 5;

for(x=0; x<5; x++)
{
lcd_data = fonts[index++];
if(x_position > CS1_MAX_X)
{
lcd_write(LCD_RIGHT);
}
else
{
lcd_write(LCD_LEFT);
}
x_position++;
}
}
if((x_position + 1) < CS2_MAX_X)
{
lcd_data = 0x00;
if(x_position > CS1_MAX_X)
{
lcd_write(LCD_RIGHT);
}
else
{
lcd_write(LCD_LEFT);
}
x_position++;
}
break;
}

return;
}






int8 lcd_read_byte()
{
int8 data;
set_tris_d(0xFF);


output_high(lcd_rw);
if(x_position > 63)
{
output_high(lcd_cs2);
delay_us(2);
output_high(lcd_enable);
delay_us(2);
output_low(lcd_enable);
delay_us(2);
output_high(lcd_enable);
delay_us(6);
data = lcd_data;
output_low(lcd_enable);
delay_us(2);
output_low(lcd_cs2);

}
else
{
output_high(lcd_cs1);
delay_us(2);
output_high(lcd_enable);
delay_us(2);
output_low(lcd_enable);
delay_us(2);
output_high(lcd_enable);
delay_us(6);
data = lcd_data;
output_low(lcd_enable);
delay_us(2);
output_low(lcd_cs1);

}
output_low(lcd_rw);
set_tris_d(0x00);

return data;
}



void lcd_gotoxy( int8 x, int8 y)
{
x_position = x;
y_position = y;

output_low(lcd_cmd);
if(x > 63)
{
x = x - 63;
lcd_data = SET_X + x;
lcd_write(LCD_RIGHT);

lcd_data = SET_X;
lcd_write(LCD_LEFT);
}
else
{
lcd_data = SET_X + x;
lcd_write(LCD_LEFT);

lcd_data = SET_X;
lcd_write(LCD_RIGHT);
}

lcd_data = SET_Y + y;
lcd_write(LCD_LEFT);
lcd_write(LCD_RIGHT);
output_high(lcd_cmd);

return;
}


void lcd_newline(void)
{
x_position = 0;

if(y_position < 7) //check for last line
{
y_position ++;

output_low(lcd_cmd);
lcd_data = SET_X;
lcd_write(LCD_LEFT);
lcd_write(LCD_RIGHT);
lcd_data = SET_Y + y_position;
lcd_write(LCD_LEFT);
lcd_write(LCD_RIGHT);
output_high(lcd_cmd);
}

return;
}


void lcd_load_bmp(void)
{
int8 x,y;
int16 ptr=0;


output_low(lcd_cmd);

lcd_data = DISPLAY_OFF;
lcd_write(LCD_LEFT);
lcd_write(LCD_RIGHT);

output_high(lcd_cmd);

for(y=0; y<8; y++)
{
output_low(lcd_cmd);

lcd_data = SET_Y + y;
lcd_write(LCD_LEFT);
lcd_write(LCD_RIGHT);

output_high(lcd_cmd);

for(x=0; x<64; x++)
{
lcd_data = bmp[ptr++];
lcd_write(LCD_LEFT);
}
for(x=0; x<64; x++)
{
lcd_data = bmp[ptr++];
lcd_write(LCD_RIGHT);
}
}

output_low(lcd_cmd);
lcd_data = DISPLAY_ON;
lcd_write(LCD_LEFT);
lcd_write(LCD_RIGHT);

output_high(lcd_cmd);

lcd_gotoxy(0,0);

return;
}

void lcd_load_splash(void)
{
int8 x,y;
int16 ptr=0;


output_low(lcd_cmd);

lcd_data = DISPLAY_OFF;
lcd_write(LCD_LEFT);
lcd_write(LCD_RIGHT);

output_high(lcd_cmd);

for(y=0; y<8; y++)
{
output_low(lcd_cmd);

lcd_data = SET_Y + y;
lcd_write(LCD_LEFT);
lcd_write(LCD_RIGHT);

output_high(lcd_cmd);

for(x=0; x<64; x++)
{
lcd_data = splash[ptr++];
lcd_write(LCD_LEFT);
}
for(x=0; x<64; x++)
{
lcd_data = splash[ptr++];
lcd_write(LCD_RIGHT);
}
}

output_low(lcd_cmd);
lcd_data = DISPLAY_ON;
lcd_write(LCD_LEFT);
lcd_write(LCD_RIGHT);

output_high(lcd_cmd);

lcd_gotoxy(0,0);

return;
}


void lcd_progress_bar(int8 x_start, int8 y_start, int8 length, int1 color)
{
int8 x_end,x;

lcd_gotoxy(x_start, y_start);
x_end = x_start + length;

if(color == 1)
{
lcd_data = 0xFF;
}
else
{
lcd_data = 0x00;
}
//check there is space to print
if((x_position + length) < CS2_MAX_X)
{
for(x=0; x<length; x++)
{
if(x_position > CS1_MAX_X)
{
lcd_write(LCD_RIGHT);
}
else
{
lcd_write(LCD_LEFT);
}
x_position++;
}
}
return;
}

Author:  heijak [ Sat Feb 07, 2004 0:49 ]
Post subject: 

Hi !

Thanx for your help. Your code will help me to understand how the display and all the functions work.

heijak

Author:  jmaquino [ Mon Apr 12, 2004 17:12 ]
Post subject:  how can i get the *.c and *.h files?

Hi!!

i'm new on this forum and i found all the information very usefull.
i need to connnect a PIC microcontroller to a ks108 lcd, i tried to used the programs that you posted in the forum but i need the 16F77.h, bmp.c and
splash.c files, please you can say me where can i get them?
Thanks in advance for all your help

Author:  Henri [ Thu Apr 15, 2004 11:49 ]
Post subject: 

I'm not sure what is in the bmp.c and splash.c files but they might include some image data.
16F77.h comes with the compiler. I'm not sure which compiler was used here, maybe CCS.

Page 1 of 1 All times are UTC + 2 hours
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/