標(biāo)題: 段碼屏的顯示原理和HT1621驅(qū)動(dòng)方法詳解 [打印本頁(yè)]

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

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

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

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

上面將的就是段碼屏的原理,下面舉個(gè)簡(jiǎn)單的例子,說一下段碼屏的結(jié)構(gòu)。這個(gè)段碼屏能顯示的字符是“888.E”,一共有10個(gè)引腳,1-4號(hào)引腳分別是COM4-COM1,5-10號(hào)引腳分別是SEG1-SEG6。假如我們想讓第一個(gè)符號(hào)顯示“8”,就需要第一個(gè)字符的ABCDEFG碼段都點(diǎn)亮,就需要在COM1-SEG2,COM2-SEG1和SEG2, COM3-SEG1和SEG2, COM4-SEG1和SEG2,之間同時(shí)施加交流電壓,就是圖 4里左邊的電壓邏輯?梢钥闯,這個(gè)段碼屏的驅(qū)動(dòng)方式還是比較復(fù)雜的,所以,咱們?yōu)榱撕?jiǎn)便,需要使用到一個(gè)段碼屏驅(qū)動(dòng)芯片HT1621,在下一節(jié)詳細(xì)地講一講。

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

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


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

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

歡迎關(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

作者: 叫我紅領(lǐng)巾    時(shí)間: 2018-9-16 18:40
樓主上面關(guān)于點(diǎn)亮第一個(gè)“8”的段碼有問題 按照?qǐng)D片的顯示應(yīng)該是COM0-SEG1,COM1-SEG0和SEG1, COM2-SEG0和SEG1, COM3-SEG0和SEG1,即1A 1B 1C 1D 1E 1F 1G7個(gè)筆段。
作者: 叫我紅領(lǐng)巾    時(shí)間: 2018-9-16 18:58
圖6和圖7之間那段話應(yīng)該是COM1-SEG1和COM2-SEG1z,這樣才能和圖7對(duì)應(yīng)起來,否則會(huì)讓人產(chǎn)生誤解
作者: Trump1438    時(shí)間: 2019-2-14 17:06
先頂起!應(yīng)該是很好的資料
作者: 紫色的云    時(shí)間: 2019-2-14 21:35
很好的資料,先收藏了
作者: wangshihao123    時(shí)間: 2019-6-4 15:06
不錯(cuò)不錯(cuò)!
作者: 斷鍋鏟    時(shí)間: 2019-7-4 22:27
正在研究1621,樓主講得簡(jiǎn)單易懂,學(xué)習(xí)了。
作者: 銅cj    時(shí)間: 2019-8-14 17:11
1元感謝樓主,好懂,謝謝
作者: 鵬博士PBs    時(shí)間: 2019-8-14 19:01
蠻詳細(xì)的 感謝分享
作者: 道洲    時(shí)間: 2019-10-10 08:53
先頂起!應(yīng)該是很好的資料
作者: 正規(guī)007    時(shí)間: 2020-4-3 21:17
先看看,后面應(yīng)該用的著
作者: seagullever    時(shí)間: 2020-12-25 16:34
除了兩處對(duì)應(yīng)不上,講得算是比較清楚的了
作者: 15797939041    時(shí)間: 2021-4-13 22:16
這個(gè)地址到底是怎么看的
作者: ScreaA_    時(shí)間: 2021-9-10 11:39
請(qǐng)問樓主現(xiàn)在還接51內(nèi)核的方案嗎

作者: cba_cba    時(shí)間: 2021-12-2 08:09
網(wǎng)上有現(xiàn)成的代碼,移值過來就行了吧。有時(shí)不必什么都懂。有時(shí)我們是做產(chǎn)品,不是搞科研,當(dāng)教授。
作者: 15996822510    時(shí)間: 2022-1-14 09:27
就需要在COM1-SEG1和SEG2,COM2-SEG1和SEG2, COM3-SEG1和SEG2, COM4-SEG1和SEG2,之間同時(shí)施加交流電壓
SEG1-COM2、SEG1-COM3
作者: joyb    時(shí)間: 2023-7-4 09:53
沒有設(shè)計(jì)代碼
作者: chjh09    時(shí)間: 2024-1-5 16:18

先看看,應(yīng)該用的著
作者: likejian    時(shí)間: 2024-3-26 17:50
很高興你能分享和詳細(xì)說明1621原理,一直不懂怎么下手編程。
作者: joyb    時(shí)間: 2024-3-27 10:05
1.        #include <STC15F2K60S2.H>
2.        #include <intrins.h>
3.       
4.        /*7段數(shù)碼段對(duì)應(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振蕩器(上電默認(rèn))1000 0011 0000
20.        #define  LCD_on    0x06    //打開LCD顯示 偏壓發(fā)生器1000 0000 0110
21.        #define  LCD_off   0x04    //關(guān)閉LCD顯示(上電默認(rèn))
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.        寫入標(biāo)志碼"100"和9位comma命令,由于沒有使用到更改時(shí)鐘輸出等命令
50.        為了編程方便直接將command 的最高位寫"0"
51.        ----------------------------------------------------------------------------------------------------------*/
52.        void SendCmd_1621(unsigned char command)//寫命令
53.        {                   //3位標(biāo)志碼 + 9位命令,共12位
54.                CSPIN=0;      //執(zhí)行一個(gè)下降沿                                       
55.                SendBit_1621(0x80,4);
56.              //寫入標(biāo)志碼"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.        寫入標(biāo)志碼"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位標(biāo)志碼 + 6位寫數(shù)據(jù)命令 + 8(4)位數(shù)據(jù),共17位
68.                addr<<=2;//高6位有效
69.                CSPIN=0; //執(zhí)行一個(gè)下降沿
70.                SendBit_1621(0xa0,3);                //寫入標(biāo)志碼"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振蕩器(上電默認(rèn)) 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(點(diǎn)亮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個(gè)4位地址碼
101.                }
102.        }





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1