找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 29889|回复: 19
打印 上一主题 下一主题
收起左侧

段码屏的显示原理和HT1621驱动方法详解

  [复制链接]
跳转到指定楼层
楼主
最近一个客户联系到沙鸥,打算对一个市面上现有的测试仪器进行升级改进,电话初步交流了一下,当时一想,仪器无非就是探头加二次电路,应该SO EASY,客户发来产品资料,于是简单调研了一下这个仪器,发现光是这种类型仪器的测试探头就有千百种,呃,夸张了,好几种是有的,比如微波、射频、电磁波、电容等各种各样的探测方法都有,原来不是那么简单,小瞧了。那么直接拆解现有探头再开发新的适配电路板将是困难和费时间的事,因为原厂的电路板一般都有编程器件,没有程序代码也就不知道原厂板对探头是怎么进行的信号分析和处理,将是无从下手的,就像习武之人只学招式无非就是一些花架子,没有深厚的内功一切都做不成。
左思思右想想,测试仪有显示屏,能不能够从显示屏的接口获取传输显示的数据呢,因为一般显示屏显示的数据是已经经过处理得出的有效的可用的结果,这也许还是个好的思路。
一看,这是一个段码屏,段码屏一般都是定制的产品,每个屏的结构很可能都是不一样的。要想获取屏上的数据,肯定首先要做的事情就是了解显示的原理和结构,通过调研技术资料,从厂家获取相关帮助信息,获得了一点点的经验。不过这篇文章不是讲解怎么从段码屏获取数据,因为目前还没有做到那一步,这个还是有点难度的事,本文先来一些简单轻松的东西,主要说明段码屏的一般结构、原理、驱动方法和使用HT1621驱动段码屏的方法。

一、        段码屏的显示原理和驱动方法

一般段码屏有段电极和公共极,就像在图 2中,SEG1~SEG5为段电极,COM为公共极。段码屏中的每个段,都填充了一种特殊的液态晶体。在电场的作用下,晶体的排列方向会发生扭转,因而改变其透光性,从而可以看到显示的内容。一般电场电压就加在段电极和公共极的两端。

但是段码液晶显示屏不像数码管,施以一定大小的直流正向电压就能显示,如果在SEG和COM两端加直流电压,将会导致液态晶体不可逆的损坏。那么正确的操作是怎样呢?资料上说要想液晶显示的话需要在SEG和COM两端需要施加一定压差的交流电,假如不要液晶显示的话也需要在SEG和COM两端施加电压,不过施加电压的压差很小或者为零就可以。举个例子,我们要点亮某个段时,只需要保证给其电极两端加的电压差为3.3V(如COM1=3.3V,SEG1=0V),并且间隔合适的时间,将这两极的电压反转输出(如COM1=0V,SEG1=3.3V);不点亮某个段时,只需要保证给其电极两端加的电压差为0V(如COM1=3.3V,SEG1=3.3V),并且间隔合适的时间,将这两极的电压反转输出(如COM1=0V,SEG1=0V)。

上面将的就是段码屏的原理,下面举个简单的例子,说一下段码屏的结构。这个段码屏能显示的字符是“888.E”,一共有10个引脚,1-4号引脚分别是COM4-COM1,5-10号引脚分别是SEG1-SEG6。假如我们想让第一个符号显示“8”,就需要第一个字符的ABCDEFG码段都点亮,就需要在COM1-SEG2,COM2-SEG1和SEG2, COM3-SEG1和SEG2, COM4-SEG1和SEG2,之间同时施加交流电压,就是图 4里左边的电压逻辑。可以看出,这个段码屏的驱动方式还是比较复杂的,所以,咱们为了简便,需要使用到一个段码屏驱动芯片HT1621,在下一节详细地讲一讲。

