按计划这篇文章早就应该发上来了,但我一直不能确定LCD控制器的型号,按官网的说法是S6B0108,也有人说是SED1520,但与头文件中的定义比较后发现都不符合……直到前天我在SAMSUNG的官网上发现了S6B0755,这才有了些进展。这个芯片的控制字和例程中的完全吻合,不过通过这些天的使用发现,实际情况和这个控制器PDF的说明仍然有些出入……
哪位高人知道这个LCD使的是哪片控制器,烦请通告一声,感激不尽……
下面是LCD初始化所需的步骤:这片LCD使用的是intel8080时序模式
初始化LCD用到的I/O管脚,设置PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE),
PD.14(D0), PD.15(D1),PE.07(D4), PE.08(D5), PE.09(D6),
PE.10(D7),PF.00(A0 (RS)),PG.12(NE4 (LCD/CS)) 为复用推挽输出模式
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_DeInit(GPIOD);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 |
GPIO_Pin_4 | GPIO_Pin_5 |
GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_DeInit(GPIOE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 |
GPIO_Pin_9 | GPIO_Pin_10 ;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_DeInit(GPIOF);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_DeInit(GPIOG);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_Init(GPIOG, &GPIO_InitStructure);
下面是FSMC的初始化,使用FSMC bank1中的NORSRAM4区(0x6c000000~0x6cffffff)
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef p;
p.FSMC_AddressSetupTime = 1;
p.FSMC_AddressHoldTime = 1;
p.FSMC_DataSetupTime = 20;
p.FSMC_BusTurnAroundDuration = 0;
p.FSMC_CLKDivision = 0;
p.FSMC_DataLatency = 1;
p.FSMC_AccessMode = FSMC_AccessMode_A;
FSMC_NORSRAMInitStructure.FSMC_Bank =
FSMC_Bank1_NORSRAM4;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux =
FSMC_DataAddressMux_Disable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType =
FSMC_MemoryType_SRAM;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth =
FSMC_MemoryDataWidth_8b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =
FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity =
FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_WrapMode =
FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive =
FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation =
FSMC_WriteOperation_Enable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignal =
FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode =
FSMC_ExtendedMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WriteBurst =
FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct =
&p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);
LCD_Command = Display_Off;
delay();
LCD_Command = LCD_Reset;
reset_delay();
/*补充:复位后LCD模式如下:
Page address: 0
Column address: 0
Modify-read: OFF
Display ON / OFF: OFF
Initial display line: 0 (first)
Initial COM0 register: 0 (COM0)
Partial display duty ratio: 1/64
Icon enable/disable : 0 (disable)
Reverse display ON / OFF: OFF (normal)
n-line inversion register: 0 (disable)
Entire display ON / OFF: OFF (normal)
Power control register (VC, VR, VF) = (0, 0, 0)
DC-DC step up: 3 times converter circuit = (0, 0)
Regulator resistor select register: (R2, R1, R0) = (0, 0, 0)
Reference voltage control register: (EV5, EV4, EV3, EV2,
EV1, EV0) = (1, 0, 0, 0, 0, 0)
LCD bias ratio: 1/9
SHL select: OFF (normal)
ADC select: OFF (normal)
Oscillator status: OFF
Power save mode: release
*/
LCD_Command = Set_LCD_Bias_9;//设置分压比率为1/9
delay();
LCD_Command = Set_ADC_Normal;
delay();
LCD_Command =
COM_Scan_Dir_Reverse;//不太清楚这里为什么把COM口的扫描方式设置为反向,但实际上更改这一项并没有产生什么实际影响
-_-?
delay();
LCD_Command = 0x2c;//按PDF的定义这3句依次打开电压转换器电路、电压调节器电路和电压跟随器电路
power_delay(); // 50ms
LCD_Command = 0x2e;
power_delay(); // 50ms
LCD_Command = 0x2f;
power_delay(); // 50ms
LCD_Command =
Set_Ref_Vol_Reg|0x05;//这个板子使用的是内部分压电路,设置分压比为5.8
delay();
LCD_Command = Set_Ref_Vol_Mode;//与下一句连用设置electronic volume
register
delay();
LCD_Command = Set_Ref_Vol_Reg
delay();
LCD_Clear();
delay();
LCD_Command = Display_On; //
delay();
下面是两个我自己补充的程序,第一个实现画横线的功能,第二个实现画点的功能,但是由于读取LCD控制器片内RAM的语句一直没起作用,暂时只能实现整段的刷新,无法在原图基础上修改(使用的是modify-read模式,但读出来的数据一直是0到f的循环……)
void LCD_DrawLine(u8 Xpos, u16 Ypos, u16 Length, u8 Direction)
{
u8 i=Length;
u8 coll = Ypos & 0x0f;
u8 colh = Ypos >> 4;
u8 Xpage = Xpos/8;
u8 Xline = 0x01;
Xline <<= Xpos%8;
LCD_Command = Set_Start_Line_X|0x0; delay();
LCD_Command = Set_Page_Addr_X|Xpage; delay();
LCD_Command = Set_ColH_Addr_X|colh; delay();
LCD_Command = Set_ColL_Addr_X|coll; delay();
while (i--)
{
LCD_Data = Xline;
delay();
}
}
void LCD_DrawPoint(u8 Xpos, u8 Ypos)
{
u8 coll = Ypos & 0x0f;
u8 colh = Ypos >> 4;
u8 Xpage = Xpos/8;
u8 Xline = 0x01;
Xline <<= Xpos%8;
LCD_Command = Set_Start_Line_X|0x0; delay();
LCD_Command = Set_Page_Addr_X|Xpage; delay();
LCD_Command = Set_ColH_Addr_X|colh; delay();
LCD_Command = Set_ColL_Addr_X|coll; delay();
LCD_Data = Xline; delay();
}