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