打印

求助有两个HT1621的液晶如何驱动

[复制链接]
5073|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
milktang|  楼主 | 2011-10-6 10:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 milktang 于 2011-10-7 16:57 编辑

两个HT1621一个是IC1,一个是IC2,对IC1单独片选操作,IC1控制的段能显示,对IC2单独操作,IC2控制的段没有显示。对IC1,IC2一起片选操作,IC1控制的段显示,IC2控制的段没显示。

段码的真值表是怎么确定的啊,不知道是不是IC2的地址操作有问题

如果我想显示PIN34 的6A段,应该怎么操作地址呢

已将IC引脚与LCD引脚连接关系注明,黑色是IC1引脚,红色是IC2引脚

相关帖子

沙发
yirongfu| | 2011-10-6 10:30 | 只看该作者
IC1的1-4和28-31引脚怎么都有COMx呢?一个玻璃片上一般只有一组COMx啊?最好把你接线图贴上来。
如果接线正确,IC2的6A应该是对应地址2。
你可以两片对应的IO**换一下试验,以排除硬件问题。

使用特权

评论回复
板凳
milktang|  楼主 | 2011-10-7 07:50 | 只看该作者
等待求解!

使用特权

评论回复
地板
milktang|  楼主 | 2011-10-7 16:45 | 只看该作者
注明了IC引脚与LCD引脚的连接关系

使用特权

评论回复
5
yirongfu| | 2011-10-8 01:20 | 只看该作者
你的这块液晶是一片共59个脚??
要是这样,可能问题根源不是你的软件,你得先排除你的硬件连接是否正确,主要是HT1621和液晶片之间的连接,不知道真值表中三组COM脚各管哪些SEG脚?
我怀疑这三组COM对应不同的SEG,而不是像你图示的那样第1和第2表格中的COM并联使用,因为这样并联没意义,没见过这么做的,至少我没见过。建议你先弄清液晶的管脚定义,可以问问厂家。

使用特权

评论回复
6
yirongfu| | 2011-10-8 01:22 | 只看该作者
很可能你得用三片HT1621来显示全部内容,因为有三组COM。

使用特权

