#include "ssd1848.h"
#include "image.h"
#define LCDVOP (11.7)
#define XSIZE (128)
#define YSIZE (128)
#if(YSIZE % 4)
#define PAGESIZE (YSIZE / 4 + 1)
#else
#define PAGESIZE (YSIZE / 4)
#endif
#if(XSIZE % 8)
#define COLUMNSIZE (XSIZE / 8 + 1)
#else
#define COLUMNSIZE (XSIZE / 8)
#endif
code Regulator_ResistorRatio RR = V4_41;
u8 vop;
void Delay_ms(u16 ms) //@12.000MHz
{
u8 i, j;
do
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}while(--ms);
}
void Write_Cmd(u8 value)
{
u8 i;
cs = 0;
a0 = 0;
for(i = 0; i < 8; i++)
{
sck = 0;
sdi = value & 0x80 ? 1: 0;
sck = 1;
value <<= 1;
}
cs = 1;
}
void Write_Data(u8 value)
{
u8 i;
cs = 0;
a0 = 1;
for(i = 0; i < 8; i++)
{
sck = 0;
sdi = value & 0x80 ? 1: 0;
sck = 1;
value <<= 1;
}
cs = 1;
}
void Set_ColumnAddress(u8 sx, u8 ex)
{
Write_Cmd(0x15);
Write_Data(sx);
Write_Data(ex);
}
void Set_PageAddress(u8 sp, u8 ep)
{
Write_Cmd(0x75);
Write_Data(sp);
Write_Data(ep);
}
void Set_COM_OutputScan(COM_OutputScan xx)
{
Write_Cmd(0xBB);
Write_Data(xx);
}
void Set_Duty(u8 duty)
{
Write_Cmd(0xCA);
Write_Data(0x00);
Write_Data(duty);
Write_Data(0x00);
}
void Set_PowerControl(PowerControl xx)
{
Write_Cmd(0x20);
Write_Data(xx | 0x03);
}
void Set_Vop(u8 xx,Regulator_ResistorRatio yy)
{
Write_Cmd(0x81);
Write_Data(xx);
Write_Data(yy);
}
void Set_Bias(Bias bs)
{
Write_Cmd(0xFB);
Write_Data(bs);
// Write_Cmd(bs);
}
void Set_MonoMode(void)
{
Write_Cmd(0xF7);
Write_Data(0x00);
Write_Data(0x0E);
Write_Data(0x41);
}
void Pause_Display(u16 ms)
{
Delay_ms(ms);
while(!pause)
{
if(!key1)
{
Delay_ms(1);
if (!key1)
{
vop++;
Set_Vop(vop,RR);
while(!key1);
}
}
if(!key2)
{
Delay_ms(1);
if (!key2)
{
vop--;
Set_Vop(vop,RR);
while(!key2);
}
}
}
}
void Reset_LCM(void)
{
res = 1;
Delay_ms(10);
res = 0;
Delay_ms(50);
res = 1;
Delay_ms(50);
}
void Initial_LCM(void)
{
Reset_LCM();
Write_Cmd(0xD1); // OSC ON
Delay_ms(2);
Write_Cmd(0x94); // Exit sleep mode
Delay_ms(12);
Set_PowerControl(X4);
Set_Bias(B1_10);
Set_Duty(PAGESIZE - 1);
Set_COM_OutputScan(C064_12965);
Set_Vop(vop,RR);
Write_Cmd(0xBC);
Write_Data(0x02);
Write_Data(0x3F);
Write_Data(0x1F);
Write_Cmd(0x44);
Write_Data(0x00);
Write_Cmd(0xF2);
Write_Data(0x40 | 0x1E);
Write_Data(0x80 | (YSIZE >> 2));
Set_MonoMode();
Write_Cmd(0xA8);
Write_Data(0x00);
Write_Data(YSIZE - 1);
Write_Cmd(0xAF);
}
void Set_DisplayWindow(u8 sp, u8 ep, u8 sc, u8 ec)
{
u8 START_SEG = 1;
Set_PageAddress(sp,ep);
Set_ColumnAddress(sc+START_SEG,ec+START_SEG);
}
void Display_Byte(u8 value1, u8 value2)
{
u8 i,j;
Set_DisplayWindow(0,YSIZE - 1,0,COLUMNSIZE - 1);
Write_Cmd(0x5C);
for(i = 0; i < YSIZE; i++)
{
if(i & 0x01)
{
for(j = 0; j < COLUMNSIZE; j++)
{
Write_Data(value2);
}
}
else
{
for(j = 0; j < COLUMNSIZE; j++)
{
Write_Data(value1);
}
}
}
}
void Display_Image(u8* image)
{
u8 i,j;
Set_DisplayWindow(0,YSIZE - 1,0,COLUMNSIZE-1);
Write_Cmd(0x5C);
for(i = 0; i < YSIZE; i++)
{
for(j = 0; j < COLUMNSIZE; j++)
{
Write_Data(*image++);
}
}
}
#define TIME 500
void main(void)
{
vop = 22;
Initial_LCM();
while(1)
{
Display_Byte(0xFF,0xFF);
Pause_Display(TIME);
Display_Byte(0x00,0x00);
Pause_Display(TIME);
Display_Byte(0xAA,0x55);
Pause_Display(TIME);
Display_Byte(0x55,0xAA);
Pause_Display(TIME);
Display_Image(pic1);
Pause_Display(TIME);
Display_Image(picq);
Pause_Display(TIME);
}
}