文档库 最新最全的文档下载
当前位置:文档库 › HX8238_SPI驱动

HX8238_SPI驱动

// 采用此代码时,请将 VBPD 和 HBPD用变量控制,而不是用#define来定义。

void SPI_WriteReg(U8 value)
{
U8 i;

SET_CS_LOW; // 先发送一个bit的 D/C信号

SET_SDA_LOW; // D/C = 0
SET_SCK_LOW;
SET_SCK_HIGH; // 上升沿有效

for(i=0; i<8; i++)
{
if((value & 0x80)==0x80)
{
SET_SDA_HIGH;
}
else {
SET_SDA_LOW;
}
SET_SCK_LOW;
SET_SCK_HIGH; // 上升沿将数据写出去......
value <<= 1;
}
SET_CS_HIGH;
}

U8 SPI_GetRegValue( U8 reg)
{
U8 i,j,value;

SET_CS_LOW; // 先发送一个bit的 D/C信号

SET_SDA_LOW; // D/C = 0
SET_SCK_LOW;
SET_SCK_HIGH; // 上升沿有效

for(i=0; i<8; i++)
{
if((reg & 0x80)==0x80)
{
SET_SDA_HIGH;
}
else {
SET_SDA_LOW;
}
SET_SCK_LOW;
SET_SCK_HIGH; // 上升沿将数据写出去......
reg <<= 1;
}
// 此处要将SDA设置为输入状态!
rGPCCON = (rGPCCON & (~(0x3f<<10)))|(0x05<<10); // C7,6,5 output 15
value = 0;
for(i=0; i<8; i++)
{
SET_SCK_HIGH;
SET_SCK_LOW;
j=5; while(j--);
value <<= 1;
if((rGPCDAT & 0x0080) == 0x0080)
{
value |= 1;
}
}
SET_CS_HIGH;
// 恢复SDA为输出电平!
rGPCCON = (rGPCCON & (~(0x3f<<10)))|(0x15<<10); // C7,6,5 output 15
return value;
}

void SPI_WriteData(U8 value)
{
U8 i;

SET_CS_LOW; // 先发送一个bit的 D/C信号

SET_SDA_HIGH; // D/C = 1
SET_SCK_LOW;
SET_SCK_HIGH; // 上升沿有效

for(i=0; i<8; i++)
{
if((value & 0x80)==0x80)
{
SET_SDA_HIGH;
}
else {
SET_SDA_LOW;
}
SET_SCK_LOW;
SET_SCK_HIGH; // 上升沿将数据写出去......
value <<= 1;
}
SET_CS_HIGH;
}

