找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 33882|回復(fù): 19
打印 上一主題 下一主題
收起左側(cè)

段碼屏的顯示原理和HT1621驅(qū)動方法詳解

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:63113 發(fā)表于 2018-7-7 21:14 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
最近一個客戶聯(lián)系到沙鷗,打算對一個市面上現(xiàn)有的測試儀器進行升級改進,電話初步交流了一下,當時一想,儀器無非就是探頭加二次電路,應(yīng)該SO EASY,客戶發(fā)來產(chǎn)品資料,于是簡單調(diào)研了一下這個儀器,發(fā)現(xiàn)光是這種類型儀器的測試探頭就有千百種,呃,夸張了,好幾種是有的,比如微波、射頻、電磁波、電容等各種各樣的探測方法都有,原來不是那么簡單,小瞧了。那么直接拆解現(xiàn)有探頭再開發(fā)新的適配電路板將是困難和費時間的事,因為原廠的電路板一般都有編程器件,沒有程序代碼也就不知道原廠板對探頭是怎么進行的信號分析和處理,將是無從下手的,就像習(xí)武之人只學(xué)招式無非就是一些花架子,沒有深厚的內(nèi)功一切都做不成。
左思思右想想,測試儀有顯示屏,能不能夠從顯示屏的接口獲取傳輸顯示的數(shù)據(jù)呢,因為一般顯示屏顯示的數(shù)據(jù)是已經(jīng)經(jīng)過處理得出的有效的可用的結(jié)果,這也許還是個好的思路。
一看,這是一個段碼屏,段碼屏一般都是定制的產(chǎn)品,每個屏的結(jié)構(gòu)很可能都是不一樣的。要想獲取屏上的數(shù)據(jù),肯定首先要做的事情就是了解顯示的原理和結(jié)構(gòu),通過調(diào)研技術(shù)資料,從廠家獲取相關(guān)幫助信息,獲得了一點點的經(jīng)驗。不過這篇文章不是講解怎么從段碼屏獲取數(shù)據(jù),因為目前還沒有做到那一步,這個還是有點難度的事,本文先來一些簡單輕松的東西,主要說明段碼屏的一般結(jié)構(gòu)、原理、驅(qū)動方法和使用HT1621驅(qū)動段碼屏的方法。

一、        段碼屏的顯示原理和驅(qū)動方法

一般段碼屏有段電極和公共極,就像在圖 2中,SEG1~SEG5為段電極,COM為公共極。段碼屏中的每個段,都填充了一種特殊的液態(tài)晶體。在電場的作用下,晶體的排列方向會發(fā)生扭轉(zhuǎn),因而改變其透光性,從而可以看到顯示的內(nèi)容。一般電場電壓就加在段電極和公共極的兩端。

但是段碼液晶顯示屏不像數(shù)碼管,施以一定大小的直流正向電壓就能顯示,如果在SEG和COM兩端加直流電壓,將會導(dǎo)致液態(tài)晶體不可逆的損壞。那么正確的操作是怎樣呢?資料上說要想液晶顯示的話需要在SEG和COM兩端需要施加一定壓差的交流電,假如不要液晶顯示的話也需要在SEG和COM兩端施加電壓,不過施加電壓的壓差很小或者為零就可以。舉個例子,我們要點亮某個段時,只需要保證給其電極兩端加的電壓差為3.3V(如COM1=3.3V,SEG1=0V),并且間隔合適的時間,將這兩極的電壓反轉(zhuǎn)輸出(如COM1=0V,SEG1=3.3V);不點亮某個段時,只需要保證給其電極兩端加的電壓差為0V(如COM1=3.3V,SEG1=3.3V),并且間隔合適的時間,將這兩極的電壓反轉(zhuǎn)輸出(如COM1=0V,SEG1=0V)。

上面將的就是段碼屏的原理,下面舉個簡單的例子,說一下段碼屏的結(jié)構(gòu)。這個段碼屏能顯示的字符是“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里左邊的電壓邏輯?梢钥闯觯@個段碼屏的驅(qū)動方式還是比較復(fù)雜的,所以,咱們?yōu)榱撕啽,需要使用到一個段碼屏驅(qū)動芯片HT1621,在下一節(jié)詳細地講一講。

