STM8L152的LCD模块原理及驱动

STM8L182内部集成了一个高达320个像素LCD的驱动模块。框图如下:

1. 配置LCD的时钟源、分频比、占空比、偏移电压、启用LCD端口复用功能、清晰度,并使能LCD功能。

void LCD_Config(void)
{

    /* Enable RTC CLK */
    CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);

    /* Enable RTC CLK */
    CLK_PeripheralClockConfig(CLK_Peripheral_LCD, ENABLE);

    /* Choice CLK Source, HSI_Freq = 16M, RTC_Freq = 500Khz*/
    CLK_RTCClockConfig(CLK_RTCCLKSource_HSI,CLK_RTCCLKDiv_32); 

    /* Frequence = 500K/(32+16)  Frame_Freq = Frequence/Duty = 60Hz */
    LCD_Init(LCD_Prescaler_32, LCD_Divider_16, LCD_Duty_1_8,
    LCD_Bias_1_3, LCD_VoltageSource_External);     

    /* Enable PM */
    LCD_PortMaskConfig(LCD_PortMaskRegister_0, 0xFF); 
    LCD_PortMaskConfig(LCD_PortMaskRegister_1, 0x0F); 
    LCD_PortMaskConfig(LCD_PortMaskRegister_2, 0x00); 
    LCD_PortMaskConfig(LCD_PortMaskRegister_3, 0x00);
    LCD_PortMaskConfig(LCD_PortMaskRegister_4, 0x00); 
    LCD_PortMaskConfig(LCD_PortMaskRegister_5, 0x00);

    /*  LCD_Contrast_Level_7: Medium Density / High Density Maximum Voltage = 3.30V / 3.51V */
    LCD_ContrastConfig(LCD_Contrast_Level_7);

   /* No dead time */
    LCD_DeadTimeConfig(LCD_DeadTime_0); 

   /* LCD_PulseOnDuration_7: Pulse ON duration = 7/CLKprescaler */
    LCD_PulseOnDurationConfig(LCD_PulseOnDuration_7);
    LCD_Cmd(ENABLE); 
}

其中LCD_PortMaskRegister: The LCD register index in the port mask matrix.相关的寄存器为:

只用到12个SEG,置位PM0的8位和PM1的低4位。

2. 关闭、打开、清屏操作

void LCD_OFF(void)
{
 CLK_PeripheralClockConfig(CLK_Peripheral_RTC, DISABLE);
 CLK_PeripheralClockConfig(CLK_Peripheral_LCD, DISABLE);
}
void LCD_ON(void)
{
 CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);
 CLK_PeripheralClockConfig(CLK_Peripheral_LCD, ENABLE);
}
void LCD_Clear(void)
{
  uint8_t i=0;
  for(i=0;i<LCD_RAMRegister_13;i++)
  {LCD_PageSelect(LCD_PageSelection_FirstPage);
    LCD->RAM[i]=0;
  LCD_PageSelect(LCD_PageSelection_SecondPage);
   LCD->RAM[i]=0;}
}

在LCD_Clear();函数中,因为项目中用到8个COM,所以有2个Page(LCD_PageSelection_FirstPage,LCD_PageSelection_FirstPage)。

3. 配置好LCD的相关寄存器,往LCD的RAM里面写数据。

例如这样一块屏:

根据规格书,的出对应的RAM列表

  76543210 PAGE 0
0S0[7:0]4D3C3DT262C2D1C1D  
1S0[15:8]    T31T3T304C  
2S0[23:16]          
3S1[3:0]2G2E1G1E    S0[27:24] 
4S1[11:4]T23T2T294G4E3G3ET25  
5S1[19:12]          
6S1[27:20]          
7S2[7:0]4F3B3FT242B2F1B1F  
8S2[15:8]    LOT4T284B  
9S2[23:16]          
10S3[3:0]T172AT151A    S3[27:24] 
11S3[11:4]HIT5T27T224AT213AT18  
12S3[19:12]          
13S3[27:20]          

#define  a       0x01    
#define  b       0x02    
#define  c       0x04    
#define  d       0x08    
#define  e       0x10    
#define  f        0x20   
#define  g       0x40 

#define NONE      0x00 

const unsigned int LCD_MODEL[]=   

{

  {a+b+c+d+e+f},               //0
  {c+b},                               //1
  {a+b+d+e+g},                   //2
  {a+c+b+d+g},                   //3
  {c+b+f+g},                        //4
  {a+c+f+d+g},                    //5
  {a+c+e+f+d+g},                //6
  {a+c+b},                           //7
  {a+c+e+b+f+d+g},            //8
  {a+c+b+f+d+g},                //9

}

/**

   * 假如显示0,0对应的值的二进制位01111111,通过对比表中的位置,进行移位赋值操作

   */

 

void Display_LCD_Num(u8 NUM)  
{
    LCD_PageSelect(LCD_PageSelection_FirstPage);

    /* 清除C、D段位的显示 */
    LCD->RAM[LCD_RAMRegister_0]&=(~0x03); 

    /* 写入C、D段位的值 */
    LCD->RAM[LCD_RAMRegister_0]|=(((LCD_MODEL[Data]>>1)&0x02)+((LCD_MODEL[Data]>>3)&0x01)); 

    /* 清除G、E段位的显示 */
    LCD->RAM[LCD_RAMRegister_3]&=(~0x30);
    LCD->RAM[LCD_RAMRegister_3]|=(((LCD_MODEL[Data]>>1)&0x20)+((LCD_MODEL[Data])&0x10)); 

     /* 清除B、F段位的显示 */
    LCD->RAM[LCD_RAMRegister_7]&=(~0x03);
    LCD->RAM[LCD_RAMRegister_7]|=((LCD_MODEL[Data]&0x02)+((LCD_MODEL[Data]>>5)&0x01));  

    /* 清除A段位的显示 */
    LCD->RAM[LCD_RAMRegister_10]&=(~0x10);
    LCD->RAM[LCD_RAMRegister_10]|=((LCD_MODEL[Data]<<4)&0x10);  //A  
}

 

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值