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