二、        用HT1621来驱动段码屏
客官您看了在上一章节介绍的段码屏驱动原理吧,要想点亮一个码段就需要在它的两极施加交流电压,客官您是不是感觉太麻烦了,其实沙鸥也有这个感觉,不过其实厂家一般是用一些驱动芯片来做段码屏产品,比较常见的就是HT1621.
那HT1621又是干嘛的呢,来自百科的解释,HT1621是128 点内存映象和多功能的LCD驱动器,HT1621 的软件配置特性使它适用于多种LCD应用场合包括LCD模块和显示子系统,用于连接主控制器和HT1621的管脚只有4 或5 条,HT1621 还有一个节电命令用于降低系统功耗,一句话来说,HT1621就是用来驱动LCD的,它跟主控制器用几根线连接就可以了。那么问题来了,用HT1621怎么来驱动段码屏呢?
查阅了很多资料,有一篇文档非常值得推荐:《多功能LCD驱动器HT1621及其应用》,关于HT1621的具体参数、引脚配置等信息可以找一下它的datasheet看看,本文就直接讲一下怎么使用这个芯片。
HT1621有SEG0~SEG31一共32个段电极输出,COM0~COM3四个背电极输出,也就是能够驱动32*4=128个段码。在实际的应用中,一般我们是用不了这么多个段码的,可以先从低位向高位依次连接到段码屏。图 6又举了一个例子讲了一下单片机、HT1621和段码屏的接线。

线接好了,那问题来了,怎么让段码屏显示我们想要的字符呢?
看来还得从HT1621说起,HT1621内部有个RAM,大小是32*4=128,对应着32个SEG和4个COM电极组成的128个段码。将RAM中某一位置1,那么对应的段码就会被点亮,同样,置0的话,对应的段码就不显示,如图 7。举个例子,如图 8的段码屏,我们想让第一位显示字符“1”,根据图 5的逻辑表,我们需要让B和C码段的电极SEG2-COM2、SEG2-COM3两端有电压差,假如是用HT1621驱动并且按照图 5接线,那么只需要让HT1621 RAM中地址1中的数据位D1、D2为1,其余为0即可。


图 8
那么问题又来了,怎么让RAM中的数据变化呢?这就需要使用到单片机等微处理器,由单片机向HT1621传输数据改变RAM中内容,HT1621和单片机有四个引脚是连接的,CS、RD、WR和DATA,单片机就是通过这几个连接的引脚采用串行通讯的方式向HT1621传输数据。
它们之间通信的时序图如图 9,可见按照时序控制CS,WR,DATA引脚就能向HT1621的RAM中写入数据,从而改变段码屏中的显示内容。

以上为段码屏的显示原理和使用HT1621驱动的方法,本文的叙述没有来得及实践验证,可能有误,假如说错了话请不要见怪,恭迎指正。

欢迎关注:永珂在线

参考资料:
https://wenku.baidu.com/view/1d1e3368a5e9856a56126075.html
https://wenku.baidu.com/view/e509b512910ef12d2bf9e77d.html
https://blog.csdn.net/sinat_31499981/article/details/78329287
https://wenku.baidu.com/view/0b3e1e4f2b160b4e767fcf61.html

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏21 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:370779 发表于 2018-9-16 18:40 | 只看该作者
楼主上面关于点亮第一个“8”的段码有问题 按照图片的显示应该是COM0-SEG1,COM1-SEG0和SEG1, COM2-SEG0和SEG1, COM3-SEG0和SEG1,即1A 1B 1C 1D 1E 1F 1G7个笔段。
回复

使用道具 举报

板凳
ID:370779 发表于 2018-9-16 18:58 | 只看该作者
图6和图7之间那段话应该是COM1-SEG1和COM2-SEG1z,这样才能和图7对应起来,否则会让人产生误解
回复

使用道具 举报

地板
ID:472325 发表于 2019-2-14 17:06 | 只看该作者
先顶起!应该是很好的资料

评分

参与人数 1黑币 +10 收起 理由
春风十里吹 + 10