二、        用HT1621來驅(qū)動段碼屏
客官您看了在上一章節(jié)介紹的段碼屏驅(qū)動原理吧,要想點亮一個碼段就需要在它的兩極施加交流電壓,客官您是不是感覺太麻煩了,其實沙鷗也有這個感覺,不過其實廠家一般是用一些驅(qū)動芯片來做段碼屏產(chǎn)品,比較常見的就是HT1621.
那HT1621又是干嘛的呢,來自百科的解釋,HT1621是128 點內(nèi)存映象和多功能的LCD驅(qū)動器,HT1621 的軟件配置特性使它適用于多種LCD應(yīng)用場合包括LCD模塊和顯示子系統(tǒng),用于連接主控制器和HT1621的管腳只有4 或5 條,HT1621 還有一個節(jié)電命令用于降低系統(tǒng)功耗,一句話來說,HT1621就是用來驅(qū)動LCD的,它跟主控制器用幾根線連接就可以了。那么問題來了,用HT1621怎么來驅(qū)動段碼屏呢?
查閱了很多資料,有一篇文檔非常值得推薦:《多功能LCD驅(qū)動器HT1621及其應(yīng)用》,關(guān)于HT1621的具體參數(shù)、引腳配置等信息可以找一下它的datasheet看看,本文就直接講一下怎么使用這個芯片。
HT1621有SEG0~SEG31一共32個段電極輸出,COM0~COM3四個背電極輸出,也就是能夠驅(qū)動32*4=128個段碼。在實際的應(yīng)用中,一般我們是用不了這么多個段碼的,可以先從低位向高位依次連接到段碼屏。圖 6又舉了一個例子講了一下單片機、HT1621和段碼屏的接線。

線接好了,那問題來了,怎么讓段碼屏顯示我們想要的字符呢?
看來還得從HT1621說起,HT1621內(nèi)部有個RAM,大小是32*4=128,對應(yīng)著32個SEG和4個COM電極組成的128個段碼。將RAM中某一位置1,那么對應(yīng)的段碼就會被點亮,同樣,置0的話,對應(yīng)的段碼就不顯示,如圖 7。舉個例子,如圖 8的段碼屏,我們想讓第一位顯示字符“1”,根據(jù)圖 5的邏輯表,我們需要讓B和C碼段的電極SEG2-COM2、SEG2-COM3兩端有電壓差,假如是用HT1621驅(qū)動并且按照圖 5接線,那么只需要讓HT1621 RAM中地址1中的數(shù)據(jù)位D1、D2為1,其余為0即可。


圖 8
那么問題又來了,怎么讓RAM中的數(shù)據(jù)變化呢?這就需要使用到單片機等微處理器,由單片機向HT1621傳輸數(shù)據(jù)改變RAM中內(nèi)容,HT1621和單片機有四個引腳是連接的,CS、RD、WR和DATA,單片機就是通過這幾個連接的引腳采用串行通訊的方式向HT1621傳輸數(shù)據(jù)。
它們之間通信的時序圖如圖 9,可見按照時序控制CS,WR,DATA引腳就能向HT1621的RAM中寫入數(shù)據(jù),從而改變段碼屏中的顯示內(nèi)容。

以上為段碼屏的顯示原理和使用HT1621驅(qū)動的方法,本文的敘述沒有來得及實踐驗證,可能有誤,假如說錯了話請不要見怪,恭迎指正。

歡迎關(guān)注:永珂在線

參考資料:
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

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏22 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:370779 發(fā)表于 2018-9-16 18:40 | 只看該作者
樓主上面關(guān)于點亮第一個“8”的段碼有問題 按照圖片的顯示應(yīng)該是COM0-SEG1,COM1-SEG0和SEG1, COM2-SEG0和SEG1, COM3-SEG0和SEG1,即1A 1B 1C 1D 1E 1F 1G7個筆段。
回復(fù)

使用道具 舉報

板凳
ID:370779 發(fā)表于 2018-9-16 18:58 | 只看該作者
圖6和圖7之間那段話應(yīng)該是COM1-SEG1和COM2-SEG1z,這樣才能和圖7對應(yīng)起來,否則會讓人產(chǎn)生誤解
回復(fù)

使用道具 舉報

地板
ID:472325 發(fā)表于 2019-2-14 17:06 | 只看該作者
先頂起!應(yīng)該是很好的資料

評分

參與人數(shù) 1黑幣 +10 收起 理由
春風(fēng)十里吹 + 10

查看全部評分

回復(fù)

使用道具 舉報

5#
ID:156220 發(fā)表于 2019-2-14 21:35 | 只看該作者
很好的資料,先收藏了
回復(fù)

使用道具 舉報

6#
ID:553946 發(fā)表于 2019-6-4 15:06 | 只看該作者
不錯不錯!
回復(fù)

使用道具 舉報

7#
ID:464883 發(fā)表于 2019-7-4 22:27 | 只看該作者
正在研究1621,樓主講得簡單易懂,學(xué)習(xí)了。
回復(fù)

使用道具 舉報

8#
ID:248740 發(fā)表于 2019-8-14 17:11 | 只看該作者
1元感謝樓主,好懂,謝謝
回復(fù)

使用道具 舉報