void SPI_ConfigLCM(void)
{
SET_CS_HIGH;
SET_SCK_HIGH;
SET_SDA_HIGH;

SET_RST_HIGH;
SET_DE_HIGH;
Delay(100);

if(SPI_GetRegValue(0x0c)!= 0x60) // 此为读出内部的一个ID值,用来识别是否为8238.
{ // 此处请参考原来就调节好的源代码
SPI_ConfigLCM8238();
vbpd= 17;
hbpd = 5;
//注意此处要用变量定义VBPD 、HBPD 这两个参数,否则,图案出现平移现象。
return;
}
SPI_WriteReg(0x1); // Software reset
Delay(1000);
SPI_WriteReg(0x03); // Booster ON
Delay(500);
SPI_WriteReg(0x11); // Sleep out
Delay(500);

SPI_WriteReg(0x20); // Inversion OFF

SPI_WriteReg(0x26); // Gamma Set
SPI_WriteData(0x01); //

SPI_WriteReg(0x36); // Memory Access Control:Default writing and scanning direction
SPI_WriteData(0x00);

SPI_WriteReg(0x38); // Idle Mode OFF

SPI_WriteReg(0x3a); // Interface Pixel Format:18 BPP
SPI_WriteData(0x60); // 0x60:18bit 0x50:16bit

SPI_WriteR

eg(0xb0); // VLCD=3.96V (0x30) 4.2v:0x3c
SPI_WriteData(0x31);

SPI_WriteReg(0xb1); // VGOFFL=-11.66V VGON=15V
SPI_WriteData(0x6c); // 0xac

SPI_WriteReg(0xb2); // VCOMH max:0x7f 调大会变黑!
SPI_WriteData(0x5d); // 0x55 0x4b:3.5v 0x6b: +4.14v 5a:3.8v --------------------

SPI_WriteReg(0xb3); // VCOML1=-0.5V 调大会变黑!
SPI_WriteData(0x15); // 0x19: -0.5v ---- 0x30: -0.96v 可调点。 0x32:-1v

SPI_WriteReg(0xb4); // VCOML2=0V no use it
SPI_WriteData(0x00); // 0x00 note:

SPI_WriteReg(0xc2); // Booster Multiplication Factor:
SPI_WriteData(0x01); // 11 Cap Config, VGON 6X, VLCD 2X, VGOFF -5X

SPI_WriteReg(0xc3); // Driving Scheme Configuration:
SPI_WriteData(0xd2); // NO=8, SDT=2, EQ=3, PT=1

SPI_WriteReg(0xc4); // Select VCOML
SPI_WriteData(0x00); // note: 0: select VcomL1 1: VcomL2

SPI_WriteReg(0xc5); // Gate Scan Position: Start Gate Line G0
SPI_WriteData(0x00);

SPI_WriteReg(0xc9); // N-Line Inversion
SPI_WriteData(0x81); // 1 Line Inversion

SPI_WriteReg(0xd0); // Set YCrCb Matrix, total 10 parameters:
SPI_WriteData(0xf4);
SPI_WriteData(0x25);
SPI_WriteData(0x33);
SPI_WriteData(0x40);
SPI_WriteData(0xe6);
SPI_WriteData(0x80);
SPI_WriteData(0x87);
SPI_WriteData(0x3f);
SPI_WriteData(0xe0);
SPI_WriteData(0x01);

SPI_WriteReg(0xd2); // Set negative gamma, Total 10 parameters:

//#3 效果适中 ok
SPI_WriteData(0x2c); // V62NEG,
SPI_WriteData(0x31); // V59NEG,
SPI_WriteData(0x27); // V54NEG,
SPI_WriteData(0x27); // V45NEG,
SPI_WriteData(0x23); // V36NEG,
SPI_WriteData(0x22); // V27NEG,
SPI_WriteData(0x23); // V18NEG,
SPI_WriteData(0x27); // V9NEG,
SPI_WriteData(0x24); // V4NEG,
SPI_WriteData(0x30); // V1NEG.

SPI_WriteReg(0xd3); // Set Gamma Ratio
SPI_WriteData(0x00); //

SPI_WriteReg(0xd4); // Number of Lines: 240 Lines
SPI_WriteData(0x00);

SPI_WriteReg(0xd5); // Number of Columns:
SPI_WriteData(0x00); // 320 Columns

SPI_WriteReg(0xd6); // Set Horizontal Porch: HBP = 27
SPI_WriteData(0x1b);

SPI_WriteReg(0xd7); // Set Vertical Porch: VBP = 6
SPI_WriteData(0x06);

SPI_WriteReg(0xd8); // Driver Configuration:
SPI_WriteData(0x03); // 03 Default driver configuration

SPI_WriteReg(0xd9); // Normally White, Odd/Even display, Cap on Common
SPI_WriteData(0x04);

SPI_WriteReg(0x29); // Display ON
}
/***********************************************************************
8238 initial code
***********************************************************************/
void SPI_WriteReg8238(U8 type,U16 value)
{
U8 i;

SET_CS_LOW;
for(i=0; i<8; i++)
{
SET_SCK_LOW;
if(type & 0x80)
{
SET_SDA_HIGH;
}
else {
SET_SDA_LOW;
}
SET_SCK_HIGH; // 上升沿将数据写出去......

type <<= 1;
}
for(i=0; i<16; i++)
{
SET_SCK_LOW;
if(value & 0x8000)
{
SET_SDA_HIGH;
}
else {
SET_SDA_LOW;
}
SET_SCK_HIGH; // 上升沿将数据写出去......
value <<= 1;
}
SET_CS_HIGH;
}

#define REG_INDEX 0x70
#define REG_DATA 0x72

void SPI_Send8238(U16 reg, U16 setting)
{
SPI_WriteReg8238(REG_INDEX,reg);
SPI_WriteReg8238(REG_DATA,setting);
}

void SPI_ConfigLCM8238(void)
{
SET_CS_HIGH;
SET_SCK_HIGH;
SET_SDA_HIGH;

SET_RST_HIGH;
SET_DE_HIGH;
Delay(100);

SPI_Send8238(0x0001,0x213F); // RL=1,REV=1,PINV=0,BGR=0,SM=0,TB=0,CPE=1
SPI_Send8238(0x0004,0x0400); // Parllel RGB
SPI_Send8238(0x000E,0x2D00); // VCOM
SPI_Send8238(0x001E,0x00D0); // VCOMH
}

相关文档