想必每個初出茅廬的程式小菜鳥們都很頭疼這個那個晶片的功能,不同型別的液晶有自己的驅動方式,每每碰到這種情況,感覺腦袋都變大了好幾倍!不要著急,慢慢來,畢竟身為菜鳥的我們還是得一步一步的學習,成為大神的路是要一步一步腳踏實地的走下去!下面,就讓本菜鳥給大家分析一下我點亮的段式液晶吧!
方法/步驟
段式液晶雖然跟數碼管有所不同,但也有相同的地方,其七段分別為a,b,c,d,e,f,g 想要顯示資料,就必須點亮相應的段。下面將通用的0~9的設定值為大家解釋一下
const uint16_t NumberMap[10]=
{
/***
*顯示0
com1 com2 com3 com4
*seg3 [ 1d, 1e, 1f, 1a]
*seg4 [ 1c, 1g ,1b , P5]
*seg3 [ 1, 1, 1, 1]
*seg4 [ 1, 0 ,1 , 1]
*
**/
/* 0 1 2 3 4 5 6 7 8 9 */
0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6
};
通過圖中的這張表,就可以清楚的明白,0~9是如何得到的!這個是通用的,只要大家靜下心來好好想想,就會明白,為什麼上面程式碼會是那樣的!(大神請靜靜地飄過吧,讓菜鳥們普及一下基礎知識!誰讓本菜鳥就這麼菜呢!)
對於每一個LCD段式液晶屏,都有屬於自己的一張表,它會告訴你com與seg之間的對應關係(雖然剛開始看到這幅圖的我,根本無法理解,這究竟是何方神聖、、因為它看起來可以沒有規律,看起來也挺有規律,但究竟是沒看懂,後來的某個瞬間,突然發現,原來so easy!)先來看看我用的這個吧!
為了方便大家理解,我分幾部分解釋!
① 看到圖的第一眼,大家當然可以知道總共有8個7段數碼管(貌似不是這麼叫,大家將就一下)。
② 有13組漢字詞語,其上還有相應的標號:P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 P11 P12P 13,想必這些片語的顯示設定就需要這些相應的標號來設定了。
③ 中間有2條橫槓,還有個標號X,估計同理如上
下面我就教大家,如何利用上面的這張表,來寫出相應的段式液晶暫存器快取地址表!首先看看LCD緩衝暫存器,只要把你要顯示的資料寫入暫存器就OK了。首先,當然是要找到pin腳對應的seg標號,然後對應到STM8L152C6T6中找到相對應的seg標號。
例如:pin4 pin5 對應的STM8L152C6T6中的seg標號為seg3,seg4,則如圖所示,就可以得到對應的a~g的緩衝地址位置!
1a>s3[seg3]
1b>s2[seg4]
、、、、、、同理可得到其餘的結果。
接下里就可以把地址寫進去了!接下來就是寫程式碼了:
LCD->RAM[LCD_RAMRegister_10] &= (~0x80);
LCD->RAM[LCD_RAMRegister_10] =((NumberMap[user_num/10]) &0x80);// 1A
LCD->RAM[LCD_RAMRegister_7] &= (~0x10);
LCD->RAM[LCD_RAMRegister_7] =((NumberMap[user_num/10]>>2)&0x10);// 1B
LCD->RAM[LCD_RAMRegister_0] &= (~0x10);
LCD->RAM[LCD_RAMRegister_0] =((NumberMap[user_num/10>>2])&0x10);// 1C
LCD->RAM[LCD_RAMRegister_0] &= (~0x08);
LCD->RAM[LCD_RAMRegister_0] =((NumberMap[user_num/10]>>1)&0x08);// 1D
LCD->RAM[LCD_RAMRegister_3] &= (~0x80);
LCD->RAM[LCD_RAMRegister_3] =((NumberMap[user_num/10]<<4)&0x80);// 1E
LCD->RAM[LCD_RAMRegister_7] &= (~0x08);
LCD->RAM[LCD_RAMRegister_7] =((NumberMap[user_num/10]<<1)&0x08); // 1F
LCD->RAM[LCD_RAMRegister_4] &=(~0x01);
LCD->RAM[LCD_RAMRegister_4] =((NumberMap[user_num/10]>>1)& 0x01);// 1G
注意事項
本次舉例都是以第一個數碼管為例!其餘方法一樣。