9#
ID:282095 發(fā)表于 2019-8-14 19:01 | 只看該作者
蠻詳細的 感謝分享
回復(fù)

使用道具 舉報

10#
ID:440637 發(fā)表于 2019-10-10 08:53 | 只看該作者
先頂起!應(yīng)該是很好的資料
回復(fù)

使用道具 舉報

11#
ID:483991 發(fā)表于 2020-4-3 21:17 | 只看該作者
先看看,后面應(yīng)該用的著
回復(fù)

使用道具 舉報

12#
ID:833692 發(fā)表于 2020-12-25 16:34 | 只看該作者
除了兩處對應(yīng)不上,講得算是比較清楚的了
回復(fù)

使用道具 舉報

13#
ID:313760 發(fā)表于 2021-4-13 22:16 | 只看該作者
這個地址到底是怎么看的
回復(fù)

使用道具 舉報

14#
ID:845778 發(fā)表于 2021-9-10 11:39 | 只看該作者
請問樓主現(xiàn)在還接51內(nèi)核的方案嗎
回復(fù)

使用道具 舉報

15#
ID:336378 發(fā)表于 2021-12-2 08:09 | 只看該作者
網(wǎng)上有現(xiàn)成的代碼,移值過來就行了吧。有時不必什么都懂。有時我們是做產(chǎn)品,不是搞科研,當教授。
回復(fù)

使用道具 舉報

16#
ID:232791 發(fā)表于 2022-1-14 09:27 | 只看該作者
就需要在COM1-SEG1和SEG2,COM2-SEG1和SEG2, COM3-SEG1和SEG2, COM4-SEG1和SEG2,之間同時施加交流電壓
SEG1-COM2、SEG1-COM3
回復(fù)

使用道具 舉報

17#
ID:1064915 發(fā)表于 2023-7-4 09:53 | 只看該作者
沒有設(shè)計代碼
回復(fù)

使用道具 舉報

18#
ID:1095925 發(fā)表于 2024-1-5 16:18 | 只看該作者

先看看,應(yīng)該用的著
回復(fù)

使用道具 舉報

19#
ID:224580 發(fā)表于 2024-3-26 17:50 | 只看該作者
很高興你能分享和詳細說明1621原理,一直不懂怎么下手編程。
回復(fù)

使用道具 舉報

20#
ID:1064915 發(fā)表于 2024-3-27 10:05 | 只看該作者
1.        #include <STC15F2K60S2.H>
2.        #include <intrins.h>
3.       
4.        /*7段數(shù)碼段對應(yīng)的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操作相關(guān)的宏定義和函數(shù)聲明
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    //內(nèi)部RC振蕩器(上電默認)1000 0011 0000
20.        #define  LCD_on    0x06    //打開LCD顯示 偏壓發(fā)生器1000 0000 0110
21.        #define  LCD_off   0x04    //關(guān)閉LCD顯示(上電默認)
22.        #define  Sys_en     0x02    //系統(tǒng)振蕩器開 1000 0000 0010
23.        #define  Ctrl_cmd  0x80    //寫控制命令   1000
24.        #define  Data_cmd  0xa0    //寫數(shù)據(jù)命令   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 寫位數(shù)據(jù)
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;      //執(zhí)行一個下降沿                                       
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;    //送數(shù)完成后置高電平
60.        }
61.       
62.        /******-------------------------------------------------------------------------
63.        Name: Write_1621(送命令和數(shù)據(jù)程序)
64.        寫入標志碼"101"和6位addr地址碼和8位sdata顯示數(shù)據(jù)。
65.        ---------------------------------------------------------------------------*******/
66.        void Write_1621(unsigned char addr,unsigned char sdata,unsigned char len)//寫數(shù)據(jù)
67.        {//3位標志碼 + 6位寫數(shù)據(jù)命令 + 8(4)位數(shù)據(jù),共17位
68.                addr<<=2;//高6位有效
69.                CSPIN=0; //執(zhí)行一個下降沿
70.                SendBit_1621(0xa0,3);                //寫入標志碼"101"    寫數(shù)據(jù)命令101
71.                SendBit_1621(addr,6);                //寫入addr 的高6位   寫數(shù)據(jù)命令xxxx xx
72.                SendBit_1621(sdata,len);        //寫入8/4位 sdata數(shù)據(jù)  len=8/4
73.                CSPIN=1;//送數(shù)完成后置高電平
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 系統(tǒng)振蕩器開          100 0 0000 0010
82.                SendCmd_1621(RCosc);
83.                             //RCosc 0x30 內(nèi)部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顯示 偏壓發(fā)生器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為數(shù)據(jù),8為8位數(shù)據(jù)
100.                        addr+=2;  //順延2個4位地址碼
101.                }
102.        }
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表