該公司的許多微控制器集成了用于LCD顯示器的控制器,這些控制器在硬件中實(shí)現(xiàn)。DS89C450等微控制器不提供此功能,但可以在軟件中實(shí)現(xiàn)簡(jiǎn)單的顯示控制器。本應(yīng)用筆記介紹如何使用DS7C89超高速閃存微控制器驅(qū)動(dòng)450段數(shù)字的靜態(tài)LCD面板。
概述
液晶顯示器 (LCD) 面板用于各種現(xiàn)代電子設(shè)備,如計(jì)算器、手持式血糖儀、加油站泵和電視機(jī)。由于LCD功耗低,在直射光下易于查看,因此在許多應(yīng)用中取代了舊的LED顯示器。一系列微控制器(如MAXQ2000)集成了LCD控制器,能夠以高達(dá)<>/<>多路復(fù)用占空比驅(qū)動(dòng)LCD面板。但在某些情況下,特定應(yīng)用的理想微控制器可能未集成LCD控制器。對(duì)于這些情況,可以使用微控制器的端口引腳驅(qū)動(dòng)顯示器,從而在軟件中實(shí)現(xiàn)顯示控制器。
本應(yīng)用筆記介紹如何利用DS7C89超高速閃存微控制器為具有450段數(shù)字的簡(jiǎn)單靜態(tài)LCD面板實(shí)現(xiàn)顯示控制器。由于不使用DS89C450特有的特性,因此本示例代碼可以很容易地移植到任何兼容8051的微控制器上,只要該微控制器具有足夠數(shù)量的端口引腳來驅(qū)動(dòng)應(yīng)用中使用的LCD面板。
本應(yīng)用筆記的示例代碼可供下載(ASM)。
選擇液晶面板
為應(yīng)用選擇 LCD 面板時(shí),請(qǐng)注意將 LCD 與兼容的微控制器或 LCD 顯示控制器匹配。做出此決定時(shí)應(yīng)考慮以下問題。
LCD的工作電壓范圍是多少?由于DS89C450是5V微控制器,其端口引腳工作在5V電平,因此必須選擇5V LCD面板。請(qǐng)注意,許多集成LCD控制器的微控制器使用專用電源輸入(VLCD)來設(shè)置該LCD控制器使用的電壓范圍。
LCD的占空比是多少?靜態(tài)的LCD 面板將顯示器中的每個(gè)部分連接到專用驅(qū)動(dòng)線。這意味著段驅(qū)動(dòng)器的數(shù)量必須等于要驅(qū)動(dòng)的LCD段的數(shù)量。復(fù) 用但是,LCD 面板使用每個(gè)段驅(qū)動(dòng)線 (SEG) 驅(qū)動(dòng)多個(gè) LCD 段。這些面板使用多個(gè)公共背板 (COM) 輸出,并根據(jù)所使用的占空比在 SEG 和 COM 線路上的 VLCD 和 GND 之間驅(qū)動(dòng)多個(gè)電平。由于DS89C450(我們的8051微控制器示例)只能將其端口引腳線驅(qū)動(dòng)至5V和GND,因此我們的示例僅限于靜態(tài)LCD。有關(guān)驅(qū)動(dòng)多路復(fù)用LCD的更多信息,請(qǐng)參閱以下文檔:
應(yīng)用筆記 3548 “使用帶有MAXQ微控制器的LCD”"
MAXQ系列用戶指南:MAXQ2000補(bǔ)充?
操作LCD面板需要多少個(gè)段和常用驅(qū)動(dòng)器?控制靜態(tài)LCD面板時(shí),要驅(qū)動(dòng)的每個(gè)段都需要一條驅(qū)動(dòng)線(端口引腳),外加一個(gè)用于公共(COM)背板線的附加端口引腳。
在本應(yīng)用筆記中,選擇了Lumex LCD-S401C52TR顯示器。此 LCD 是一個(gè) 5V 靜態(tài)顯示面板,具有四個(gè) 7 段數(shù)字和三個(gè)報(bào)警器段(一個(gè)冒號(hào)和三個(gè)小數(shù)點(diǎn))。LCD上的每個(gè)數(shù)字都由七個(gè)段組成,如圖1所示,其中A、B、G、E和D段打開以顯示“2”位數(shù)字。
圖1.七段式液晶顯示數(shù)字。
LCD-S401C52TR顯示器具有單個(gè)COM背板(連接到兩個(gè)引腳)和32個(gè)顯示段,每個(gè)段連接到一個(gè)段驅(qū)動(dòng)引腳。在本例中,我們僅使用7段數(shù)字中的89位,這意味著DS450C21需要驅(qū)動(dòng)22條SEG線(三位數(shù)字各有89段)和450條COM線,因此總共需要24個(gè)端口引腳。當(dāng)不在擴(kuò)展存儲(chǔ)器總線配置下工作時(shí),DS0C<>提供<>個(gè)推挽式端口引腳。因此,微控制器具有足夠的 I/O 容量來完成此任務(wù)。(端口 <> 上提供額外的 <> 個(gè)端口引腳。但是,這些引腳是漏極開路的,需要額外的上拉電阻才能用作通用I/O)。
硬件設(shè)置
本例的硬件設(shè)置基于DS89C450評(píng)估(EV)板(Rev B),去掉了存儲(chǔ)器接口CPLD(U5),并移除了兩個(gè)外部存儲(chǔ)器芯片(U6和U7)。此修改釋放了許多額外的端口引腳供我們的應(yīng)用程序使用,否則這些引腳將用于實(shí)現(xiàn)擴(kuò)展的內(nèi)存總線,特別是端口 0(所有八行)、端口 2(所有八行)、端口 3.6 和 3.7。請(qǐng)參閱表 1。(注意:此示例應(yīng)用程序中不使用端口 0。DS89C450包括64kB的內(nèi)部碼空間和1kB的內(nèi)部數(shù)據(jù)SRAM,對(duì)于本例來說已經(jīng)綽綽有余了。
LCD-S401C52TR顯示器上的段和公共線路通過使用與原型區(qū)域相鄰的J89接頭連接到DS450C4上的端口引腳。段線通過1kΩ電阻連接到端口引腳,而不是直接連接到端口引腳。后一步是因?yàn)镈S89C450的端口引腳具有比LCD面板驅(qū)動(dòng)線通常使用的更高的驅(qū)動(dòng)容量(0狀態(tài)為強(qiáng)下拉,1狀態(tài)為單觸發(fā)強(qiáng)上拉,然后為<>狀態(tài)為弱上拉)。由于COM線具有更大的電容,并且需要更強(qiáng)的驅(qū)動(dòng)器,因此它直接連接到其端口引腳。但是,此應(yīng)用不建議段線直接由端口引腳驅(qū)動(dòng)。在這種配置中會(huì)出現(xiàn)一個(gè)問題:隨著越來越多的段打開,段和公共平面之間通過LCD顯示器的電容耦合往往會(huì)將COM線從其預(yù)期狀態(tài)拉開。(發(fā)生此問題的原因是有源段始終與公共平面的電壓相反。因此,應(yīng)該關(guān)閉的段將部分打開。因此,通過電阻連接端口引腳以降低其驅(qū)動(dòng)強(qiáng)度可消除此問題。
DS89C450 端口引腳 | J4 針座引腳 | 液晶屏引腳 | 液晶信號(hào) | 筆記 |
P1.0 | 1 | 21 | 4A | 通過 1kΩ |
P1.1 | 2 | 20 | 4B | 通過 1kΩ |
P1.2 | 3 | 19 | 4C | 通過 1kΩ |
P1.3 | 4 | 18 | 4D | 通過 1kΩ |
P1.4 | 5 | 17 | 4E | 通過 1kΩ |
小1.5 | 6 | 22 | 4F | 通過 1kΩ |
P1.6 | 7 | 23 | 4G | 通過 1kΩ |
P1.7 | 8 | 1, 40 | COM | 直接連接 |
P2.0 | 22 | 25 | 3A | 通過 1kΩ |
P2.1 | 22 | 24 | 3B | 通過 1kΩ |
P2.2 | 23 | 15 | 3C | 通過 1kΩ |
P2.3 | 24 | 14 | 3D | 通過 1kΩ |
P2.4 | 25 | 13 | 3E | 通過 1kΩ |
P2.5 | 26 | 26 | 3F | 通過 1kΩ |
P2.6 | 27 | 27 | 3G | 通過 1kΩ |
P3.0 | 10 | 30 | 2A | 通過 1kΩ |
P3.1 | 11 | 29 | 2B | 通過 1kΩ |
P3.2 | 12 | 11 | 2C | 通過 1kΩ |
P3.3 | 13 | 10 | 2D | 通過 1kΩ |
P3.4 | 14 | 9 | 2E | 通過 1kΩ |
P3.5 | 15 | 31 | 2F | 通過 1kΩ |
P3.6 | 16 | 32 | 2G | 通過 1kΩ |
關(guān)于硬件設(shè)置,還有一些其他事項(xiàng)需要注意:
標(biāo)準(zhǔn)16.384MHz晶體(插入Y1)為DS89C450提供時(shí)鐘。
運(yùn)行應(yīng)用程序時(shí),DIP 開關(guān) SW1.1 和 SW4.2 應(yīng)打開;所有其他設(shè)備都應(yīng)關(guān)閉。
加載應(yīng)用時(shí)(使用MAXQ微控制器工具包(MTK)或其他開發(fā)工具),DIP開關(guān)SW1.1、SW1.2、SW1.3、SW4.1和SW4.2應(yīng)開啟;所有其他設(shè)備都應(yīng)關(guān)閉。
當(dāng) LCD 顯示屏運(yùn)行時(shí),端口 1 的活動(dòng)也將在 LED 條形圖顯示器 U10 上看到。這是正?,F(xiàn)象,并且由于LCD顯示屏是緩沖的,因此不會(huì)影響應(yīng)用程序。
P3.0 和 P3.1 也用于串行端口 0 的 Tx/Rx 線路。因此,當(dāng)應(yīng)用程序加載(使用串行端口引導(dǎo)加載程序)時(shí),由于這些線路上的活動(dòng),LCD上的一個(gè)或兩個(gè)段可能會(huì)閃爍。這是正常的。當(dāng)應(yīng)用程序運(yùn)行時(shí),應(yīng)關(guān)閉DIP開關(guān)SW1.2和SW1.3以禁用串口功能。
LCD 顯示屏上任何未使用的段都應(yīng)顯式驅(qū)動(dòng)到 OFF 狀態(tài),不允許浮動(dòng)。通過將一個(gè)或多個(gè)未使用的段連接到驅(qū)動(dòng)到 OFF 狀態(tài)(與 COM 相同的電壓波形)的端口引腳,或者通過將未使用的段直接連接到 COM 來完成此任務(wù)。
驅(qū)動(dòng) LCD 段
液晶屏段的默認(rèn)狀態(tài)為關(guān)閉(即清除);當(dāng)未施加電壓時(shí),段變?yōu)橥该?,并且在LCD面板中的背景中不可見。此外,當(dāng)對(duì)段線(SEG)和公共背板(COM)施加相同的電壓時(shí),段保持關(guān)閉狀態(tài)。僅當(dāng)該段的SEG引腳與COM平面之間施加電壓差時(shí),該段才會(huì)切換到其ON(即不透明)狀態(tài)。當(dāng)該電壓通過特定電平(稱為閾值電壓)時(shí),該段變暗并最終變得完全不透明。閾值電壓是LCD面板指定工作電壓的百分比,因LCD而異。
壓差的極性對(duì)于驅(qū)動(dòng)LCD段無關(guān)緊要。例如,以 3V 閾值電壓驅(qū)動(dòng) LCD 的控制器可以通過將 COM 設(shè)置為地并將 SEG n 設(shè)置為 3V 或?qū)?COM 設(shè)置為 3V 并將 SEG n 設(shè)置為地來打開段 n。這一事實(shí)很重要,因?yàn)槿绻o態(tài)直流電壓長(zhǎng)時(shí)間留在LCD段上,該段可能會(huì)損壞并且無法再正確切換。為避免此問題,無論段處于ON還是OFF狀態(tài),LCD段始終由交替波形驅(qū)動(dòng),以確保每個(gè)段的總直流電壓始終為零(圖2)。
圖2.靜態(tài)LCD段的交替驅(qū)動(dòng)波形。
如圖2所示,靜態(tài)顯示器上的COM引腳始終由VLCD(我們的設(shè)置為50V)和GND之間的5%占空比方波驅(qū)動(dòng)。然后,每條線段線由兩種模式之一驅(qū)動(dòng)。
要關(guān)閉段,應(yīng)由與用于驅(qū)動(dòng)COM引腳的波形相同的波形驅(qū)動(dòng)。這將確保 SEG/COM 對(duì)上的直流電壓始終為零,這意味著該段將保持關(guān)閉狀態(tài)。
要將段切換到ON,應(yīng)由COM波形的反數(shù)驅(qū)動(dòng)。這意味著該段的一半時(shí)間將由正電壓驅(qū)動(dòng),另一半時(shí)間由負(fù)電壓驅(qū)動(dòng)。這兩種狀態(tài)具有相同的視覺外觀,因此該段似乎一直處于打開狀態(tài)。由于電壓差的平均直流值為零,因此不會(huì)留下可能損壞LCD玻璃的靜態(tài)直流偏置。
驅(qū)動(dòng)LCD的頻率(稱為幀頻率)因LCD面板而異。給定應(yīng)用程序的正確值通常是通過對(duì)特定硬件設(shè)置的試驗(yàn)得出的。由于LCD段改變狀態(tài)的速率受段總電容的限制,因此LCD只能在特定的幀頻率范圍內(nèi)正常工作。通常,此范圍從20Hz到200Hz。本應(yīng)用筆記的示例代碼以大約30Hz的頻率運(yùn)行LCD。對(duì)于特定顯示器而言,幀速率過高或過低都會(huì)導(dǎo)致LCD段閃爍或視覺變暗。
驅(qū)動(dòng)LCD段的示例應(yīng)用的主回路如下所示。
Main: mov IE, #080h ; Disable timer 0 interrupt temporarily mov R2, DigitP1 ; Grab local copies of digit variables mov R3, DigitP2 mov R4, DigitP3 mov IE, #082h ; Re-enable timer 0 interrupt mov A, R2 call getDigit ; Calculate segment pattern for ones digit anl A, #01111111b ; Ensure that COM (P1.7) is driven low mov P1, A mov A, R3 call getDigit ; Calculate segment pattern for tens digit mov P2, A mov A, R4 call getDigit ; Calculate segment pattern for hundreds digit mov P3, A ;;;; Delay loop ;;;; mov R0, #0FFh L1A: mov R1, #0FFh L1B: djnz R1, L1B djnz R0, L1A ;;;;;;;;;;;;;;;;;;;;;; mov A, R2 call getDigit ; Calculate segment pattern for ones digit cpl A ; Inverse of the pattern driven on the first frame half orl A, #10000000b ; Ensure that COM (P1.7) is driven high mov P1, A mov A, R3 call getDigit ; Calculate segment pattern for tens digit cpl A ; Inverse of the pattern driven on the first frame half mov P2, A mov A, R4 call getDigit ; Calculate segment pattern for hundreds digit cpl A ; Inverse of the pattern driven on the first frame half mov P3, A ;;;; Delay loop ;;;; mov R0, #0FFh L2A: mov R1, #0FFh L2B: djnz R1, L2B djnz R0, L2A ;;;;;;;;;;;;;;;;;;;;;; ljmp Main ; Go back for another frame cycle (endless loop)
請(qǐng)注意,COM線(連接到P1.7)始終使用相同的波形驅(qū)動(dòng):幀的前半部分為低電平,后半部分為高電平。對(duì)于線段線,幀前半部分驅(qū)動(dòng)的圖案在后半部分是反轉(zhuǎn)的。三個(gè)數(shù)字中的每一個(gè)都以相同的方式連接到三個(gè)端口中的每一個(gè),因此段 A 始終連接到 Px.0,段 B 始終連接到 Px.1,依此類推。此配置允許示例代碼使用 getDigit 例程計(jì)算三個(gè) LCD 面板數(shù)字中每個(gè)數(shù)字的段模式。
;*************************************************************************** ;* ;* getDigit ;* ;* Returns an LCD segment pattern (in Acc) for the decimal digit (0 to 9) ;* input (also in Acc) ;* getDigit: cjne A, #0, getDigit_not0 ; xgfedcba mov A, #00111111b ; Zero ret getDigit_not0: cjne A, #1, getDigit_not1 ; xgfedcba mov A, #00000110b ; One ret getDigit_not1: cjne A, #2, getDigit_not2 ; xgfedcba mov A, #01011011b ; Two ret getDigit_not2: cjne A, #3, getDigit_not3 ; xgfedcba mov A, #01001111b ; Three ret getDigit_not3: cjne A, #4, getDigit_not4 ; xgfedcba mov A, #01100110b ; Four ret getDigit_not4: cjne A, #5, getDigit_not5 ; xgfedcba mov A, #01101101b ; Five ret getDigit_not5: cjne A, #6, getDigit_not6 ; xgfedcba mov A, #01111101b ; Six ret getDigit_not6: cjne A, #7, getDigit_not7 ; xgfedcba mov A, #00000111b ; Seven ret getDigit_not7: cjne A, #8, getDigit_not8 ; xgfedcba mov A, #01111111b ; Eight ret getDigit_not8: cjne A, #9, getDigit_not9 ; xgfedcba mov A, #01101111b ; Nine ret getDigit_not9: mov A, #0 ret
運(yùn)行計(jì)數(shù)器
示例代碼在LCD上顯示的圖案是一個(gè)3位十進(jìn)制計(jì)數(shù)器,上電時(shí)從000開始,遞增到001、002等,直到達(dá)到999并翻轉(zhuǎn)。由于程序的主循環(huán)驅(qū)動(dòng)LCD段和常見模式,因此我們必須找到另一種方法來定期增加計(jì)數(shù)器值。一種解決方案是使用計(jì)時(shí)器 0 定期觸發(fā)中斷。
mov TMOD, #021h ; Timer 1: 8-bit autoreload from TH1 ; Timer 0: 16-bit mov TCON, #050h ; Enable timers 0 and 1 mov CKMOD, #038h ; Use system clock for all timer inputs mov IE, #082h ; Enable timer 0 interrupt
每次發(fā)生定時(shí)器中斷時(shí),寄存器存儲(chǔ)器中的延遲計(jì)數(shù)器都會(huì)遞減。當(dāng)此延遲計(jì)數(shù)器達(dá)到零時(shí),LCD 3位計(jì)數(shù)器值遞增0(每個(gè)數(shù)字根據(jù)需要滾動(dòng));延遲計(jì)數(shù)器重新初始化為其最大值。由于計(jì)時(shí)器 16 的寬度為 20 位,并且示例代碼將延遲計(jì)數(shù)器設(shè)置為 3,因此 <> 位計(jì)數(shù)器大約每增加一次(1/16.384兆赫) × (216) × 20 = 0.08s,或每秒約 12 次。
org 000Bh ; Timer 0 interrupt ljmp IntTimer0 ;*************************************************************************** ;* ;* IntTimer0 (INTT0) ;* ;* Timer interrupt service routine ;* IntTimer0: push ACC ; Save off accumulator and R0 push R00 mov R0, Count ; Only increment LCD digits every [CountMax] ; interrupt cycles djnz R0, INTT0_Done inc DigitP1 ; Increment ones digit on display mov A, DigitP1 cjne A, #10, INTT0_Continue ; Check for rollover mov DigitP1, #0 inc DigitP2 ; Increment tens digit on display mov A, DigitP2 cjne A, #10, INTT0_Continue ; Check for rollover mov DigitP2, #0 inc DigitP3 ; Increment hundreds digit on display mov A, DigitP3 cjne A, #10, INTT0_Continue ; Check for rollover mov DigitP3, #0 INTT0_Continue: mov R0, CountMax ; Reset to starting cycle count INTT0_Done: mov Count, R0 ; Update cycle counter pop R00 pop ACC ; Restore accumulator and R0 reti
結(jié)論
與微控制器上的許多專用數(shù)字外設(shè)一樣,如有必要,可以在軟件中實(shí)現(xiàn)靜態(tài)或多路復(fù)用LCD顯示控制器。靜態(tài)顯示的簡(jiǎn)單性使此實(shí)現(xiàn)特別簡(jiǎn)單。DS8051C89等450微控制器的標(biāo)準(zhǔn)通用I/O功能可用于驅(qū)動(dòng)LCD上的SEG和COM波形。使用高性能DS89C450可確保即使在軟件中實(shí)現(xiàn)LCD控制器后,也能為大部分應(yīng)用保留足夠的處理能力。
審核編輯:郭婷
-
微控制器
+關(guān)注
關(guān)注
48文章
7396瀏覽量
150633 -
控制器
+關(guān)注
關(guān)注
112文章
16033瀏覽量
176655 -
lcd
+關(guān)注
關(guān)注
34文章
4385瀏覽量
166699
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論