該公司的許多微控制器集成了用于LCD顯示器的控制器,這些控制器在硬件中實現(xiàn)。DS89C450等微控制器不提供此功能,但可以在軟件中實現(xiàn)簡單的顯示控制器。本應用筆記介紹如何使用DS7C89超高速閃存微控制器驅(qū)動450段數(shù)字的靜態(tài)LCD面板。
概述
液晶顯示器 (LCD) 面板用于各種現(xiàn)代電子設備,如計算器、手持式血糖儀、加油站泵和電視機。由于LCD功耗低,在直射光下易于查看,因此在許多應用中取代了舊的LED顯示器。一系列微控制器(如MAXQ2000)集成了LCD控制器,能夠以高達<>/<>多路復用占空比驅(qū)動LCD面板。但在某些情況下,特定應用的理想微控制器可能未集成LCD控制器。對于這些情況,可以使用微控制器的端口引腳驅(qū)動顯示器,從而在軟件中實現(xiàn)顯示控制器。
本應用筆記介紹如何利用DS7C89超高速閃存微控制器為具有450段數(shù)字的簡單靜態(tài)LCD面板實現(xiàn)顯示控制器。由于不使用DS89C450特有的特性,因此本示例代碼可以很容易地移植到任何兼容8051的微控制器上,只要該微控制器具有足夠數(shù)量的端口引腳來驅(qū)動應用中使用的LCD面板。
本應用筆記的示例代碼可供下載(ASM)。
選擇液晶面板
為應用選擇 LCD 面板時,請注意將 LCD 與兼容的微控制器或 LCD 顯示控制器匹配。做出此決定時應考慮以下問題。
LCD的工作電壓范圍是多少?由于DS89C450是5V微控制器,其端口引腳工作在5V電平,因此必須選擇5V LCD面板。請注意,許多集成LCD控制器的微控制器使用專用電源輸入(VLCD)來設置該LCD控制器使用的電壓范圍。
LCD的占空比是多少?靜態(tài)的LCD 面板將顯示器中的每個部分連接到專用驅(qū)動線。這意味著段驅(qū)動器的數(shù)量必須等于要驅(qū)動的LCD段的數(shù)量。復 用但是,LCD 面板使用每個段驅(qū)動線 (SEG) 驅(qū)動多個 LCD 段。這些面板使用多個公共背板 (COM) 輸出,并根據(jù)所使用的占空比在 SEG 和 COM 線路上的 VLCD 和 GND 之間驅(qū)動多個電平。由于DS89C450(我們的8051微控制器示例)只能將其端口引腳線驅(qū)動至5V和GND,因此我們的示例僅限于靜態(tài)LCD。有關驅(qū)動多路復用LCD的更多信息,請參閱以下文檔:
應用筆記 3548 “使用帶有MAXQ微控制器的LCD”"
MAXQ系列用戶指南:MAXQ2000補充?
操作LCD面板需要多少個段和常用驅(qū)動器?控制靜態(tài)LCD面板時,要驅(qū)動的每個段都需要一條驅(qū)動線(端口引腳),外加一個用于公共(COM)背板線的附加端口引腳。
在本應用筆記中,選擇了Lumex LCD-S401C52TR顯示器。此 LCD 是一個 5V 靜態(tài)顯示面板,具有四個 7 段數(shù)字和三個報警器段(一個冒號和三個小數(shù)點)。LCD上的每個數(shù)字都由七個段組成,如圖1所示,其中A、B、G、E和D段打開以顯示“2”位數(shù)字。
圖1.七段式液晶顯示數(shù)字。
LCD-S401C52TR顯示器具有單個COM背板(連接到兩個引腳)和32個顯示段,每個段連接到一個段驅(qū)動引腳。在本例中,我們僅使用7段數(shù)字中的89位,這意味著DS450C21需要驅(qū)動22條SEG線(三位數(shù)字各有89段)和450條COM線,因此總共需要24個端口引腳。當不在擴展存儲器總線配置下工作時,DS0C<>提供<>個推挽式端口引腳。因此,微控制器具有足夠的 I/O 容量來完成此任務。(端口 <> 上提供額外的 <> 個端口引腳。但是,這些引腳是漏極開路的,需要額外的上拉電阻才能用作通用I/O)。
硬件設置
本例的硬件設置基于DS89C450評估(EV)板(Rev B),去掉了存儲器接口CPLD(U5),并移除了兩個外部存儲器芯片(U6和U7)。此修改釋放了許多額外的端口引腳供我們的應用程序使用,否則這些引腳將用于實現(xiàn)擴展的內(nèi)存總線,特別是端口 0(所有八行)、端口 2(所有八行)、端口 3.6 和 3.7。請參閱表 1。(注意:此示例應用程序中不使用端口 0。DS89C450包括64kB的內(nèi)部碼空間和1kB的內(nèi)部數(shù)據(jù)SRAM,對于本例來說已經(jīng)綽綽有余了。
LCD-S401C52TR顯示器上的段和公共線路通過使用與原型區(qū)域相鄰的J89接頭連接到DS450C4上的端口引腳。段線通過1kΩ電阻連接到端口引腳,而不是直接連接到端口引腳。后一步是因為DS89C450的端口引腳具有比LCD面板驅(qū)動線通常使用的更高的驅(qū)動容量(0狀態(tài)為強下拉,1狀態(tài)為單觸發(fā)強上拉,然后為<>狀態(tài)為弱上拉)。由于COM線具有更大的電容,并且需要更強的驅(qū)動器,因此它直接連接到其端口引腳。但是,此應用不建議段線直接由端口引腳驅(qū)動。在這種配置中會出現(xiàn)一個問題:隨著越來越多的段打開,段和公共平面之間通過LCD顯示器的電容耦合往往會將COM線從其預期狀態(tài)拉開。(發(fā)生此問題的原因是有源段始終與公共平面的電壓相反。因此,應該關閉的段將部分打開。因此,通過電阻連接端口引腳以降低其驅(qū)動強度可消除此問題。
DS89C450 端口引腳 | J4 針座引腳 | 液晶屏引腳 | 液晶信號 | 筆記 |
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Ω |
關于硬件設置,還有一些其他事項需要注意:
標準16.384MHz晶體(插入Y1)為DS89C450提供時鐘。
運行應用程序時,DIP 開關 SW1.1 和 SW4.2 應打開;所有其他設備都應關閉。
加載應用時(使用MAXQ微控制器工具包(MTK)或其他開發(fā)工具),DIP開關SW1.1、SW1.2、SW1.3、SW4.1和SW4.2應開啟;所有其他設備都應關閉。
當 LCD 顯示屏運行時,端口 1 的活動也將在 LED 條形圖顯示器 U10 上看到。這是正常現(xiàn)象,并且由于LCD顯示屏是緩沖的,因此不會影響應用程序。
P3.0 和 P3.1 也用于串行端口 0 的 Tx/Rx 線路。因此,當應用程序加載(使用串行端口引導加載程序)時,由于這些線路上的活動,LCD上的一個或兩個段可能會閃爍。這是正常的。當應用程序運行時,應關閉DIP開關SW1.2和SW1.3以禁用串口功能。
LCD 顯示屏上任何未使用的段都應顯式驅(qū)動到 OFF 狀態(tài),不允許浮動。通過將一個或多個未使用的段連接到驅(qū)動到 OFF 狀態(tài)(與 COM 相同的電壓波形)的端口引腳,或者通過將未使用的段直接連接到 COM 來完成此任務。
驅(qū)動 LCD 段
液晶屏段的默認狀態(tài)為關閉(即清除);當未施加電壓時,段變?yōu)橥该鳎⑶以贚CD面板中的背景中不可見。此外,當對段線(SEG)和公共背板(COM)施加相同的電壓時,段保持關閉狀態(tài)。僅當該段的SEG引腳與COM平面之間施加電壓差時,該段才會切換到其ON(即不透明)狀態(tài)。當該電壓通過特定電平(稱為閾值電壓)時,該段變暗并最終變得完全不透明。閾值電壓是LCD面板指定工作電壓的百分比,因LCD而異。
壓差的極性對于驅(qū)動LCD段無關緊要。例如,以 3V 閾值電壓驅(qū)動 LCD 的控制器可以通過將 COM 設置為地并將 SEG n 設置為 3V 或?qū)?COM 設置為 3V 并將 SEG n 設置為地來打開段 n。這一事實很重要,因為如果靜態(tài)直流電壓長時間留在LCD段上,該段可能會損壞并且無法再正確切換。為避免此問題,無論段處于ON還是OFF狀態(tài),LCD段始終由交替波形驅(qū)動,以確保每個段的總直流電壓始終為零(圖2)。
圖2.靜態(tài)LCD段的交替驅(qū)動波形。
如圖2所示,靜態(tài)顯示器上的COM引腳始終由VLCD(我們的設置為50V)和GND之間的5%占空比方波驅(qū)動。然后,每條線段線由兩種模式之一驅(qū)動。
要關閉段,應由與用于驅(qū)動COM引腳的波形相同的波形驅(qū)動。這將確保 SEG/COM 對上的直流電壓始終為零,這意味著該段將保持關閉狀態(tài)。
要將段切換到ON,應由COM波形的反數(shù)驅(qū)動。這意味著該段的一半時間將由正電壓驅(qū)動,另一半時間由負電壓驅(qū)動。這兩種狀態(tài)具有相同的視覺外觀,因此該段似乎一直處于打開狀態(tài)。由于電壓差的平均直流值為零,因此不會留下可能損壞LCD玻璃的靜態(tài)直流偏置。
驅(qū)動LCD的頻率(稱為幀頻率)因LCD面板而異。給定應用程序的正確值通常是通過對特定硬件設置的試驗得出的。由于LCD段改變狀態(tài)的速率受段總電容的限制,因此LCD只能在特定的幀頻率范圍內(nèi)正常工作。通常,此范圍從20Hz到200Hz。本應用筆記的示例代碼以大約30Hz的頻率運行LCD。對于特定顯示器而言,幀速率過高或過低都會導致LCD段閃爍或視覺變暗。
驅(qū)動LCD段的示例應用的主回路如下所示。
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)
請注意,COM線(連接到P1.7)始終使用相同的波形驅(qū)動:幀的前半部分為低電平,后半部分為高電平。對于線段線,幀前半部分驅(qū)動的圖案在后半部分是反轉(zhuǎn)的。三個數(shù)字中的每一個都以相同的方式連接到三個端口中的每一個,因此段 A 始終連接到 Px.0,段 B 始終連接到 Px.1,依此類推。此配置允許示例代碼使用 getDigit 例程計算三個 LCD 面板數(shù)字中每個數(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
運行計數(shù)器
示例代碼在LCD上顯示的圖案是一個3位十進制計數(shù)器,上電時從000開始,遞增到001、002等,直到達到999并翻轉(zhuǎn)。由于程序的主循環(huán)驅(qū)動LCD段和常見模式,因此我們必須找到另一種方法來定期增加計數(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ù)器達到零時,LCD 3位計數(shù)器值遞增0(每個數(shù)字根據(jù)需要滾動);延遲計數(shù)器重新初始化為其最大值。由于計時器 16 的寬度為 20 位,并且示例代碼將延遲計數(shù)器設置為 3,因此 <> 位計數(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ù)字外設一樣,如有必要,可以在軟件中實現(xiàn)靜態(tài)或多路復用LCD顯示控制器。靜態(tài)顯示的簡單性使此實現(xiàn)特別簡單。DS8051C89等450微控制器的標準通用I/O功能可用于驅(qū)動LCD上的SEG和COM波形。使用高性能DS89C450可確保即使在軟件中實現(xiàn)LCD控制器后,也能為大部分應用保留足夠的處理能力。
審核編輯:郭婷
-
微控制器
+關注
關注
48文章
7908瀏覽量
153722 -
控制器
+關注
關注
114文章
16973瀏覽量
182986 -
lcd
+關注
關注
34文章
4504瀏覽量
170757
發(fā)布評論請先 登錄
DS89C450單片機下載器制作的疑問
請問DS89C450有內(nèi)置ad轉(zhuǎn)換嗎 如果有 在哪個口
DS89C450問題。
DS89C430, DS89C440, DS89C450中文
DS89C430-DS89C450.pdf
DS89C430/S89C450 pdf datasheet
從高速微控制器系列向超高速閃存微控制器的升級
使用DS89C450作為靜態(tài)LCD顯示屏控制器

DS89C450-ENL+ DS89C450-ENL+ - (Maxim Integrated) - 嵌入式 - 微控制器

DS89C450-QNL+ DS89C450-QNL+ - (Maxim Integrated) - 嵌入式 - 微控制器

DS89C450-MNG+ DS89C450-MNG+ - (Maxim Integrated) - 嵌入式 - 微控制器

DS89C450-ENG+ DS89C450-ENG+ - (Maxim Integrated) - 嵌入式 - 微控制器

超高速閃存微控制器軟件SPI

將Keil μVision調(diào)試器與DS89C4x0配合使用

DS89C430/DS89C450超高速閃存微控制器存儲器接口時序

評論