LCD段码屏驱动及程序实例
段码液晶显示屏简称段码屏(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文件在嘉立创开源供下载


更多推荐

所有评论(0)