段码液晶显示屏简称段码屏(LCD SEGMENT DISPLAY)。手头刚好有一块上次做项目剩下的段码屏(RD8177A)就以它为例,带领初学者分析一个段码屏的驱动原理,来一次实操。

静态驱动:

一般是在 COM 口加一恒定的交变方波信号,通过控制 SEG 的电压变化而在 LCD 间产生所需的 0 电压或两倍幅值的交变电压,达到对 LCD 进行亮灭的控制。这样一个七段的LCD就需要 8 个口进行驱动。

时分割驱动方式:

当显示字段增多时,为了减少引出线和驱动回路数,就要采用时分割驱动方式。时分割驱动方式通常采用电压平均化法,其占空比用 1/2、1/4、1/8、1/16、1/32 等,偏比有 1/2、1/3、1/4、1/5 等,其分母数字越大,则其清晰度越高。

按照时分割方式驱动,驱动此段码屏就只需要四个COM和8个seg,16个显示单元一共8只引脚进行驱动。                                                                                                                                          

实物裸照

程序设计:1,配置硬件驱动寄存器。2,根据COM1-4,SEG1-4取模,定义联合结构体。

void LCD_Init(void){
    HB_LCDM1=0;
    HB_LCDM0=0x4D;
    HB_PFSEG1=0xF7;
    HB_PFSEG2=0x07;
    HB_PFSEG3=0x00;
    HB_PFSEG4=0x00;
    
    HB_LCDC0=0x16;
    HB_VLCD=0X16;
    us_delay(100);
    HB_LCDM1=0x20;
    nop();nop();nop();
    HB_LCDM1|=0xc0;    
    HB_ISCLCD=0;
}

#define           LcdSingMask         0x00
#define         LcdSeg_a        0x10
#define         LcdSeg_b        0x20
#define         LcdSeg_c        0x40
#define         LcdSeg_d        0x08
#define         LcdSeg_e        0x04
#define         LcdSeg_f        0x01
#define         LcdSeg_g        0x02
并通过宏定义对0-f 和u 取模

#define    Char_0        LcdSeg_a+LcdSeg_b+LcdSeg_c+LcdSeg_d+LcdSeg_e+LcdSeg_f
#define    Char_1        LcdSeg_b+LcdSeg_c
#define    Char_2        LcdSeg_a+LcdSeg_b+LcdSeg_d+LcdSeg_e+LcdSeg_g                 
#define    Char_3        LcdSeg_a+LcdSeg_b+LcdSeg_c+LcdSeg_d+LcdSeg_g
#define        Char_4        LcdSeg_b+LcdSeg_c+LcdSeg_f+LcdSeg_g
#define        Char_5        LcdSeg_a+LcdSeg_c+LcdSeg_d+LcdSeg_f+LcdSeg_g
#define        Char_6        LcdSeg_a+LcdSeg_g+LcdSeg_c+LcdSeg_d+LcdSeg_e+LcdSeg_f
#define        Char_7        LcdSeg_a+LcdSeg_b+LcdSeg_c
#define        Char_8        LcdSeg_a+LcdSeg_b+LcdSeg_c+LcdSeg_d+LcdSeg_e+LcdSeg_f+LcdSeg_g
#define        Char_9        LcdSeg_a+LcdSeg_b+LcdSeg_c+LcdSeg_d+LcdSeg_f+LcdSeg_g
#define        Char_A        LcdSeg_a+LcdSeg_b+LcdSeg_c+LcdSeg_e+LcdSeg_f+LcdSeg_g
#define        Char_b         LcdSeg_c+LcdSeg_d+LcdSeg_e+LcdSeg_f+LcdSeg_g
#define        Char_C         LcdSeg_a+LcdSeg_f+LcdSeg_e+LcdSeg_d
#define        Char_d        LcdSeg_b+LcdSeg_c+LcdSeg_d+LcdSeg_e+LcdSeg_g
#define        Char_E        LcdSeg_a+LcdSeg_d+LcdSeg_e+LcdSeg_f+LcdSeg_g
#define        Char_F        LcdSeg_a+LcdSeg_f+LcdSeg_e+LcdSeg_g
#define        Char_r          LcdSeg_e+LcdSeg_g
#define        Char_H         LcdSeg_b+LcdSeg_c+LcdSeg_e+LcdSeg_f+LcdSeg_g
#define     Char_L        LcdSeg_d+LcdSeg_e+LcdSeg_f
#define     Char_Row    LcdSeg_g
#define     Char_U        LcdSeg_b+LcdSeg_c+LcdSeg_d+LcdSeg_e+LcdSeg_f

用union类型,简洁明了。

typedef  union {  
         uchar  LCD_LgcBuf[Gcst_LCDBufSize];
        struct{    
                struct
                {
                    unsigned char Sign_7F:1;
                    unsigned char Sign_7G:1;
                    unsigned char Sign_7E:1;
                    unsigned char Sign_7D:1;
                    unsigned char Sign_7A:1;
                    unsigned char Sign_7B:1;
                    unsigned char Sign_7C:1;
                    unsigned char Sign_8H:1;
                }Sign_SEG1;
                  struct
                {
                    unsigned char Sign_8F:1;
                    unsigned char Sign_8G:1;
                    unsigned char Sign_8E:1;
                    unsigned char Sign_8D:1;
                    unsigned char Sign_8A:1;
                    unsigned char Sign_8B:1;
                    unsigned char Sign_8C:1;
                    unsigned char Sign_9H:1;
                }Sign_SEG2;
                struct
                {
                    unsigned char Sign_9F:1;
                    unsigned char Sign_9G:1;
                    unsigned char Sign_9E:1;
                    unsigned char Sign_9D:1;
                    unsigned char Sign_9A:1;
                    unsigned char Sign_9B:1;
                    unsigned char Sign_9C:1;
                    unsigned char Sign_kWh:1;
                }Sign_SEG3;
                struct
                {
                    unsigned char Sign_min:1;
                    unsigned char Sign_10H:1;
                    unsigned char Sign_Regular:1;
                    unsigned char Sign_Melody:1;
                    unsigned char Sign_6A:1;
                    unsigned char Sign_6B:1;
                    unsigned char Sign_6C:1;
                    unsigned char Sign_7H:1;
                }Sign_SEG4;
         }UnDef_LcdBuf;
这里初始化每个结构体时,要把低为放前边。

一些特殊的符号单独赋值,比如“音乐符”,“定时”,“min”分钟等。因为这些不是数字码,要根据特殊情况来置位。同样用到宏定义。

按单片机型号配置寄存器,采用辉芒FT60F022,14PIN,这颗芯片最低时0.18元,现在不知道什么价格?
实现的功能:4COM+4SEG LCD驱动;3键扫描输入;38K红外调制载波;HT6222红外编码,www.rf315.cn有BIN烧录文件下载,PCB文件在嘉立创开源供下载


 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