|
  
|
[操作疑難] 7-SEGMENT LCD glass, 有做過 library 的請分享
本帖最後由 xiao 於 2015-8-25 21:36 編輯
7劃管的, 8字, LCD 玻璃
請問有 C library 可以分享好抄來改改嗎
AVR 或者 8051 的都可以
當然, 不會白問白要的
如果要用到 LCD 玻璃, 當然買到有 DATASHEET 的就最好
萬一沒有, 也可以自行反推出來
公開一下俺的做法, 高手或者行業的專家不要砸磚塊
要DIY或者手邊有多餘的LCD玻璃, 也可以用這個方法應用在DIY 的 PROJECT 上
當然, 用 7-SEGMENT LED 就最簡單, 不過比LCD來說就耗電耗很大大
方法如下,
拿到一片不知名的 7-SEGMENT LCD GLASS 以後,
自己組一個AC的驅動器, 輸出電壓可調, 電流可以是 0.001mA, 你沒看錯, 沒錯, 是milli-Ampere, 不是 Ampere, 基本LCD玻璃不需要電流, 所以跳字手表才會那麼省電. 輸出電壓可調大約 2VAC 到 5VAC, 要全部筆畫顯示, 用高點的電壓, 要找出筆畫的 MAPPING, 大約2.5VAC. 得到這個AC電壓的方法很多, 其中一種是隨便一個小的變壓器輸入110VAC或220VAC, 看當地電力公司的電壓, 變壓器12VAC輸出, 搭配 VR 和 電阻, 就可以得到2VAC 到 5VAC, 記得, 要用交流電驅動LCD玻璃, 用直流電也可以, 短時間還好, 長時間就會像喇叭被消磁一樣, LCD會死的. AC的驅動器的詳細看以下圖片,
有了AC的驅動器, 就可以慢慢一個一個 PIN - MAPPING 找出來, 用 EXCEL 組成一個表, 以後寫驅動程式或者顯示數字就靠它了. 最好用就是把這些 LCD 做 FREQUENCY COUNTER / ESR METER 等等需要顯示數字的, 每年畢業生都要交 FYP. 或者把報廢的12 DIGIT 計數機的LCD拿來做12位頻率計, 比44780好用和省電, 體積小了, 3.7V電池也可以用小的.
PIN-MAPPING TABLE 找到了, 詳細看圖,
關於MCU IO 直接驅動 LCD GLASS, 有很多文獻有講解原理, 這是其一, 或者寫的不太好, 不過能夠看明白的.
http://cache.freescale.com/files ... app_note/AN1763.pdf
為了更好的理解 LCD 是怎樣被驅動和顯示數字的, 先來學習一下原理. LCD 的每個筆畫 (或者每個像素), 有兩個透明的電極, 中間填入液晶 (TN), 構成了一個電容, 這個電容有點特別, 它可以被人的眼睛看見它動作的過程, 每次對它充電或放電, 它就會把光線隔斷, 因此被看見了. 為了方便試驗, 用了8051模擬器, 使用PORT1, 短名字稱為P1, 任何兩支腳, 例如 P1.0 和 P1.1 兩支腳, 產生5VAC, 使LCD其中的一筆畫顯現了. 如果沒有MCU, 其實手動開關一樣有這樣的效果.
至於產生5V AC的程序很簡單, 首先把P1設定成10101010, 過一陣子, P1設定成01010101, 再過一陣子, 重複前面的動作, 不會停止直到沒電. 使用兩個 LED 連到 P1.0 和 P1.1, 就會看到藍色和白色LED輪流閃爍, 這樣就是5V AC的表現, LCD 的其中一筆畫也顯現出來.
設計的電路圖長這樣,
動作片段看起來是這樣,
https://youtu.be/67vTWbES_I4
8051的源碼和燒寫文件, 89S51 / 89C51 / 89C2051 可以燒.-
- ;source code
- ;Free assembler download : https://www.pjrc.com/tech/8051/tools/as31_beta3_win32.zip
- ;win7, 64bit, tested
- .org 0000h ;for 8051
- ;.org 1000h ;for 89C51_NoICE, user area
- mov P1, #10101010B ;send 10101010 to Port 1
- loop:
- xrl P1, #0FFH ;toggle all bits, i.e. P1 = 01010101
- mov A, #30 ; more delay, slow LED blinking, easy to visual
- more:
- acall delay ; call delay procedure
- dec A
- jnz more
-
- sjmp loop ; make this operation to run repeatedly
-
- delay:
- ; entry : N/A
- ; exit : N/A
- ; changed : R0, R1
- mov R1,#010h ; initialize the R1 register with an immediate value 10h = 16d
- mov R0,#0FFh ; load R0 with FFh value to repeat the loop for 256 times
- back:
- DJNZ R0, back ;internal loop repeates 256 times
- DJNZ R1,back ;external loop repeates 16 times
- RET
- HEX file :
- :100000007590AA6390FF741E110F1470FB80F47931
- :080010001078FFD8FED9FC2294
- :00000001FF
複製代碼 ..
美術或者商家, 都很喜歡用一套詞語或說法, 先建立一個點, 然後再建立另外一個點, 把它連成線, 再繼續連更多的線, 構成一個面.
有了顯示一個點 (8字LCD的單一個筆畫), 那下一步要試驗顯示兩個點或更多. 到底怎樣做呢 ? 很簡單, 同時加電到其他電極就好了. 實際上, 要顯示有意義的數目或文字, 還沒到時候, 或者火候不夠, 怎樣說呢 ?!
先來看看, 7-SEGMENT 的筆畫排列和提供電力的位置, 如果要顯示一個8字或日字, 那7個筆畫的電容(名稱和排列稱為 a,b,c,d,e,f)都要給它充電放電 (方法前面已經實驗過了), 沒有難度. 但是問題來了, 如過要顯現一個7字, 筆畫 a,b,c 都要動起來, 但是會意外的看到旁邊的那個小數點也不由自主的出現, 再來會有更多的例子, 如過要顯示其它數字. 所以, 先做個實驗, 看看同時顯示兩筆畫, 會是怎樣的情形. 以下的實驗, 純粹驅動 COM1 和 SEG1 / SEG2, 理論上會顯示筆畫 d 和小數點. 實際上也做到了. MCU 程序也是很簡單, COM1設成5V, SEG1 和 SEG2 設成0V, 兩個電容被充電, 過一陣子, 把它們翻轉過來, COM1設成0V, SEG1 和 SEG2 設成5V (記得前面研討過的交流供電方式).
設計的電路圖長這樣,
動作片斷看起來無特別, 跟一個筆畫的無大分別, 只是多了一點. 那為何電路圖看來複雜了那麼多? 看圖就知道, 因為 LCD GLASS 不喜歡太高的電壓 (例如5V), 所以要適當給它降低到2.5V, 另外這個使用中 8051的除錯器是低成本的工具加玩具, 方便設計實驗, 只留PORT1 / PORT3給使用, P0/P2用做SRAM的接口, 它唯一的好處是不用燒寫MCU, LOAD就可以把HEX裝到SRAM開始執行, 並且可以由USB連到電腦一步一步看到CPU執行程序. 另外8051的設計, P1.0沒有輸入HI-Z, 而且8051 I/O PORT的設計也有別於其他MCU (有人寫了原因, 不熬述, [url]http://www.edsim51.com/8051Notes/8051/parallelInputOuput.html[/url])
那, 要顯示有意義的數字或字母, 必須用人家施行的方法, 每個筆畫顯示一下, 然後輪到下一個筆畫, 逐個筆畫做一次, 直至完成8個點, 這樣做就由[點] 演變成 [面] 的顯示 (或許可叫做Scanning charging, 因LCD每個筆畫(像素)是一個電容), 提供了更多的人易於理解的資訊, 只要設計適當, 人的眼睛的動態緩慢反應的現象 (視覺暫留 VISUAL PERSISTENCE) 和電容儲電的總體效果會造成眼睛看到一個完整數字或字母 (人的腦袋和眼睛其實不太聰明, 很容易被騙了). 片斷的顯示, 是設計不做完美的現象, 看到它在閃爍或不完全. 不過, 這個是Scanning charging的具體表現, 具體的程序也是很簡單, 口語化如下,
COM1設成5V, SEG1 和 SEG2 設成0V, 過一陣子, COM1設成0V, SEG1 和 SEG2 設成5V, 過一陣子
COM2設成5V, SEG1 和 SEG2 設成0V, 過一陣子, COM2設成0V, SEG1 和 SEG2 設成5V, 過一陣子
COM3設成5V, SEG1 和 SEG2 設成0V, 過一陣子, COM3設成0V, SEG1 和 SEG2 設成5V, 過一陣子
COM4設成5V, SEG1 和 SEG2 設成0V, 過一陣子, COM4設成0V, SEG1 和 SEG2 設成5V, 過一陣子
重複以上動作.
動作片段看起來是這樣,
https://youtu.be/59LZabw_-_k
8051的源碼和燒寫文件, 89S51 / 89C51 / 89C2051 可以燒.- ;; MCU 12MHZ, 89S51 ICE Monitor, USB connection
- ;; Load HEX to MCU, command, l
- ;; Run user program, command, g
- ;; .org must be set to 1000h for debug mode
- ;; .org set to 0000h for release
- ;external voltage divider port 1, port1 used to drive com & seg lines, a,b,c,d,e,f,g,dot of seven-segment LCD glass
- ; P1.0 com1
- ; P1.1 com2
- ; P1.2 com3
- ; P1.3 com4
- ; P1.4 seg1
- ; P1.5 seg2
- .equ com1, 0x01
- .equ com2, 0x02
- .equ com3, 0x04
- .equ com4, 0x08
- .equ seg1, 0x10
- .equ seg2, 0x20
- .org 0000h ;for 8051
- ;.org 1000h ;for 89C51_NoICE, user area
-
- nop
- nop
- mov P1,#00h ;initialize the Port1, all output
- start:
- com1go: mov A, #com1
- mov P1, A
- acall delay4 ; call delay procedure
- mov A, #com1
- CPL A ;not Acc ;invert
- mov P1, A
- acall delay4 ; call delay procedure
- ; sjmp start ; make this operation to run repeatedly
- com2go: mov A, #com2
- mov P1, A
- acall delay4 ; call delay procedure
- mov A, #com2
- CPL A ;not Acc
- mov P1, A
- acall delay4 ; call delay procedure
- com3go: mov A, #com3
- mov P1, A
- acall delay4 ; call delay procedure
- mov A, #com3
- CPL A ;not Acc
- mov P1, A
- acall delay4 ; call delay procedure
- com4go: mov A, #com4
- mov P1, A
- acall delay4 ; call delay procedure
- mov A, #com4
- CPL A ;not Acc
- mov P1, A
- acall delay4 ; call delay procedure
-
- sjmp start ; make this operation to run repeatedly
- delay:
- ; entry : N/A
- ; exit : N/A
- ; changed : R0, R1
- mov R1,#010h ; initialize the R1 register with an immediate value 10h = 16d
- mov R0,#0FFh ; load R0 with FFh value to repeat the loop for 256 times
- back:
- DJNZ R0, back ;internal loop repeates 256 times
- DJNZ R1,back ;external loop repeates 16 times
- RET
- delay2:
- acall delay ; call delay procedure
- acall delay ; call delay procedure
- ret
- delay3:
- acall delay ; call delay procedure
- acall delay ; call delay procedure
- acall delay ; call delay procedure
- ret
- delay4:
- acall delay ; call delay procedure
- acall delay ; call delay procedure
- acall delay ; call delay procedure
- acall delay ; call delay procedure
- ret
- delay5:
- acall delay ; call delay procedure
- acall delay ; call delay procedure
- acall delay ; call delay procedure
- acall delay ; call delay procedure
- acall delay ; call delay procedure
- ret
- ; uses A31 assembler, comment out below
- ;END
- HEX file :
- :1000000000007590007401F59011717401F4F59081
- :1000100011717402F59011717402F4F590117174FC
- :1000200004F59011717404F4F59011717408F59051
- :1000300011717408F4F590117180CA7590AA6390DB
- :10004000FF741E115C1470FB80F43F065B4F666DFD
- :100050007D077F6F777C395E79714000791078FF7A
- :10006000D8FED9FC22115C115C22115C115C115C80
- :1000700022115C115C115C115C22115C115C115C41
- :05008000115C115C227F
- :00000001FF
複製代碼 ..
既然 80C51的 PORT1 不提供高阻抗 HI-Z 的輸入模式, 因此不能拿來用作最終的試驗. 因此換了一下, 用手邊有的, 例如ATMEGA328P, 因為他的PORT-D 的每只腳可以設定成3個狀態, 分別是
1) 輸入 (HI-Z)
2) 輸出 (HIGH)
3) 輸出 (LOW)
如果用3V電池供電, 用電阻分壓, 接到每只腳, 再加以MCU的程序控制, 每只腳則可得到 0V, 1.5V 及 3V 三種電壓
這樣就可以完成試驗了, 因此也順利顯示了兩組字符, 分別為 70 和 EF, 示範.
https://youtu.be/_FCZ6nxlt9I
AVR的源碼和燒寫文件, ATMEGA328P 可以燒.- /*
- xiaoalab
- LCD glass driver testing
- MCU : ATmega328p
- PORTD used for LCD glass interface
- Vcc : 3V, must be
- compiler : arduino 0022
- */
- // port D, 8 bit, bit7 to bit0, connects to LCD glass, pin out
- #define com1 0x01
- #define com2 0x02
- #define com3 0x04
- #define com4 0x08
- #define seg1a 0x10 //1st digit, seg-a
- #define seg1b 0x20 //1st digit, seg-b
- #define seg2a 0x40 //2nd digit, seg-a
- #define seg2b 0x80 //2nd digit, seg-b
- #define delay_const 4
- void setup() {
- // initialize the digital pin as an output.
- // Pin 13 has an LED connected on most Arduino boards:
- pinMode(13, OUTPUT);
- DDRD = 0; // port D, all bit, input mode
- PORTD = 0; // write 0x00 to port D while it is in input mode, disable all pull up
- }
- void loop() {
- PINB = bit (5); // toggle D13
-
- showEF(); //LCD glass will display EF, two digits
- showEF();
- showEF();
- showEF();
- showEF();
- showEF();
- showEF();
- showEF();
- show70(); ////LCD glass will display 70, two digits
- show70();
- show70();
- show70();
- show70();
- show70();
- show70();
- show70();
- }
- void showEF ()
- {
- DDRD = com1 + seg1a + seg1b + seg2a + seg2b; // output pin setup, com1= 0v, com2,com3,com4 input mode, 1.5V
- PORTD = seg1a;
- delay(delay_const);
- PORTD ^= com1 + seg1a + seg1b + seg2a + seg2b; //toggle output pins, produces AC to drive LCD comX-segX
- delay(delay_const);
-
- DDRD = com2 + seg1a + seg1b + seg2a + seg2b; // output pin setup, com2= 0v, com1,com3,com4 input mode, 1.5V
- PORTD = seg1a + seg2a;
- delay(delay_const);
- PORTD ^= com2 + seg1a + seg1b + seg2a + seg2b;
- delay(delay_const);
- DDRD = com3 + seg1a + seg1b + seg2a + seg2b; // output pin setup, com3= 0v, com1,com2,com4 input mode, 1.5V
- PORTD = seg1a + seg2a;
- delay(delay_const);
- PORTD ^= com3 + seg1a + seg1b + seg2a + seg2b;
- delay(delay_const);
- DDRD = com4 + seg1a + seg1b + seg2a + seg2b; // output pin setup, com4= 0v, com1,com2,com3 input mode, 1.5V
- PORTD = seg1a + seg1b + seg2a + seg2b;
- delay(delay_const);
- PORTD ^= com4 + seg1a + seg1b + seg2a + seg2b;
- delay(delay_const);
- }
- void show70 ()
- {
- DDRD = com1 + seg1a + seg1b + seg2a + seg2b;
- PORTD = seg2a;
- delay(delay_const);
- PORTD ^= com1 + seg1a + seg1b + seg2a + seg2b;
- delay(delay_const);
-
- DDRD = com2 + seg1a + seg1b + seg2a + seg2b;
- PORTD = seg1b + seg2a + seg2b;
- delay(delay_const);
- PORTD ^= com2 + seg1a + seg1b + seg2a + seg2b;
- delay(delay_const);
- DDRD = com3 + seg1a + seg1b + seg2a + seg2b;
- PORTD = seg1b + seg2b;
- delay(delay_const);
- PORTD ^= com3 + seg1a + seg1b + seg2a + seg2b;
- delay(delay_const);
- DDRD = com4 + seg1a + seg1b + seg2a + seg2b;
- PORTD = seg1b + seg2a + seg2b;
- delay(delay_const);
- PORTD ^= com4 + seg1a + seg1b + seg2a + seg2b;
- delay(delay_const);
- }
- // end of program, source code
- HEX
- :100000000C9461000C947E000C947E000C947E0095
- :100010000C947E000C947E000C947E000C947E0068
- :100020000C947E000C947E000C947E000C947E0058
- :100030000C947E000C947E000C947E000C947E0048
- :100040000C944A010C947E000C947E000C947E006B
- :100050000C947E000C947E000C947E000C947E0028
- :100060000C947E000C947E00000000002400270009
- :100070002A0000000000250028002B0000000000DE
- :1000800023002600290004040404040404040202DA
- :100090000202020203030303030301020408102007
- :1000A0004080010204081020010204081020000012
- :1000B0000007000201000003040600000000000029
- :1000C000000011241FBECFEFD8E0DEBFCDBF11E08E
- :1000D000A0E0B1E0EAEAF4E002C005900D92A030A1
- :1000E000B107D9F711E0A0E0B1E001C01D92A9303D
- :1000F000B107E1F70E944C020C9453020C940000EB
- :100100000F931F9311EF1AB980E48BB964E070E08C
- :1001100080E090E00E9492018BB181278BB964E06E
- :1001200070E080E090E00E94920112EF1AB900EEB8
- :100130000BB964E070E080E090E00E9492018BB126
- :1001400081278BB964E070E080E090E00E9492012A
- :1001500014EF1AB980EA8BB964E070E080E090E0B7
- :100160000E9492018BB181278BB964E070E080E03E
- :1001700090E00E94920118EF1AB90BB964E070E0A8
- :1001800080E090E00E9492018BB181278BB964E0FE
- :1001900070E080E090E00E9492011F910F9108951D
- :1001A0000F931F9311EF1AB980E18BB964E070E0EF
- :1001B00080E090E00E9492018BB181278BB964E0CE
- :1001C00070E080E090E00E94920112EF1AB900E521
- :1001D0000BB964E070E080E090E00E9492018BB186
- :1001E00081278BB964E070E080E090E00E9492018A
- :1001F00014EF1AB90BB964E070E080E090E00E945F
- :1002000092018BB181278BB964E070E080E090E0CF
- :100210000E94920118EF1AB980EF8BB964E070E088
- :1002200080E090E00E9492018BB181278BB964E05D
- :1002300070E080E090E00E9492011F910F9108957C
- :1002400080E283B90E94D0000E94D0000E94D000BA
- :100250000E94D0000E94D0000E94D0000E94D000D6
- :100260000E94D0000E9480000E9480000E948000B6
- :100270000E9480000E9480000E9480000E948000F6
- :100280000E94800008958DE061E00E9426021AB865
- :100290001BB808951F920F920FB60F9211242F933F
- :1002A0003F938F939F93AF93BF938091040190915D
- :1002B0000501A0910601B091070130910801019656
- :1002C000A11DB11D232F2D5F2D3720F02D57019635
- :1002D000A11DB11D20930801809304019093050195
- :1002E000A0930601B0930701809100019091010154
- :1002F000A0910201B09103010196A11DB11D80934F
- :10030000000190930101A0930201B0930301BF91FA
- :10031000AF919F918F913F912F910F900FBE0F90B2
- :100320001F9018959B01AC017FB7F8948091000154
- :1003300090910101A0910201B091030166B5A89BC3
- :1003400005C06F3F19F00196A11DB11D7FBFBA2FE7
- :10035000A92F982F8827860F911DA11DB11D62E03E
- :10036000880F991FAA1FBB1F6A95D1F7BC012DC02A
- :10037000FFB7F8948091000190910101A0910201D2
- :10038000B0910301E6B5A89B05C0EF3F19F00196B7
- :10039000A11DB11DFFBFBA2FA92F982F88278E0F3F
- :1003A000911DA11DB11DE2E0880F991FAA1FBB1F5F
- :1003B000EA95D1F7861B970B885E9340C8F22150CF
- :1003C00030404040504068517C4F21153105410577
- :1003D000510571F60895789484B5826084BD84B522
- :1003E000816084BD85B5826085BD85B5816085BD30
- :1003F000EEE6F0E0808181608083E1E8F0E0108249
- :10040000808182608083808181608083E0E8F0E089
- :10041000808181608083E1EBF0E080818460808373
- :10042000E0EBF0E0808181608083EAE7F0E08081AA
- :10043000846080838081826080838081816080830A
- :100440008081806880831092C1000895482F50E019
- :10045000CA0186569F4FFC0124914A575F4FFA010B
- :1004600084918823C1F0E82FF0E0EE0FFF1FE859D8
- :10047000FF4FA591B491662341F49FB7F8948C91F6
- :10048000209582238C939FBF08959FB7F8948C91F9
- :10049000822B8C939FBF08950E94EB010E94430121
- :0A04A0000E942001FDCFF894FFCF69
- :00000001FF
複製代碼 話說到這裡, 等待高手提供 C library 了
...
.. |
|
|
|