查看全部评分

回复

使用道具 举报

5#
ID:156220 发表于 2019-2-14 21:35 | 只看该作者
很好的资料,先收藏了
回复

使用道具 举报

6#
ID:553946 发表于 2019-6-4 15:06 | 只看该作者
不错不错!
回复

使用道具 举报

7#
ID:464883 发表于 2019-7-4 22:27 | 只看该作者
正在研究1621,楼主讲得简单易懂,学习了。
回复

使用道具 举报

8#
ID:248740 发表于 2019-8-14 17:11 | 只看该作者
1元感谢楼主,好懂,谢谢
回复

使用道具 举报

9#
ID:282095 发表于 2019-8-14 19:01 | 只看该作者
蛮详细的 感谢分享
回复

使用道具 举报

10#
ID:440637 发表于 2019-10-10 08:53 | 只看该作者
先顶起!应该是很好的资料
回复

使用道具 举报

11#
ID:483991 发表于 2020-4-3 21:17 | 只看该作者
先看看,后面应该用的着
回复

使用道具 举报

12#
ID:833692 发表于 2020-12-25 16:34 | 只看该作者
除了两处对应不上,讲得算是比较清楚的了
回复

使用道具 举报

13#
ID:313760 发表于 2021-4-13 22:16 | 只看该作者
这个地址到底是怎么看的
回复

使用道具 举报

14#
ID:845778 发表于 2021-9-10 11:39 | 只看该作者
请问楼主现在还接51内核的方案吗
回复

使用道具 举报

15#
ID:336378 发表于 2021-12-2 08:09 | 只看该作者
网上有现成的代码,移值过来就行了吧。有时不必什么都懂。有时我们是做产品,不是搞科研,当教授。
回复

使用道具 举报

16#
ID:232791 发表于 2022-1-14 09:27 | 只看该作者
就需要在COM1-SEG1和SEG2,COM2-SEG1和SEG2, COM3-SEG1和SEG2, COM4-SEG1和SEG2,之间同时施加交流电压
SEG1-COM2、SEG1-COM3
回复

使用道具 举报

17#
ID:1064915 发表于 2023-7-4 09:53 | 只看该作者
没有设计代码
回复

使用道具 举报

18#
ID:1095925 发表于 2024-1-5 16:18 | 只看该作者

先看看,应该用的着
回复

使用道具 举报

19#
ID:224580 发表于 2024-3-26 17:50 | 只看该作者
很高兴你能分享和详细说明1621原理,一直不懂怎么下手编程。
回复

使用道具 举报