评论回复
7
milktang|  楼主 | 2011-10-9 08:22 | 只看该作者
大家帮看看程序有没有问题
#include "pic.h"
#define uchar unsigned char
#define uint unsigned int
#define CS1 RB2
#define CS2 RB3
#define WR RB1
#define DATA RB0
#define BIAS   0x50  //0b1000 0101 0010  1/2duty 4com
#define SYSEN  0X02    //0b1000 0000 0010 打开系统振荡器
#define LCDON  0X06    //0b1000 0000 0110  打开LCD偏压
#define TIMERDIS  0X08 //0b1000 0000 1000  时基输出失效
#define nop()  NOP();NOP()
const uchar Ht1621Tab[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
                                        0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
const uchar Ht1621Tab1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
void delayms(uint x)
{
      uchar j;
      for(;x>0;x--)
      {
            for(j=0;j<40;j++);
       }
}
void init()
{
     ADCON1=0x07;
     TRISA=0x00;
     TRISB=0x00;
      TRISC=0x00;
}
void SendBit_1621(uchar dat,uchar cnt)//DATA的高cnt位写入1621,高位在前
{
     uchar i;
     for(i=0;i<cnt;i++)
    {
        if((dat&0x80)==0)DATA=0;
        else DATA=1;
        WR=0;
        NOP();
        NOP();
        NOP();
        NOP();
        WR=1;
         NOP();
          NOP();
         NOP();
        NOP();
        dat<<=1;
     }
}
void SendDataBit_1621(uchar dat,uchar cnt) //DATA的低cnt位写入1621,低高位在前
{
      uchar i;
       for(i=0;i<cnt;i++)
      {
            if((dat&0x01)==0)DATA=0;
            else DATA=1;
             WR=0;
            NOP();
            NOP();
            NOP();
            NOP();
            delayms(50);
             WR=1;
             NOP();
             NOP();
              dat>>=1;
      }
}
void SendCmd(uchar Cmd)  //写命令
{
      CS1=0;
      CS2=0;
      nop();
      SendBit_1621(0x80,4); //写入命令标志100
       SendBit_1621(Cmd,8);  //写入9位数据,其中前8位为Cmd命令,最后1位任意
       CS1=1;
       CS2=1;
       NOP();
       NOP();
       NOP();
      NOP();
      DATA=1;
}
void Write_1621_CS1(uchar Addr,uchar Data)
{
     CS1=0;
     SendBit_1621(0xa0,3);  //写入数据标志101
     SendBit_1621(Addr<<2,6); //写入6位地址数据
     SendDataBit_1621(Data,4); //写入数据的低4位
     CS1=1;
      nop();
      DATA=1;
      NOP();
}
void Write_1621_CS2(uchar Addr,uchar Data)
{
     CS2=0;
     SendBit_1621(0xa0,3);  //写入数据标志101
     SendBit_1621(Addr<<2,6); //写入6位地址数据
     SendDataBit_1621(Data,4); //写入数据的低4位
     CS2=1;
      nop();
      DATA=1;
       NOP();
}
void WriteAll_1621_CS1(uchar Addr,const uchar *p,uchar cnt)
{
     uchar i;
     CS1=0;
     SendBit_1621(0xa0,3); //写入数据标志101
     SendBit_1621(Addr<<2,6); //写入6位地址数据
     for (i=0;i<cnt;i++)
    {
          SendDataBit_1621(*p,8); //写入数据
           p++;
     }
    CS1=1;
    nop();
}
void WriteAll_1621_CS2(uchar Addr,const uchar *p,uchar cnt)
{
      uchar i;
      CS2=0;
      SendBit_1621(0xa0,3); //写入数据标志101
      SendBit_1621(Addr<<2,6); //写入6位地址数据
     for (i=0;i<cnt;i++)
      {
          SendDataBit_1621(*p,8); //写入数据
       p++;
      }
     CS2=1;
      nop();
}
void init1621()
{
     CS1=1;
     CS2=1;
     WR=1;
     DATA=1;
    SendCmd(SYSEN);
    SendCmd(LCDON);     
   SendCmd(BIAS);
   SendCmd(TIMERDIS);
}
void main()
{
     init();
     init1621();
     init1621();
     while(1)
    {
        WriteAll_1621_CS1(0x00,Ht1621Tab,16);
        WriteAll_1621_CS2(0x00,Ht1621Tab,16);
     }
}

使用特权

评论回复
8
milktang|  楼主 | 2011-10-10 16:57 | 只看该作者
问题已解决

使用特权

评论回复
9
ALLEN2006| | 2013-4-11 17:30 | 只看该作者
请教楼主改了什么地方解决了问题啊 !现在有个项目遇到同样的问题

使用特权

评论回复
10
Afengzi| | 2017-6-19 18:40 | 只看该作者
milktang 发表于 2011-10-9 08:22
大家帮看看程序有没有问题
#include "pic.h"
#define uchar unsigned char

老师你这个问题是怎么解决的呢

使用特权

评论回复
11
Afengzi| | 2017-6-19 18:41 | 只看该作者
ALLEN2006 发表于 2013-4-11 17:30
请教楼主改了什么地方解决了问题啊 !现在有个项目遇到同样的问题

两片1621的问题解决了吗

使用特权

评论回复
12
dirtwillfly| | 2017-6-20 15:40 | 只看该作者
1621不是带片选的吗?

使用特权

评论回复
13
xushuo888| | 2018-8-6 11:25 | 只看该作者
VK1621可兼容替代HT1621,性能稳定,更省成本,有资料跟驱动程序可以参考q 1918885898

VK1621B-LCD液晶显示驱动IC.pdf

1.41 MB

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

267

帖子

4

粉丝