博客首页 | 排行榜 |

suiris的博客

个人档案
博文分类
关于万利板子上LCD使用方法的讨论  2009-02-12 23:49

    按计划这篇文章早就应该发上来了,但我一直不能确定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();
}

类别:学习笔记 |
下一篇:关于万利板子初始化的一些东西
以下网友评论只代表其个人观点,不代表本网站的观点或立场