20#
ID:1064915 发表于 2024-3-27 10:05 | 只看该作者
1.        #include <STC15F2K60S2.H>
2.        #include <intrins.h>
3.       
4.        /*7段数码段对应的8Bit顺序依次为bit7~bit0:abcx_fged
5.              --01--
6.           |            |
7.           10   02     08
8.           |  --20--   |
9.           40   04     08
10.           |            |
11.              --80--      
12.        */
13.       
14.        /*--------------------------------------------------------------
15.        LCD操作相关的宏定义和函数声明
16.        ----------------------------------------------------------------*/
17.        #define  ComMode  0x52    //4COM,1/3bias 偏压比     1000 0101 0010
18.        //#define ComMode  0x50    //4COM,1/2bias          1000 0101 0000
19.        #define  RCosc     0x30    //内部RC振荡器(上电默认)1000 0011 0000
20.        #define  LCD_on    0x06    //打开LCD显示 偏压发生器1000 0000 0110
21.        #define  LCD_off   0x04    //关闭LCD显示(上电默认)
22.        #define  Sys_en     0x02    //系统振荡器开 1000 0000 0010
23.        #define  Ctrl_cmd  0x80    //写控制命令   1000
24.        #define  Data_cmd  0xa0    //写数据命令   1010
25.       
26.        sbit DIPIN    =P3^7;              //LCD液晶屏DI引脚
27.        sbit CLKPIN  =P3^6;             //LCD液晶屏CLK引脚
28.        sbit CSPIN    =P3^5;              //LCD液晶屏CS引脚
29.       
30.        //SMS0707B LCD Drive code
31.        //Write bit data 写位数据
32.        void SendBit_1621(unsigned char sdata,unsigned char cnt)
33.                    //sdata 的高cnt 位写入HT1621,高位在前
34.        {
35.                unsigned char i;
36.                for(i=0;i<cnt;i++)
37.                {
38.                        CLKPIN=0;         
39.                        if(sdata&0x80)
40.                                DIPIN=1;
41.                        else DIPIN=0;
42.                        CLKPIN=1;
43.                        sdata<<=1;
44.                }
45.        }
46.       
47.        /*--------------------------------------------------------------------------------------------------------
48.        Name: SendCmd(送命令)
49.        写入标志码"100"和9位comma命令,由于没有使用到更改时钟输出等命令
50.        为了编程方便直接将command 的最高位写"0"
51.        ----------------------------------------------------------------------------------------------------------*/
52.        void SendCmd_1621(unsigned char command)//写命令
53.        {                   //3位标志码 + 9位命令,共12位
54.                CSPIN=0;      //执行一个下降沿                                       
55.                SendBit_1621(0x80,4);
56.              //写入标志码"100"和9位comma命令的最高1位共4位
57.                SendBit_1621(command,8);
58.              //写入9位comma命令的后8位,组成1000 xxxx xxxx
59.                CSPIN=1;    //送数完成后置高电平
60.        }
61.       
62.        /******-------------------------------------------------------------------------
63.        Name: Write_1621(送命令和数据程序)
64.        写入标志码"101"和6位addr地址码和8位sdata显示数据。
65.        ---------------------------------------------------------------------------*******/
66.        void Write_1621(unsigned char addr,unsigned char sdata,unsigned char len)//写数据
67.        {//3位标志码 + 6位写数据命令 + 8(4)位数据,共17位
68.                addr<<=2;//高6位有效
69.                CSPIN=0; //执行一个下降沿
70.                SendBit_1621(0xa0,3);                //写入标志码"101"    写数据命令101
71.                SendBit_1621(addr,6);                //写入addr 的高6位   写数据命令xxxx xx
72.                SendBit_1621(sdata,len);        //写入8/4位 sdata数据  len=8/4
73.                CSPIN=1;//送数完成后置高电平
74.        }
75.       
76.        /**-------------------------------------------------------------------------
77.        Name: Init_1621(初始化1621)
78.        -------------------------------------------------------------------------******/
79.        void LCD_Init()                       //初始化
80.        {                             //程序输入100 0+8=9位命令
81.                SendCmd_1621(Sys_en); //Sys_en 0x02 系统振荡器开          100 0 0000 0010
82.                SendCmd_1621(RCosc);
83.                             //RCosc 0x30 内部RC振荡器(上电默认) 100 0 0011 0000
84.                SendCmd_1621(ComMode);  //4COM,1/3bias                     100 0 0101 0020
85.                SendCmd_1621(LCD_on);
86.                             //LCD_on 0x06 打开LCD显示 偏压发生器100 0 0000 0110
87.        }
88.       
89.        /*-------------------------------------------------------------------------
90.        Name: lcdwd1(点亮1621全部Seg)
91.        -------------------------------------------------------------------------*/
92.        void LCDWD1(void)
93.        {
94.                unsigned char i;
95.                unsigned char addr=9;//5位显示码寄存器起始地址0x09
96.                for(i=0;i<5;i++)
97.                {
98.                        Write_1621(addr,LCD_Buffer[i+1],8);
99.                             //addr为地址码,l_data为数据,8为8位数据
100.                        addr+=2;  //顺延2个4位地址码
101.                }
102.        }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表