7-SEGMENT LCD glass, 有做過 library 的請分享


https://goo.gl/5KhEgZ

LCD_glass_AC_drive.jpg
LCD_glass_AC_drive.jpg

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的驅動器的詳細看以下圖片,

LCD_glass_AC_drive.jpg
LCD_glass_AC_drive.jpg

有了AC的驅動器, 就可以慢慢一個一個 PIN – MAPPING 找出來, 用 EXCEL 組成一個表, 以後寫驅動程式或者顯示數字就靠它了. 最好用就是把這些 LCD 做 FREQUENCY COUNTER / ESR METER 等等需要顯示數字的, 每年畢業生都要交 FYP. 或者把報廢的12 DIGIT 計數機的LCD拿來做12位頻率計, 比44780好用和省電, 體積小了, 3.7V電池也可以用小的.

PIN-MAPPING TABLE 找到了, 詳細看圖,

LCD_glass_AC_drive.jpg
LCD_glass_AC_drive.jpg

關於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 的其中一筆畫也顯現出來.
設計的電路圖長這樣,

LCD_glass_AC_drive.jpg
LCD_glass_AC_drive.jpg
LCD_glass_AC_drive.jpg
LCD_glass_AC_drive.jpg

動作片段看起來是這樣,
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_AC_drive.jpg
LCD_glass_AC_drive.jpg
LCD_glass_AC_drive.jpg
LCD_glass_AC_drive.jpg
LCD_glass_AC_drive.jpg
LCD_glass_AC_drive.jpg

動作片斷看起來無特別, 跟一個筆畫的無大分別, 只是多了一點. 那為何電路圖看來複雜了那麼多? 看圖就知道, 因為 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, 示範.

LCD_glass_AC_drive.jpg
LCD_glass_AC_drive.jpg
LCD_glass_AC_drive.jpg
LCD_glass_AC_drive.jpg

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 了

廣告

2 thoughts on “7-SEGMENT LCD glass, 有做過 library 的請分享

  1. X大; 剛剛在雕刻機的搜尋發現你的留言,你的7段lcd 驅動我以前也寫過 stc15f204ea 那是很久以前的事(後來玩 STM8) 我記得好像用 程式模擬XOR的方式去推動… 我最近因為玩雕刻機所以有很多問題… 我的機子是 點膠機改裝的, EZ ROBO3 目前找不到電腦軟體,都使用 程式規劃器來操作!!

    1. A大, 原來在玩新科技, 它就是一個 XY TABLE, Z軸有馬達嗎?
      改來用是很好的, EZ ROBO3 這麼貴, 證明你口袋深呀
      加油

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s