劉波
(山東省威海市文登技師學(xué)院信息工程系,山東文登,264400)
段碼液晶屏幾乎可以說隨處可見,電子愛好者如果不能開發(fā)利用,實(shí)在是可惜。筆者手頭就有一塊液晶屏ETM8812K4-01,從郵購至今也未使用,現(xiàn)在網(wǎng)上可以搜索到該液晶屏的資料,決定試著開發(fā)使用。
圖1 點(diǎn)亮全部段碼的ETM8812K4液晶屏
把液晶屏ETM8812K4-01的顯示面向著自己,引腳在右側(cè),共16個(gè)引腳,右上角為第1腳,右下角為第16腳,對(duì)應(yīng)的引腳及功能如下:
1腳:CS片選;2腳:WR讀寫;3腳:AO數(shù)據(jù),此部分為上半屏的段劃屏,采用串行傳輸方式,可顯示一些“8”字和特殊的字符。
4腳: +5V;5腳:GND。
6腳:RS;7腳:R/W;8腳:EN;9-16腳:數(shù)據(jù)口(相當(dāng)于LCD1602的D0-D7);6-16腳為LCD1602部分。
兩個(gè)顯示部分由各自的驅(qū)動(dòng)電路驅(qū)動(dòng),可以單獨(dú)使用,也可以一起使用,上半屏由合泰HT1621或其兼容芯片驅(qū)動(dòng),下半屏由HD44780及兼容芯片驅(qū)動(dòng)。LCD1602部分可以顯示16個(gè)5×7點(diǎn)陣字符,這里重點(diǎn)介紹上半部分。網(wǎng)絡(luò)上有合泰HT1621的PDF文檔,包括時(shí)序圖、操作方式等,讀者可以自行查閱。
要想使用段碼屏,必須知道各段的地址和數(shù)據(jù),筆者對(duì)照該段碼屏的全部顯示內(nèi)容,并參考互聯(lián)網(wǎng)資料,把顯示的“8”字與市售數(shù)碼管的段位定義相同,把該段碼屏各地址對(duì)應(yīng)的數(shù)據(jù)和顯示內(nèi)容歸納了一個(gè)表格,見表1。
表1
地址和顯示圖形 0x1a 0x19|| 第2個(gè)“8”地址和顯示圖形 0x18 0x17<< 第3個(gè)“8”地址和顯示圖形 0x16 0x15>> 第4個(gè)“8”地址和顯示圖形0x13 0x12第5個(gè)“8” 一共127個(gè)段,0x13地址數(shù)據(jù)為0x08的段未設(shè)置地址和顯示圖形 0x11 0x10 TOTAL 第6個(gè)“8”地址和顯示圖形 0x0e 0x0d%上部 第7個(gè)“8”地址和顯示圖形 0x0b 0x0a S 第8個(gè)“8” “S”位于該字后邊地址和顯示圖形 0x08 0x07:第9個(gè)“8” “:”位于該字前邊地址和顯示圖形 0x06 0x05 F 第10個(gè)“8”地址和顯示圖形 0x01 1上部第11個(gè)“8” “1”位于該字的左邊地址和顯示圖形 0x03 0x04.第12個(gè)“8” “.”位于該字的左邊
注意:第11、12個(gè)數(shù)字“8”高四位和低四位的地址與前10個(gè)的排序是不同的。
其它字符的地址和對(duì)應(yīng)的數(shù)據(jù):
USB :0x1b ,0x08 CARD :0x1b ,0x04
從左到右的10個(gè)方格:
0x14 ,0x08--0x14 ,0x02--0x14 ,0x04-0x0f ,0x08-0x0f ,0x04-0x0c ,0x04---0x0c ,0x02-0x0c ,0x08-0x09 ,0x08-0x09 ,0x04
:0x1b ,0x02 ELAPSED :0x14 ,0x01 REMAIN:0x0c,0x01 AUTO :0x09 ,0x02 CUE: 0x09 ,0x01
第6個(gè)“8”子后的冒號(hào) 0x0f ,0x02 M: 0x0f ,0x01
SINGLE :0x1e,0x08 CONTINUE: 0x1e,0x04 ROBO:0x1e,0x02 PITCH :0x1e,0x01
PROGRAM :0x1f,0x01 LOOP :0x1f,0x02 REPEAT:0x1f,0x04 1 :0x1f,0x08 ALL:0x13,0x08
“+”自上而下的地址和數(shù)據(jù) 0x00, 0x08 0x00,0x04 0x00, 0x02
“1” 自上而下的地址和數(shù)據(jù) 0x01,0x08 0x00, 0x01
本以為段碼屏的驅(qū)動(dòng)很難,其實(shí)并不難,互聯(lián)網(wǎng)上有HT1621的底層驅(qū)動(dòng)程序,調(diào)用“HT1621.h”就可以點(diǎn)亮自己的段碼屏了。
// ==Ht1621驅(qū)動(dòng)的液晶屏ETM8812K4-01測試程序main.c====
//本測試程序能夠測試HT1621的每一個(gè)字段,依次點(diǎn)亮每一個(gè)字段
#include “main.h”
//包含51單片機(jī)頭文件及數(shù)據(jù)類型聲明
#include“HT1621.h”// HT1621的底層驅(qū)動(dòng)程序
void main()
{
unsigned char i,j,t;
Ht1621_Init();// - - 上電初始化LCD
Ht1621_delayms(5000);//- -延時(shí)一段時(shí)間
while(1){
Ht1621_delayms(2000);//- -延時(shí)一段時(shí)間
Ht1621WrAllData(0,Ht1621Tab,16);
//- -清除1621寄存器數(shù)據(jù),即清屏
for (i=0;i<32;i++)//- -循環(huán)點(diǎn)亮LED,共32個(gè)地址
{
t=0x01;
for (j=0;j<4;j++)//每個(gè)地址有4個(gè)段,數(shù)據(jù)依次為1、2、4、8
{
Ht1621WrOneData(i,t);
t<<=1;//數(shù)據(jù)左移 1 位
Ht1621_delayms(500);//延時(shí)長點(diǎn),便于準(zhǔn)確標(biāo)記每個(gè)段的地址和數(shù)據(jù)
}
}
}
}
段碼屏的每一個(gè)地址都有4個(gè)段,段值依次為1、2、4、8,向每一個(gè)地址依次寫段值就可以逐段點(diǎn)亮,有了底層驅(qū)動(dòng)程序,編寫逐段點(diǎn)亮的顯示程序main.c,編譯生成16進(jìn)制文件下載到單片機(jī)中,仔細(xì)觀察段碼屏的每一個(gè)段的顯示次序,就可以知道該段的地址和數(shù)據(jù)了。知道這些數(shù)據(jù),采用底層驅(qū)動(dòng)程序,向?qū)?yīng)的段寫數(shù)據(jù),可以按要求顯示數(shù)字或個(gè)別特殊字符。
筆者使用Keil uVision4軟件編譯main.c沒有錯(cuò)誤后,下載到單片機(jī)里,連接好電路實(shí)驗(yàn),結(jié)果段碼屏顯示不正常,見圖2。屏上有一部分沒有點(diǎn)亮,程序是沒有問題的,想到以前碰到液晶屏的導(dǎo)電橡膠接觸不良,難道這個(gè)也是?于是小心的把金屬外框拆下,把電路板和導(dǎo)電橡膠的接觸面都擦了一遍,結(jié)果還是那樣,懷疑玻璃與導(dǎo)電橡膠接觸有問題,拆下一看,不得了,液晶玻璃邊緣大約1cm長×2mm寬的地方碎了,碎的地方剛好有導(dǎo)電條和導(dǎo)電橡膠接觸,玻璃屑還未掉出來,看來是由于外力的撞擊,金屬框沒有緩沖(這也是這種封裝的液晶屏的缺點(diǎn)吧),直接導(dǎo)致玻璃碎了,好在只是邊沿的導(dǎo)電部分碎了,如果顯示面碎了,該液晶屏也只得報(bào)廢了。
圖2 顯示不完整的ETM8812K4液晶屏
那能不能用僅有的7個(gè)數(shù)碼管做個(gè)時(shí)鐘呢?答案是肯定的。為了程序的通用性,同時(shí)結(jié)合附表數(shù)據(jù)的使用,筆者編寫了1位數(shù)碼管顯示數(shù)字的各個(gè)段碼和轉(zhuǎn)為16進(jìn)制數(shù)的函數(shù)—INT8U dat_buf(INT8U dat),該函數(shù)對(duì)ETM8812K4-01液晶屏中第1至第10個(gè)數(shù)碼管是適用的,當(dāng)要第11和12個(gè)數(shù)碼管顯示數(shù)字時(shí),要把顯示數(shù)據(jù)的高四位和低四位顛倒一下。當(dāng)你把某一個(gè)“8”字的各段的地址和該段的數(shù)據(jù)按數(shù)碼管畫出來的話,該函數(shù)是不難理解的。如果想顯示其它基于“8”字下的字符,還可以在該函數(shù)中繼續(xù)添加相關(guān)代碼,這是不難的。
既然該液晶屏還有LCD1602的功能,為何不用它來顯示日期呢?經(jīng)測試該屏雖然結(jié)構(gòu)上可以顯示1行共16個(gè)自定義字符,但在驅(qū)動(dòng)時(shí)要分兩行寫入,每行可以顯示8個(gè)自定義字符,第一行的起始地址是0x80,第2行的起始地址是0xc0。
筆者手頭有多塊DS1302時(shí)鐘芯片,決定好好利用一下,在調(diào)試過程中,不知都怎么折騰的,有的工作時(shí)發(fā)燙,只得斷電,不但顯示不正常,還不走時(shí)。其中的3塊,有的項(xiàng)為0,有的項(xiàng)不為0,但明顯的特征是秒為80,可讀寫,但不走時(shí),還有一塊,全部的顯示內(nèi)容都為0,不可以寫,也不走時(shí),這幾塊似乎都?jí)牧?,見圖3、圖4。查網(wǎng)上資料,說這種芯片有國產(chǎn)的,質(zhì)量比較差,很多人借此機(jī)會(huì)狠狠地黑了一把國產(chǎn)芯片,還有個(gè)問題是該芯片雙電源工作時(shí),未切斷主電源而拆裝紐扣電池,這時(shí)極易導(dǎo)致DS1302發(fā)燙,甚至損壞。我在調(diào)試DS1302時(shí),時(shí)鐘工作不正常,就曾拆過紐扣電池,應(yīng)該是這個(gè)原因所致。找來舊設(shè)備拆下一塊好的DS1302,連好電路,經(jīng)過調(diào)試,時(shí)鐘工作正常。
圖3 顯示不正常的DS1302時(shí)鐘
圖4 顯示不正常的DS1302時(shí)鐘
網(wǎng)上說DS1302芯片顯示小時(shí)超過23,分或秒超過59的等等都是壞的。全部顯示項(xiàng)為0的那塊肯定是報(bào)廢了,其余3塊覺得似乎不大可能報(bào)廢,能不能改改軟件試試。筆者的程序中沒有調(diào)整秒的這一項(xiàng),能不能在調(diào)整分的時(shí)候把秒清零(這樣調(diào)整時(shí)間可以更精準(zhǔn)些),或者在此時(shí)先判斷秒是否超過59,超過則把秒清零。按此想法把程序改了一下,結(jié)果那3塊DS1302竟然起死回生了,每塊實(shí)驗(yàn)一個(gè)周都沒問題。當(dāng)然若其他項(xiàng)超過正常值,是不是也可以這樣做?應(yīng)該可以,有類似問題的讀者朋友不妨可以試一試,說不定你的DS1302也能起死回生了。
圖5為筆者設(shè)計(jì)的DS1302萬年歷可調(diào)時(shí)鐘電路,由于是Proteus仿真電路,只有LCD1602顯示部分,而沒有HT1621的段碼顯示部分,整個(gè)電路采用單面萬能板制作,見圖6~圖8,還未來得及為這個(gè)時(shí)鐘做一個(gè)漂亮的外殼。P0口的低3位作LCD1602的控制端,高4位作LCD1602的數(shù)據(jù)口。P2口的高3位作HT1621顯示的接口,低3位作DS1302時(shí)鐘芯片的控制。為了減小DS1302的功耗,其主電源VCC2端串有390Ω電阻,這里沒有采用集成的4輸入端的入門電路,而采用4只二極管構(gòu)成的4輸入端的入門電路,任何一個(gè)按鍵按下都能觸發(fā)外部中斷0,各按鍵下端都接地,上端分別接P3口的高四位。LCD1602顯示年月天星期和調(diào)整項(xiàng),正常工作時(shí)調(diào)整項(xiàng)Adjust_Index為-1,實(shí)際顯示“/”,調(diào)整年顯示6,調(diào)整月顯示4,調(diào)整天顯示3,調(diào)整小時(shí)顯示2,調(diào)整分鐘顯示1。由于LCD1602能直接顯示ASCII碼,所以不用編寫復(fù)雜的數(shù)據(jù)表。HT1621驅(qū)動(dòng)的段碼液晶屏使用前6個(gè)8字顯示時(shí)分秒,時(shí)分是大字,秒是小字,這樣看起來效果也是不錯(cuò)的。
圖5 DS1302萬年歷可調(diào)時(shí)鐘電路
圖6 覆銅板的銅箔面
軟件包含7部分:HT1621.h、DS1302.h、DS1302.c、LCD1602_4bit.h、LCD1602_4bit.c、main.h、 main.c,詳細(xì)源代碼見壓縮包,圖9為main.c文件流程圖。
主程序的無限循環(huán)部分,不斷讀取DS1302的數(shù)據(jù),如果達(dá)到鬧鈴時(shí)間則鬧鈴響。定時(shí)器0中斷一次需50ms,每隔200ms LCD1602和段碼屏作輪流顯示。外部中斷0作按鍵的處理工作。程序中注釋詳細(xì),這里不再贅述。
筆者用keil uvision4編譯時(shí)會(huì)出現(xiàn) 警 告:“WARNING L15: MULTIPLE CALL TO SEGMENT(意思是發(fā)生了重入)”。原來是液晶屏的兩個(gè)顯示函數(shù)同時(shí)被中斷函數(shù)和主函數(shù)調(diào)用,這樣有可能引起程序沖突,而出現(xiàn)重復(fù)調(diào)用的警告,筆者開始忽略了這個(gè)問題,定時(shí)器初始化后立即開啟中斷,然后主程序調(diào)用LCD1602和HT1621的顯示函數(shù),中斷函數(shù)仍然調(diào)用這兩個(gè)顯示函數(shù),這樣主程序調(diào)用的顯示函數(shù)未執(zhí)行完,定時(shí)器中斷調(diào)用的顯示函數(shù)也發(fā)生了,從而使子函數(shù)調(diào)用發(fā)生沖突,所以導(dǎo)致調(diào)試不正常,因此就亂懷疑,導(dǎo)致DS1302損壞。最后,筆者把代碼改了,主程序的初始化部分在開啟中斷前調(diào)用顯示函數(shù),LCD1602顯示“年、月、W、:”,而段碼屏則完成清屏動(dòng)作,并且要延時(shí)2秒,確保液晶屏的顯示完成,再開啟中斷,讓LCD1602和HT1621分時(shí)顯示,這樣盡管出現(xiàn)了L15的警告代碼,但實(shí)際上是不會(huì)出現(xiàn)沖突的,可以忽略這個(gè)警告,調(diào)試成功。
圖7 覆銅板的元件面
圖8 正常工作中的DS1302時(shí)鐘
圖9 main.c流程圖
(1)線路板的設(shè)計(jì)規(guī)劃、甚至焊接技術(shù)都有待提高。(2)軟件設(shè)計(jì)還可以優(yōu)化,鬧鈴時(shí)間的設(shè)置能夠調(diào)節(jié)就好了。當(dāng)然,還可以設(shè)置多個(gè)鬧鈴。(3)DS1302運(yùn)行還是有誤差的,如果能在軟件上自動(dòng)修正就好了。(4)調(diào)整項(xiàng)在調(diào)整時(shí)能閃爍就好了。(5)如果能給時(shí)鐘做個(gè)外殼就好了。