段码LCD屏幕的驱动方法

大家平常在生活之中见到最多的可能就是段码液晶屏了,它有着普通数码管的特征,又有着点阵液晶屏的特征,已经固定的图形,既省成本而且又好看,那么,我们今天来一起试一试!
  首先,大家都不要以为使用单片机来驱动,就以为是断码屏直流驱动的了,其实呢,段码屏它是交流驱动的,什么是交流驱动呢?例如矩形波、正弦波等等。大家可能会经常的使用驱动芯片来玩,例如HT1621等等,但是有一些段式屏的IO口是比较少的,或者说是IO口充足的情况之下,也懒得在再去写控制器的驱动了。但是,IO的模拟驱动,段式液晶是有一个前提条件的,就是IO必须要是三态,
  为什么?下面我们就一起细细的道来:
  第一步:段码液晶屏最重要的参数:占空比、工作电压、偏压比。这三个参数都是非常重要的,都必须要满足。
  第二步:驱动的方式:我们根据 LCD 的驱动原理可以知道,LCD的像素点上面只能够加上 AC的电压,LCD显示器的对比度则是由 COM脚上的电压值减去 SEG 脚上的电压值来决定,当这个电压差在大于 LCD 饱和电压时就能够打开像素点,小于 LCD 阈值电压时就能关闭像素点了,LCD 型的MCU 已经由内建的 LCD 驱动电路自动产生出LCD驱动信号了,因此只需要 I/O 口能仿真输
  出该驱动的信号,就能够完成 LCD 的驱动了。
  段码液晶屏主要是有两种引脚,COM和SEG,和数码管比较像,但是,压差必须要是交替变化的,例:第一时刻是正向的3V,那么第二时刻就必须要是反向的3V,注意一点,如果你给段码液晶屏通直流电,那么不用多久这个屏幕就会报废,所以千万要注意。下面我们就来考虑如何模拟COM口的波形,我们以1/4D,1/2B为例子:
  段码LCD屏的驱动方法
  只要模拟出以上的波形,你的液晶屏就已经成功了一大半。
  void display_sub(u8 y) //lcd display subroutine
  {
   switch(y) //4*com,VDD and -VDD LCD display,so 8 timebase interrupt one sacn period
   {
   case 1:
   {com1_output_high();break;}
   case 2:
   {com1_output_low();break;}
   case 3:
   {com2_output_high();break;}
   case 4:
   {com2_output_low();break;}
   case 5:
   {com3_output_high();break;}
   case 6:
   {com3_output_low();break;}
   case 7:
   {com4_output_high();break;}
   case 8:
   {com4_output_low();break;}
   default:
   {LCDPluseStep=0;
   get_display_code(AD_Value,KeyScanRetVal);
   break;}
   }
  }
  复制代码
  如上图代码所示,定时到2ms,让4个COM交替的输出波形就可以了。
  同时我们还要注意,在COM的输出较高的时候,如果要屏幕亮,那么SEG就要输出低,那么在COM输出低的时候,SEG就要输出高了,保证COM和SEG的压差大于1/2B工作电压就可以正常显示了
  下面我们看其中一个com口输出时的函数
  static void seg1_output(void) //seg1 output subroutine
  {
   if(1 == (LCDPluseStep%2)) //com_pulse is odd,com output high (VDD)
   {
   if(0 == (DisplayCode1&0x10))
   {SEG1=1;}
   else
   {SEG1=0;}
   }
   else //com_pulse is even,com output low (VSS)
   {
   if(0 == (DisplayCode1&0x10))
   {SEG1=0;}
   else
   {SEG1=1;}
   }
  }
  复制代码
  必须时刻让SEG电平跟COM的电平成反向,那么驱动段式液晶就不会有多大的难度了
  12864:http://www.hzjingxian.com
  本文原创来于http://www.hzjingxian.com/zixun/xydt/822.html,转载请注明出处

### LCD驱动程序开发、原理及实现方法 #### 驱动芯片的作用 液晶屏通常依赖专门的驱动芯片完成显示功能。例如HT1621,它不仅能够扩展MCU的I/O端口数量,还能生成必要的正负电压差以点亮屏幕像素[^2]。 #### HT1621工作模式概述 HT1621是一款多功能低功耗CMOS LCD驱动器/控制器集成电路(IC),专为各种小型LCD应用设计而成。该器件内置有ROM-less架构以及静态随机存取存储器(SRAM),允许灵活配置多达72个共阴极或共阳极线组合形式下的字符点阵布局结构[^1]。 以下是关于如何利用HT1621作为主要元件构建起完整的LCD屏系统的几个关键技术要点: ##### 数据传输协议 为了简化主处理器与外设之间的通讯过程,HT1621采用了三线制同步串行接口标准SPI(Serial Peripheral Interface)。这意味着只需要四个GPIO针脚就能完全掌控整个装置的操作行为:CLK(时钟)、DATA_IN(数据输入)、CS(片选),再加上一个可选RESET信号引脚用来执行全局复位动作。 ##### 初始化序列 当第一次启动或者重新加载新的图像内容到屏幕上之前,必须先经历一系列严格的初始化步骤来设定好各个寄存器的状态值。这一步骤对于确保后续正常运作至关重要。下面给出了一伪代表示这一阶的主要活动项: ```c // 定义常量宏定义代表不同的命令字节含义 #define CMD_SYSTEM_RESET 0x80 #define CMD_OSCILLATOR_START 0x40 ... void ht1621_init() { send_command(CMD_SYSTEM_RESET); // 发送系统重置指令给IC delay_ms(5); // 短暂等待稳定下来 send_command(CMD_OSCILLATOR_START); // 启动内部振荡器产生所需频率波形 ... } ``` ##### 图像更新机制 一旦完成了前期准备工作之后,就可以着手编写具体的绘图算法了。一般来说,我们会把待呈现的信息编成适合目标硬件解释的形式后再传送给对方处理。比如要让某个特定位置上的LED灯泡发光,则只需按照既定规则计算出对应地址偏移量并写入恰当的数据即可达成目的。 ```c void set_pixel(uint8_t row, uint8_t col, bool state) { uint8_t addr = calculate_address(row, col); write_data(addr, state ? PIXEL_ON : PIXEL_OFF); } ``` --- ### 注意事项 在实际项目实施过程中还需要特别留意以下几个方面的问题以免造成不必要的麻烦: - **电气特性匹配**:保证供电电压范围满足规格书规定的要求,防止过高电流流入敏感部位引起永久损害; - **抗噪能力增强**:采用双绞线布线技术降低外部射频干扰的影响程度提高整体可靠性水平; - **热管理考量**:长时间连续满负荷运转可能会引发局部温度升高现象因此有必要采取散热措施加以缓解压力。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值