📄 lcdlib.c
字号:
{
U32 buf = 0x740000; // device id
U8 i;
buf |= (RS<<17);
buf |= (RW<<16);
buf += data;
SLcdGpioSet(nCS, 0); // transfer start
Delay(1); // 1 -> 120us
for(i=0; i<24; i++) {
SLcdGpioSet(SCLK, 0); // sclk low
if(buf & (1<<(23-i))) SLcdGpioSet(SDI, 1);
else SLcdGpioSet(SDI, 0);
SLcdGpioSet(SCLK, 1); // sclk high
}
SLcdGpioSet(nCS, 1); // transfer end
Delay(1);
}
void SLcdPowerOn(void)
{
SLcdInit1();
SLcdPowerSet();
SLcdInit2();
SLcdRGBModeChange();
SLcdDisplayOn();
SLcdRegSet(0x21, 0x0000);
SLcdSpiSet(0, 0, (U16)0x22);
}
void SLcdPowerOff(void)
{
SLcdInternalModeChange();
SLcdDisplayOff();
SLcdRegSet(0x10, 0x0000);
SLcdRegSet(0x0a, 0x0100);
}
void SLcdInit1(void)
{
SLcdRegSet(0x01, 0x0917); // 0x0117 <-> 0x0917
SLcdRegSet(0x02, 0x0700);
SLcdRegSet(0x03, 0x1230);
SLcdRegSet(0x04, 0x0000);
SLcdRegSet(0x05, 0x0000);
SLcdRegSet(0x07, 0x0005);
SLcdRegSet(0x08, 0x0907); // 0x0306 <-> 0x0808 -> VFP=7H, VBP=9H, VLW=4H, so 0x0907
SLcdRegSet(0x0b, 0xec0a); // 0xe800 <-> 0xec0a
SLcdRegSet(0x0c, 0x0002);
SLcdRegSet(0x0d, 0x0734); // 0x0700 <-> 0x0734
SLcdRegSet(0x40, 0x0000);
}
void SLcdInit2(void)
{
SLcdRegSet(0x30, 0x0000);
SLcdRegSet(0x31, 0x0000);
SLcdRegSet(0x32, 0x0000);
SLcdRegSet(0x33, 0x0000);
SLcdRegSet(0x34, 0x0707);
SLcdRegSet(0x35, 0x0707);
SLcdRegSet(0x36, 0x0707);
SLcdRegSet(0x37, 0x0000);
SLcdRegSet(0x3f, 0x0000);
SLcdRegSet(0x41, 0x0000);
SLcdRegSet(0x42, 0xbf00);
SLcdRegSet(0x43, 0xc2c0);
SLcdRegSet(0x44, 0xaf00);
SLcdRegSet(0x45, 0xbf00);
}
void SLcdPowerSet(void)
{
SLcdRegSet(0x12, 0x0001);
SLcdRegSet(0x13, 0x0404); // 0x0804 <-> 0x0404
SLcdRegSet(0x14, 0x151e); // 0x1118 <-> 0x151e
SLcdRegSet(0x0a, 0x0100);
SLcdRegSet(0x0a, 0x0101);
SLcdRegSet(0x0a, 0x0102);
SLcdRegSet(0x0a, 0x0106);
SLcdRegSet(0x0a, 0x0107);
SLcdRegSet(0x10, 0x2814);
SLcdRegSet(0x11, 0x9010); // 0x8000 <-> 0x9010
SLcdRegSet(0x0a, 0x0100);
SLcdRegSet(0x0a, 0x0101);
//Delay(333); // 40000 us / 120 us = 333, S3C2460X
Delay(400); // 40000 us / 100 us = 400
SLcdRegSet(0x14, 0x351e); // 0x3118 <-> 0x351e
SLcdRegSet(0x0a, 0x0100);
SLcdRegSet(0x0a, 0x0102);
//Delay(333); // 40 ms, S3C2460X
Delay(400); // 40 ms
SLcdRegSet(0x13, 0x0414); // 0x0814 <-> 0x0414
SLcdRegSet(0x0a, 0x0101);
}
void SLcdDisplayOn(void)
{
SLcdRegSet(0x07, 0x0005);
//Delay(333); // 40 ms, S3C2460X
Delay(400); // 40 ms
SLcdRegSet(0x07, 0x0025);
SLcdRegSet(0x0a, 0x0100);
SLcdRegSet(0x07, 0x0027);
SLcdRegSet(0x07, 0x0037);
}
void SLcdDisplayOff(void)
{
SLcdRegSet(0x07, 0x0036);
Delay(333); // 40ms
SLcdRegSet(0x07, 0x0026);
Delay(333); // 40ms
SLcdRegSet(0x07, 0x0004);
SLcdRegSet(0x0a, 0x0100);
}
void SLcdInternalModeChange(void)
{
SLcdRegSet(0x0c, 0x0002);
Delay(167); // 20000 us / 120 us = 167
}
void SLcdRGBModeChange(void)
{
SLcdRegSet(0x21, 0x0000);
SLcdRegSet(0x0c, 0x0112);
SLcdSpiSet(0, 0, (U16)0x22);
//Delay(167); // 20 ms, S3C2460X
Delay(200); // 20 ms
}
void SLcdSleep(void)
{
SLcdInternalModeChange();
SLcdDisplayOff();
SLcdRegSet(0x10, 0x0000);
SLcdRegSet(0x0a, 0x0100);
SLcdRegSet(0x10, 0x0002);
SLcdRegSet(0x0a, 0x0100);
}
void SLcdSleepWakeUp(void)
{
SLcdRegSet(0x10, 0x0000);
SLcdRegSet(0x0a, 0x0100);
SLcdPowerSet();
SLcdDisplayOn();
SLcdRGBModeChange();
}
void SLcdStangBy(void)
{
SLcdInternalModeChange();
SLcdDisplayOff();
SLcdRegSet(0x10, 0x0000);
SLcdRegSet(0x0a, 0x0100);
SLcdRegSet(0x10, 0x0001);
}
void SLcdStandByWakeUp(void)
{
SLcdRegSet(0x00, 0x0001);
Delay(83); // 10000 / 120 = 83
SLcdRegSet(0x10, 0x0000);
SLcdInit1();
SLcdPowerSet();
SLcdInit2();
SLcdRGBModeChange();
SLcdDisplayOn();
SLcdRegSet(0x21, 0x0000);
SLcdSpiSet(0, 0, (U16)0x22);
}
//041231
void delayLoop(int count)
{
int j;
for(j = 0; j < count; j++) ;
}
//041231
void Write_LDI(int address, int data)
{
int j;
//unsigned char DELAY=100;
unsigned char DELAY=10;
LCD_DEN_Hi; // EN = High CS high
// LCD_DCLK_Lo;
LCD_DCLK_Hi; // SCL High
LCD_DSERI_Lo; // Data Low
delayLoop(DELAY);
LCD_DEN_Lo; // EN = Low CS Low
delayLoop(DELAY);
LCD_DCLK_Lo; // SCL Low
delayLoop(DELAY);
for (j = 7; j >= 0; j--)
{
if ((address >> j) & 0x0001) // DATA HIGH or LOW
LCD_DSERI_Hi;
else
LCD_DSERI_Lo;
delayLoop(DELAY);
LCD_DCLK_Hi; // CLOCK = High
delayLoop(DELAY);
if(j != 0)
{
LCD_DCLK_Lo;
delayLoop(DELAY); // CLOCK = Low
}
}
LCD_DSERI_Lo; // Data Low
delayLoop(DELAY);
LCD_DEN_Hi; // EN = High
delayLoop(DELAY);
LCD_DEN_Lo; // EN = Low
delayLoop(DELAY);
LCD_DCLK_Lo;
delayLoop(DELAY); // CLOCK = Low
for (j = 7; j >= 0; j--)
{
if ((data >> j) & 0x0001) // DATA HIGH or LOW
LCD_DSERI_Hi;
else
LCD_DSERI_Lo;
delayLoop(DELAY);
LCD_DCLK_Hi; // CLOCK = High
delayLoop(DELAY);
if(j != 0)
{
LCD_DCLK_Lo;
delayLoop(DELAY); // CLOCK = Low
}
}
LCD_DEN_Hi; // EN = High
delayLoop(DELAY);
}
void InitLDI(void)
{
// Start LCD clock max : 6MHz
//Reg16_OPCLK_DIV = 0x0202; // 6.4
SET_CONFIG_PORT;
/* rGPGCON = (rGPGCON&~((0xf<<12)|(0x3<<4)))|(5<<12)|(1<<4);
rGPGUP = 0xffff;
*/
/*
LCD_DEN_Hi;
LCD_DCLK_Hi;
LCD_DSERI_Hi;
LCD_RESET_Hi;
Uart_Printf("ALL High\n"); UartGetChar();
LCD_DEN_Lo;
Uart_Printf("LCD_DEN_Lo\n"); UartGetChar();
LCD_DCLK_Lo;
Uart_Printf("LCD_DCLK_Lo\n"); UartGetChar();
LCD_DSERI_Lo;
Uart_Printf("LCD_DSERI_Lo\n"); UartGetChar();
LCD_RESET_Hi;
*/
LCD_DEN_Hi;
LCD_DCLK_Hi;
LCD_DSERI_Hi;
LCD_RESET_Hi;
//LCD CLK is about 4.05Mhz
//rDIRGBIFR1=(18<<0); //LCLK=HCLK/(CDR+2)=81/(18+2)=4.05Mhz
//rDIRGBIFR0|=(1<<12); //LCD panel on
// LCD Reset high
LCD_RESET_Hi;
// delayLoop(50000);
///////////////////////////////////////////////////////////////////
// Power Setting Function 1
//////////////////////////////////////////////////////////////////
Write_LDI(0x22,0x01); // PARTIAL 2 DISPLAY AREA RASTER-ROW NUMBER REGISTER 1
Write_LDI(0x03,0x01); // RESET REGISTER
///////////////////////////////////////////////////////////////////
// Initializing Function 1
///////////////////////////////////////////////////////////////////
Write_LDI(0x00,0x0a); // CONTROL REGISTER 1
delayLoop(5); // delay about 300ns
Write_LDI(0x01,0x10); // CONTROL REGISTER 2
delayLoop(5); // delay about 300ns
Write_LDI(0x02,0x00); // RGB INTERFACE REGISTER
delayLoop(5); // delay about 300ns
Write_LDI(0x05,0x00); // DATA ACCESS CONTROL REGISTER
delayLoop(5); // delay about 300ns
Write_LDI(0x0D,0x00); //
// delay about 40ms
delayLoop(700000);
///////////////////////////////////////////////////////////////////
// Initializing Function 2
///////////////////////////////////////////////////////////////////
Write_LDI(0x0E,0x00); //
delayLoop(5); // delay about 300ns
Write_LDI(0x0F,0x00); //
delayLoop(5); // delay about 300ns
Write_LDI(0x10,0x00); //
delayLoop(5); // delay about 300ns
Write_LDI(0x11,0x00); //
delayLoop(5); // delay about 300ns
Write_LDI(0x12,0x00); //
delayLoop(5); // delay about 300ns
Write_LDI(0x13,0x00); // DISPLAY SIZE CONTROL REGISTER
delayLoop(5); // delay about 300ns
Write_LDI(0x14,0x00); // PARTIAL-OFF AREA COLOR REGISTER 1
delayLoop(5); // delay about 300ns
Write_LDI(0x15,0x00); // PARTIAL-OFF AREA COLOR REGISTER 2
delayLoop(5); // delay about 300ns
Write_LDI(0x16,0x00); // PARTIAL 1 DISPLAY AREA STARTING REGISTER 1
delayLoop(5); // delay about 300ns
Write_LDI(0x17,0x00); // PARTIAL 1 DISPLAY AREA STARTING REGISTER 2
delayLoop(5); // delay about 300ns
Write_LDI(0x34,0x01); // POWER SUPPLY SYSTEM CONTROL REGISTER 14
delayLoop(5); // delay about 300ns
Write_LDI(0x35,0x00); // POWER SUPPLY SYSTEM CONTROL REGISTER 7
// delay about 30ms
delayLoop(500000);
////////////////////////////////////////////////////////////////////
// Initializing Function 3
////////////////////////////////////////////////////////////////////
Write_LDI(0x8D,0x01); //
delayLoop(5); // delay about 300ns
Write_LDI(0x8B,0x28); //
delayLoop(5); // delay about 300ns
Write_LDI(0x4B,0x00); //
delayLoop(5); // delay about 300ns
Write_LDI(0x4C,0x00); //
delayLoop(5); // delay about 300ns
Write_LDI(0x4D,0x00); //
delayLoop(5); // delay about 300ns
Write_LDI(0x4E,0x00); //
delayLoop(5); // delay about 300ns
Write_LDI(0x4F,0x00); //
delayLoop(5); // delay about 300ns
Write_LDI(0x50,0x00); // ID CODE REGISTER 2 Check it out
// delay about 50 us
delayLoop(900);
Write_LDI(0x86,0x00); //
delayLoop(5); // delay about 300ns
Write_LDI(0x87,0x26); //
delayLoop(5); // delay about 300ns
Write_LDI(0x88,0x02); //
delayLoop(5); // delay about 300ns
Write_LDI(0x89,0x05); //
delayLoop(5); // delay about 300ns
Write_LDI(0x33,0x01); // POWER SUPPLY SYSTEM CONTROL REGISTER 13
delayLoop(5); // delay about 300ns
Write_LDI(0x37,0x06); // POWER SUPPLY SYSTEM CONTROL REGISTER 12 Check it out
// delay about 50 us
delayLoop(900);
Write_LDI(0x76,0x00); // SCROLL AREA START REGISTER 2
// delay about 30ms
delayLoop(500000);
/////////////////////////////////////////////////////////////////////
// Initializing Function 4
/////////////////////////////////////////////////////////////////////
Write_LDI(0x42,0x00); //
delayLoop(5); // delay about 300ns
Write_LDI(0x43,0x00); //
delayLoop(5); // delay about 300ns
Write_LDI(0x44,0x00); //
delayLoop(5); // delay about 300ns
Write_LDI(0x45,0x00); // CALIBRATION REGISTER
delayLoop(5); // delay about 300ns
Write_LDI(0x46,0xef); //
delayLoop(5); // delay about 300ns
Write_LDI(0x47,0x00); //
delayLoop(5); // delay about 300ns
Write_LDI(0x48,0x00); //
delayLoop(5); // delay about 300ns
Write_LDI(0x49,0x01); // ID CODE REGISTER 1 check it out
// delay about 50 us
delayLoop(900);
Write_LDI(0x4A,0x3f); //
delayLoop(5); // delay about 300ns
Write_LDI(0x3C,0x00); //
delayLoop(5); // delay about 300ns
Write_LDI(0x3D,0x00); //
delayLoop(5); // delay about 300ns
Write_LDI(0x3E,0x01); //
delayLoop(5); // delay about 300ns
Write_LDI(0x3F,0x3f); //
delayLoop(5); // delay about 300ns
// Write_LDI(0x40,0x03); // horizontal back porch
Write_LDI(0x40,0x01); // horizontal back porch //050105 Boaz.Kim
delayLoop(5); // delay about 300ns
// Write_LDI(0x41,0x04); // vertical back porch
Write_LDI(0x41,0x0a); // horizontal back porch //050105 Boaz.Kim
delayLoop(5); // delay about 300ns
Write_LDI(0x8F,0x05); //
// delay about 30ms
delayLoop(500000);
/////////////////////////////////////////////////////////////////////
// Initializing Function 5
/////////////////////////////////////////////////////////////////////
Write_LDI(0x90,0x05); //
delayLoop(5); // delay about 300ns
Write_LDI(0x91,0x44); //
delayLoop(5); // delay about 300ns
Write_LDI(0x92,0x44); //
delayLoop(5); // delay about 300ns
Write_LDI(0x93,0x44); //
delayLoop(5); // delay about 300ns
Write_LDI(0x94,0x33); //
delayLoop(5); // delay about 300ns
Write_LDI(0x95,0x05); //
delayLoop(5); // delay about 300ns
Write_LDI(0x96,0x05); //
delayLoop(5); // delay about 300ns
Write_LDI(0x97,0x44); //
delayLoop(5); // delay about 300ns
Write_LDI(0x98,0x44); //
delayLoop(5); // delay about 300ns
Write_LDI(0x99,0x44); //
delayLoop(5); // delay about 300ns
Write_LDI(0x9A,0x33); //
delayLoop(5); // delay about 300ns
Write_LDI(0x9B,0x33); //
delayLoop(5); // delay about 300ns
Write_LDI(0x9C,0x33); //
delayLoop(5); // delay about 300ns
#if 1
Write_LDI(0x9D,0x80); // 16 or 18bit RGB
#else
Write_LDI(0x9D,0x81); // 6bit RGB
#endif
// delay about 30ms
delayLoop(500000);
/////////////////////////////////////////////////////////////////////
// Power Setting 2
/////////////////////////////////////////////////////////////////////
Write_LDI(0x1D,0x08); //
// delay about 30ms
delayLoop(500000);
Write_LDI(0x23,0x00); // PARTIAL 2 DISPLAY AREA RASTER-ROW NUMBER REGISTER 2
// delay about 50 us
delayLoop(900);
Write_LDI(0x24,0x94); // POWER SUPPLY SYSTEM CONTROL REGISTER 1
// delay about 50 us
delayLoop(900);
Write_LDI(0x25,0x6f); // POWER SUPPLY SYSTEM CONTROL REGISTER 2
// delay about 40ms
delayLoop(700000);
/////////////////////////////////////////////////////////////////////
// Power Setting 3
/////////////////////////////////////////////////////////////////////
Write_LDI(0x28,0x1e); //
Write_LDI(0x1A,0x00); //
Write_LDI(0x21,0x10); // PARTIAL 1 DISPLAY AREA RASTER-ROW NUMBER REGISTER 2
Write_LDI(0x18,0x25); // PARTIAL 2 DISPLAY AREA STARTING REGISTER 1
// delay about 40ms
delayLoop(700000);
Write_LDI(0x19,0x48); // PARTIAL 2 DISPLAY AREA STARTING REGISTER 2
Write_LDI(0x18,0xe5); // PARTIAL 2 DISPLAY AREA STARTING REGISTER 1
// delay about 10ms
delayLoop(200000);
Write_LDI(0x18,0xF7); // PARTIAL 2 DISPLAY AREA STARTING REGISTER 1
// delay about 40ms
delayLoop(700000);
Write_LDI(0x1B,0x07); // org
// Write_LDI(0x1B,0x01); // 90 rotate
// Write_LDI(0x1B,0x02); // 90 rotate
// Write_LDI(0x1B,0x03); // 90 rotate
// delay about 80ms
delayLoop(1400000);
Write_LDI(0x1F,0x6b); // org
// Write_LDI(0x1F,0x5E); // 90 rotate
Write_LDI(0x20,0x51); // org, PARTIAL 1 DISPLAY AREA RASTER-ROW NUMBER REGISTER 1
// Write_LDI(0x20,0x5F); // 90 rotate, PARTIAL 1 DISPLAY AREA RASTER-ROW NUMBER REGISTER 1
Write_LDI(0x1E,0xc1); //
// delay about 10ms
delayLoop(200000);
Write_LDI(0x21,0x00); // PARTIAL 1 DISPLAY AREA RASTER-ROW NUMBER REGISTER 2
Write_LDI(0x3B,0x01); //
// delay about 20ms
delayLoop(400000);
Write_LDI(0x00,0x20); // CONTROL REGISTER 1
Write_LDI(0x02,0x01); // RGB INTERFACE REGISTER
// delay about 10ms
delayLoop(200000);
// Reg16_OPCLK_DIV = 0x0201; // 6.4
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -