您的位置:首页> >行业知识
如何用1621驱动段码液晶屏?
发布日期:2022-04-08

一、我们来了解1621段码液晶屏的特性
* 工作电压 2.4 --5.2V * 内嵌 256KHz RC 振荡器
* 可外接 32KHz 晶片或 256KHz 频率源输入
* 可选 1/2bais 或 1/3bais 偏压和 1/2duty 、1/3duty、1/4duty 的占空比
* 片内时基频率源
* 蜂鸣器可选择两种频率
* 内嵌时基发生器和看门狗定时器 WDT
* 时基或看门狗定时器溢出输出
* 八个时基/看门狗定时器时钟源
* 一个 32segX 4com 的 LCD 驱动器,内部嵌有的 32X 4 位显示 RAM 内存
* 四线串行接口 /CS, DATA, WR, RD,一般情况下RD不用
* 片内 LCD 驱动频率不可调64HZ
* 软件配置特征: 数据模式和命令模式 两种指令
* 提供 VLCD 管脚用于调整 LCD 操作电压(对比度调节)

二、LCD 逻辑表对应关系
 1621驱动段码液晶屏逻辑表
1621的RAM 和上图的逻辑表是对应的,
这样可以很好的理解了吧

1621对应32个地址   每个地址对应4个com数据
例如:0地址写入0X08 对应SGE0的T1亮 
              写入0X01 对应SGE0的1F亮
写入0X02 对应SGE0的1G亮
写入0X07 对应SGE0的1E,1G,1F,三个一起亮    
写入0X0F 对应SGE0的1E,1G,1F,T1四个全部亮 
  
1621可以连续写,最好做的事一次写入两个地址,这样好做table表,写起来简单。
 例如:前两个地址写入0XF7对应SGE0,SEG1的1E,1G,1F,1D,1C,1B,1A全部亮这样就显示了一个完整“8”字            
 

要想使液晶屏显示,IC的初始化中这几个指令必须要写。

首先了解一下什么是指令,什么是数据
1  0  0                  C8 C7 C6 C5 C4 C3 C2 C1 C0
前三位100是指令的标志位,后面的9位是指令值
1  0  1                  C7 C6 C5 C4 C3 C2 C1 C0
前三位101是数据的标志位,后面的8位是数据
也就是说看到前三位100 就代表指令,看到前三位101 就代表数据

 以下这4个指令要写入初始化函数的
1、SYS EN   100    0000 - 0001- X  指令 0X01   (打开闭系统振荡器)X: Don't care   
2、BIAS     100    0010 - abXc - X  指令 
这里解释一下:C=1为LCD1/3 bias ;C=0为LCD1/2 bias 
ab=00:    2 COM
ab=01:    3 COM
ab=10:    4 COM
3、RC256    100     0001-1000 - X   指令 0X01   (内部时钟)X: Don't care
4、LCDON    100    0000 - 0011 - X   指令 0X01 (打开LCD显示)X: Don't care
           
下面是深圳市绘晶科技有限公司的程序C代码诠释
/********************************************************
公司:深圳市绘晶科技有限公司www.huijingkeji.com
功能描述: HT1621芯片测试程序
人:tangpinghai
本:1.0
完成时间:2022年3月13日
********************************************************/
#include  <reg51.h>
#include  <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define _Nop() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
#define BIAS    0x29   //0b100 - 0010 -1001 - 0    1/3duty 4com
#define SYSDIS   0X00   //0b100 - 0000 - 0000 - 0       关振系统荡器和LCD偏压发生器
#define SYSEN    0X01  //0b100 - 0000 - 0001 - 0     打开系统振荡器
#define LCDOFF   0X04   //0b100 - 0000- 0010 - 0       关LCD显示
#define LCDON   0X03  //0b100 - 0000 - 0011 - 0      打开LCD显示
#define XTAL    0x14   //0b100 - 0001- 0100 - 0     外部接时钟
#define RC256    0X18  //0b100 - 0001 - 1000 - 0       内部时钟
#define TONEOFF 0X10   //0b1000 0001 0000     关闭声音输出
#define WDTDIS  0X0A   //0b1000 0000 1010       禁止看门狗
//HT1621控制位(液晶模块接口定义,根据自已的需要更改)
sbit DAT=P1^0; 
sbit wr=P1^1;   
sbit CS1=P1^2; 
uchar code table[10]={0xFA,0x0A,0xD6,0x9E,0x2E,0xBC,0xFC,0x1A,0xFE,0xBE}; //0---9的table表
//////////    延时函数1    delay us///////
void Delay(uint us)  
{
while(--us);
}
///////////////  延时函数2  ///////////////////
void DelayMS(uint iMs)
{
 uint i,j;
  for(i=0;i<iMs;i++)
  for(j=0;j<65;j++)
     ;
}
/******************************************************
函数名称: void Ht1621Wr_Data(uchar Data,uchar cnt)
写数据函数,cnt为传送数据位数,数据传送为高位在前
*******************************************************/
void Ht1621Wr_Data(uchar Data,uchar cnt)
{
   uchar i;
  for (i=0;i<cnt;i++)
   {  
       wr=0;
if (Data&0x80)
            DAT=1;          
else 
            DAT=0;
         wr=1;
       Data<<=1;
  }
}
/********************************************************
函数名称:void Ht1621WrCmd(uchar Cmd)
明:写入指令  
********************************************************/
void Ht1621WrCmd(uchar Cmd)
{
  CS1=0;                   //片选CS低有效
  _Nop();
  Ht1621Wr_Data(0x80,3);    //写入指令标志100
  Ht1621Wr_Data(Cmd,9);  //写入指令数据
  CS1=1;                   //片选CS高关闭
  _Nop();
}
/********************************************************
函数名称:void Ht1621WrOneData(uchar Addr,uchar Data) 
写一个数据,
1、先写101数据的标识位
2、再写地址
3、最后写要显示的数据
********************************************************/
void Ht1621WrOneData(uchar Addr,uchar Data)
{
   CS1=0;
  Ht1621Wr_Data(0xa0,3); //写入数据标志101
  Ht1621Wr_Data(Addr<<2,6); //写入地址数据
  Ht1621Wr_Data(Data,8); //写入数据这里是两个地址一起写得8bit
  CS1=1;
/********************************************************
函数名称:void Ht1621WrAllData(uchar Addr,uchar p)
明:HT1621的数据位4位位一个地址,
上面我们讲过可以一次写两位 ,数据为8位。
高四位----对应高地址   第四位-----对应低地址。
********************************************************/
void Ht1621WrAllData(uchar Addr,uchar p)
{
  uchar i;
  CS1=0;
  Ht1621Wr_Data(0xa0,3); //写入数据标志101
  Ht1621Wr_Data(Addr<<2,6); //写入地址数据
  for (i=0;i<16;i++)
   {
    Ht1621Wr_Data(p,8); //写入数据  16X8=128bit 
   }
 // for (i=0;i<32;i++)
  / /{//这里是四位四位的写数据的
  //  Ht1621Wr_Data(p,4); //写入数据  32X4=128bit 
   //}

   CS1=1;
}
/********************************************************
函数名称:void Ht1621_Init(void)  www.xyhlcd.com
明:初始化后,液晶屏才能正常的工作
********************************************************/
void Ht1621_Init(void)
{
  CS1=1;
  DAT=1;
  DelayMS(200);      //延时使LCD工作电压稳定
  Ht1621WrCmd(BIAS);      //BIAS的设置
  Ht1621WrCmd(RC256);    //使用内部振荡器
          Ht1621WrCmd(SYSEN);  //打开系统振荡器
  Ht1621WrCmd(LCDON);  //打开LCD显示   
}
/////////////////////////////////////////////////////////////////
////函数名:xianshi_1()
///客户可以跟句自己的需求直接填入数据就可以显示来了
/////////////////////////////////////////////////////////////////
void xianshi_1()
 {
 ///////////////////////////
  Ht1621WrOneData( 0, table[0]);       //显示0
  Ht1621WrOneData( 2, table[1]);       //显示1     
  Ht1621WrOneData( 4, table[2]|0X08);  //显示2 +小数点       
  Ht1621WrOneData( 6, table[3]);      //显示3
      :
      :
              :
Ht1621WrOneData( 12, table[8]|0X08);     //显示8+图标
          Ht1621WrOneData( 14, table[9]|0X08);     //显示9+图标


/********************************************************
下面是深圳市绘晶科技有限公司的程序C代码诠释
/********************************************************
公司:深圳市绘晶科技有限公司www.huijingkeji.com
功能描述: HT1621芯片测试程序
人:tangpinghai
本:1.0
完成时间:2022年3月13日
********************************************************/
void XUNHUN_XIANSHI( uchar Lenth ,uchar Time)
{  
uchar i,j,t;
for (i=0;i<Lenth;i=i+2)
    {
      t=0x01;
for (j=0;j<8;j++)
      {
        Ht1621WrOneData(i,t);
        t<<=1;
t|=0x01;   
      DelayMS(Time);
      }
   } 
        }





/********************************************************
公司:深圳市兴宇合电子有限公司www.xyhlcd.com
功能描述: HT1621芯片测试程序
人:Zheng Qiu Sheng
本:1.0   
函数命: 主函数main()
完成时间:2022年3月13日
********************************************************/
void main()
{  
  Ht1621_Init();    //上电初始化LCD
  DelayMS(100); //延时使初始化稳定
while(1)

Ht1621WrAllData00(0,0X00);//清除1621寄存器数据为0。
   DelayMS(400);
Ht1621WrAllData00(0,0XFF);//填充示1621寄存器数据为1。
  DelayMS(800);    
Ht1621WrAllData00(0,0X00);//清除1621寄存器数据为0。
  DelayMS(400);  
  Xianshi_1();              //此处客户可以自己定义怎么显示。
  DelayMS(800);
  XUNHUN_XIANSHI( 32 ,100)/// 一个笔段一个笔段循环显示32个地址间隔100MS。
  DelayMS(800);
  }