/*--------------------------------------
Juras-Projects 2009
LS020 LCD 8-bit palette demo program
Schematic diagram at http://www.juras-projects.org/eng/lcd.php
(S65 LCD Test Board)
Compiled with IAR for AVR
--------------------------------------*/
#define ENABLE_BIT_DEFINITIONS // enables the bit definitions, such as PD0, CS01, WGM02..
#include ‹intrinsics.h›
#include ‹iom16.h›
#define F_CPU 16000000 // Only for delay calculations
#define RST PB3
#define RS PB2
#define CS PB4
// All "chars" are unsigned chars types in the IAR-compiler by default
__flash char init_array_0[20]=
{0xEF, 0x00, 0xEE, 0x04, 0x1B, 0x04, 0xFE, 0xFE,
0xFE, 0xFE, 0xEF, 0x90, 0x4A, 0x04, 0x7F, 0x3F,
0xEE, 0x04, 0x43, 0x06};
__flash char init_array_1[46]=
{0xEF, 0x90, 0x09, 0x83, 0x08, 0x00, 0x0B, 0xAF,
0x0A, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00,
0xEF, 0x00, 0xEE, 0x0C, 0xEF, 0x90, 0x00, 0x80,
0xEF, 0xB0, 0x49, 0x02, 0xEF, 0x00, 0x7F, 0x01,
0xE1, 0x81, 0xE2, 0x02, 0xE2, 0x76, 0xE1, 0x83,
0x80, 0x01, 0xEF, 0x90, 0x00, 0x00};
__flash char font6x8[576]=
{0x00,0x00,0x00,0x00,0x00,0x00, // Symbol 20
0x00,0x00,0x00,0x5F,0x00,0x00, // Symbol 21
0x00,0x00,0x03,0x00,0x03,0x00, // Symbol 22
0x22,0x7F,0x22,0x22,0x7F,0x22, // Symbol 23
0x00,0x24,0x2A,0x6B,0x2A,0x12, // Symbol 24
0x00,0x23,0x13,0x08,0x64,0x62, // Symbol 25
0x00,0x3A,0x45,0x45,0x3A,0x28, // Symbol 26
0x00,0x00,0x00,0x02,0x01,0x00, // Symbol 27
0x00,0x00,0x3E,0x41,0x00,0x00, // Symbol 28
0x00,0x00,0x41,0x3E,0x00,0x00, // Symbol 29
0x00,0x2A,0x1C,0x1C,0x2A,0x00, // Symbol 2A
0x00,0x08,0x08,0x3E,0x08,0x08, // Symbol 2B
0x00,0x00,0x80,0x40,0x00,0x00, // Symbol 2C
0x00,0x08,0x08,0x08,0x08,0x00, // Symbol 2D
0x00,0x00,0x00,0x40,0x00,0x00, // Symbol 2E
0x00,0x20,0x10,0x08,0x04,0x02, // Symbol 2F
0x00,0x3E,0x51,0x49,0x45,0x3E, // Symbol 30
0x00,0x00,0x42,0x7F,0x40,0x00, // Symbol 31
0x00,0x62,0x51,0x51,0x51,0x4E, // Symbol 32
0x00,0x21,0x41,0x45,0x45,0x3B, // Symbol 33
0x00,0x18,0x16,0x11,0x7F,0x10, // Symbol 34
0x00,0x27,0x45,0x45,0x45,0x39, // Symbol 35
0x00,0x3E,0x49,0x49,0x49,0x32, // Symbol 36
0x00,0x01,0x61,0x11,0x09,0x07, // Symbol 37
0x00,0x36,0x49,0x49,0x49,0x36, // Symbol 38
0x00,0x26,0x49,0x49,0x49,0x3E, // Symbol 39
0x00,0x00,0x00,0x12,0x00,0x00, // Symbol 3A
0x00,0x00,0x20,0x12,0x00,0x00, // Symbol 3B
0x00,0x08,0x14,0x22,0x41,0x00, // Symbol 3C
0x00,0x14,0x14,0x14,0x14,0x14, // Symbol 3D
0x00,0x41,0x22,0x14,0x08,0x00, // Symbol 3E
0x00,0x06,0x01,0x51,0x09,0x06, // Symbol 3F
0x00,0x3E,0x41,0x4D,0x4D,0x2E, // Symbol 40
0x00,0x78,0x16,0x11,0x16,0x78, // Symbol 41
0x00,0x7F,0x49,0x49,0x49,0x36, // Symbol 42
0x00,0x3E,0x41,0x41,0x41,0x22, // Symbol 43
0x00,0x7F,0x41,0x41,0x41,0x3E, // Symbol 44
0x00,0x7F,0x49,0x49,0x49,0x41, // Symbol 45
0x00,0x7F,0x09,0x09,0x09,0x01, // Symbol 46
0x00,0x3E,0x41,0x41,0x51,0x32, // Symbol 47
0x00,0x7F,0x08,0x08,0x08,0x7F, // Symbol 48
0x00,0x00,0x41,0x7F,0x41,0x00, // Symbol 49
0x00,0x30,0x40,0x41,0x41,0x3F, // Symbol 4A
0x00,0x7F,0x08,0x08,0x14,0x63, // Symbol 4B
0x00,0x7F,0x40,0x40,0x40,0x60, // Symbol 4C
0x00,0x7F,0x04,0x18,0x04,0x7F, // Symbol 4D
0x00,0x7F,0x04,0x08,0x10,0x7F, // Symbol 4E
0x00,0x3E,0x41,0x41,0x41,0x3E, // Symbol 4F
0x00,0x7F,0x09,0x09,0x09,0x06, // Symbol 50
0x00,0x3E,0x41,0x61,0x21,0x5E, // Symbol 51
0x00,0x7F,0x09,0x09,0x19,0x66, // Symbol 52
0x00,0x26,0x49,0x49,0x49,0x32, // Symbol 53
0x00,0x01,0x01,0x7F,0x01,0x01, // Symbol 54
0x00,0x3F,0x40,0x40,0x40,0x3F, // Symbol 55
0x00,0x07,0x18,0x60,0x18,0x07, // Symbol 56
0x00,0x1F,0x60,0x18,0x60,0x1F, // Symbol 57
0x00,0x63,0x14,0x08,0x14,0x63, // Symbol 58
0x00,0x03,0x04,0x78,0x04,0x03, // Symbol 59
0x00,0x61,0x51,0x49,0x45,0x43, // Symbol 5A
0x00,0x00,0x7F,0x41,0x00,0x00, // Symbol 5B
0x00,0x02,0x04,0x08,0x10,0x20, // Symbol 5C
0x00,0x00,0x41,0x7F,0x00,0x00, // Symbol 5D
0x00,0x00,0x00,0x00,0x00,0x00, // Symbol 5E
0x40,0x40,0x40,0x40,0x40,0x40, // Symbol 5F
0x00,0x00,0x00,0x01,0x02,0x00, // Symbol 60
0x00,0x20,0x54,0x54,0x54,0x78, // Symbol 61
0x00,0x7E,0x48,0x48,0x48,0x30, // Symbol 62
0x00,0x38,0x44,0x44,0x44,0x28, // Symbol 63
0x00,0x30,0x48,0x48,0x48,0x7E, // Symbol 64
0x00,0x38,0x54,0x54,0x54,0x18, // Symbol 65
0x00,0x10,0x7C,0x12,0x02,0x04, // Symbol 66
0x00,0x0C,0x52,0x52,0x3C,0x02, // Symbol 67
0x00,0x7E,0x08,0x08,0x08,0x70, // Symbol 68
0x00,0x00,0x00,0x74,0x00,0x00, // Symbol 69
0x00,0x40,0x80,0x80,0x74,0x00, // Symbol 6A
0x00,0x7E,0x10,0x10,0x10,0x6C, // Symbol 6B
0x00,0x00,0x02,0x7E,0x00,0x00, // Symbol 6C
0x00,0x7C,0x04,0x78,0x04,0x78, // Symbol 6D
0x00,0x7C,0x04,0x04,0x04,0x78, // Symbol 6E
0x00,0x38,0x44,0x44,0x44,0x38, // Symbol 6F
0x00,0xFC,0x24,0x24,0x24,0x18, // Symbol 70
0x00,0x18,0x24,0x24,0x24,0xFC, // Symbol 71
0x00,0x7C,0x08,0x04,0x04,0x08, // Symbol 72
0x00,0x48,0x54,0x54,0x54,0x20, // Symbol 73
0x00,0x08,0x3E,0x48,0x40,0x00, // Symbol 74
0x00,0x3C,0x40,0x40,0x40,0x3C, // Symbol 75
0x00,0x1C,0x20,0x40,0x20,0x1C, // Symbol 76
0x00,0x3C,0x40,0x30,0x40,0x3C, // Symbol 77
0x00,0x44,0x28,0x10,0x28,0x44, // Symbol 78
0x00,0x1C,0x20,0xA0,0xA0,0x7C, // Symbol 79
0x00,0x44,0x64,0x54,0x4C,0x44, // Symbol 7A
0x00,0x08,0x36,0x41,0x00,0x00, // Symbol 7B
0x00,0x00,0x00,0x7F,0x00,0x00, // Symbol 7C
0x00,0x00,0x41,0x36,0x08,0x00, // Symbol 7D
0x02,0x01,0x01,0x02,0x02,0x01, // Symbol 7E
0x00,0x7F,0x7F,0x7F,0x7F,0x7F}; // Symbol 7F
__flash char text0[]= " Juras-Projects 2009 ";
__flash char text1[]= "8-BIT, BGR off, RE8=0x00:";
__flash char text2[]= "8-BIT, BGR on, RE8=0x40:";
__flash char text3[]= "8-COLOR mode, R04=0x01:";
__flash char text4[]= "65K-COLOR mode, R04=0x00:";
__flash char text5[]= "Scrolling image using R11";
void ls020_wrcmd8(char cmd)
{
PORTB|=(1‹‹RS); //Set RS
PORTB&=~(1‹‹CS); // select LCD
SPDR=cmd;
__delay_cycles(16);
PORTB|=(1‹‹CS); // deselect LCD
}
void ls020_wrcmd16(int cmd16)
{
ls020_wrcmd8((cmd16››8)&0xFF);
ls020_wrcmd8(cmd16&0xFF);
}
void ls020_wrdata8(char data)
{
PORTB&=~(1‹‹RS); // Clear RS
PORTB&=~(1‹‹CS); // select LCD
SPDR=data;
__delay_cycles(16);
PORTB|=(1‹‹CS); // deselect LCD
}
void ls020_8bit_mode(char BGR)// BGR=0 - disabled, BGR=1 - enabled.
{
ls020_wrcmd16(0xE800+(BGR&0x01)*0x40);
}
void ls020_16bit_mode(void)
{
ls020_wrcmd16(0xE80F);
}
void ls020_8_color_mode(void)
{
ls020_wrcmd16(0x0401);
ls020_wrcmd16(0x0000);
}
void ls020_65k_color_mode(void)
{
ls020_wrcmd16(0x0400);
ls020_wrcmd16(0x0000);
}
void ls020_set_window(char x1, char y1, char x2,char y2)
{
ls020_wrcmd16(0x0500);// Set Direction
ls020_wrcmd16(0x0A00+x1);
ls020_wrcmd16(0x0B00+x2);
ls020_wrcmd16(0x0800+y1);
ls020_wrcmd16(0x0900+y2);
}
void ls020_rectangle8(char x1, char y1, char x2, char y2, char color)
{
ls020_set_window(x1,y1,x2,y2);
for (char y=y1;y‹=y2;y++)
{
for (char x=x1;x‹=x2;x++)
{
ls020_wrdata8(color);
}
}
}
void ls020_put_char8(char x, char y, char symbol, char color, char bkcolor)
{
ls020_set_window(x,y,x+5,y+7);
int offset=6*(symbol-0x20);
for (char i=0;i‹6;i++)
{
for (char j=0;j‹8;j++) {if (((font6x8[offset+i]‹‹j)&0x80)==0x80) {ls020_wrdata8(color);} else {ls020_wrdata8(bkcolor);}}
}
}
void ls020_put_string8(char x, char y, char __flash * text, char color, char bkcolor)
{
char i=0;
char x0=0;
while (text[i]!=0)
{
ls020_put_char8(x+x0,y,text[i],color,bkcolor);
i++;
x0+=6;
}
}
void ls020_scroll(char offset)
{
ls020_wrcmd16(0x1100+offset);
}
void ls020_init_lcd(void)
{
PORTB&=~(1‹‹RST); // Pull RST pin down
__delay_cycles(F_CPU*0.001);// delay 1ms
PORTB|=(1‹‹RST); // Release RST pin
ls020_wrcmd16(0xFDFD);
ls020_wrcmd16(0xFDFD);
__delay_cycles(F_CPU*0.068);// delay 68ms
for (char i=0; i‹20; i++) { ls020_wrcmd8(init_array_0[i]); }
__delay_cycles(F_CPU*0.010);// delay 10ms
for (char i=0; i‹46; i++) { ls020_wrcmd8(init_array_1[i]); }
}
void draw_table(void)
{
for (char y=0; y‹16; y++)
{
for (char x=0; x‹16; x++)
{
ls020_rectangle8(x*10+9,y*7+5,x*10+8+9,y*7+5+5,y*1 6+x);
}
}
}
void main( void )
{
DDRB=0xFF; // PortB is output
PORTB=0xFF;
SPCR=(1‹‹MSTR)|(1‹‹SPE); // SPI config
SPSR=1;
ls020_init_lcd();// Init LS020 LCD
ls020_8bit_mode(0);// Set 8bit LCD host mode
ls020_rectangle8(0,0,175,131,0x80);// Fill Screen with dark red color
ls020_put_string8(14,120,text0,0xFF,0x80);
__delay_cycles(F_CPU*1);// delay 500ms
ls020_rectangle8(0,0,175,131,0x00);// Fill Screen with black color, same as clear screen
while(1)
{
ls020_8bit_mode(0);
ls020_put_string8(14,120,text1,0xFF,0x00);
draw_table();
__delay_cycles(F_CPU*0.5);// delay 500ms
ls020_8bit_mode(1);
ls020_put_string8(14,120,text2,0xFF,0x00);
draw_table();
__delay_cycles(F_CPU*0.5);// delay 500ms
ls020_put_string8(14,120,text3,0xFF,0x00);
ls020_8_color_mode();
__delay_cycles(F_CPU*0.5);// delay 500ms
ls020_put_string8(14,120,text4,0xFF,0x00);
ls020_65k_color_mode();
__delay_cycles(F_CPU*0.5);// delay 500ms
ls020_put_string8(14,120,text5,0xFF,0x00);
__delay_cycles(F_CPU*0.5);// delay 500ms
for (char i=0; i‹176; i++)
{
ls020_scroll(i);
__delay_cycles(100000);
}
}
} |