數碼管
1、數碼管可以分為共陰極數碼管和共陽極數碼管
兩者區別為:共陰極數碼管,每個數碼管的陰極接到一起(共地),給某個LED燈信號為低電平0時,LED燈點亮。
共陽極數碼管,每個數碼管的陽極接到一起,給某個LED燈信號為低電平0時,LED燈點亮。
本原理圖使用為共陽極數碼管。
2、段選和位選
(1)段選
沒一位數碼管可有8個發光二極管組成,其中編號如下:
其中,a~g的7個發光二極管經過組合可以組成不同的數字,常用數字為0~9。而dp端可表示小數點。
注:(十六進制,' - ',' .')
共陽極數碼管編碼表:unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
共陰極數碼管編碼表:unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x80};
(2)位選
如果說每一位數碼管經過段選,可以組成任一數字,那么如果要組成多位數字就需要進行位選操作。
以上述為例,com1、com2、com3、com4分別為第一組4位數碼管的位選,當com1=1時,則最左邊的數碼管進行顯示,即位選高電平1有效。
原理圖
(位選鎖存器)
(段選鎖存器)
由原理圖可知,令Y6=0時,可操作P0組IO口對數碼管進行位選;令Y7=0時,可操作P0組IO口對數碼管進行段選(內容)。
靜態數碼管顯示
靜態數碼管配置較為簡單。使用時,將段選與位選進行設置后,鎖存器會對數據進行鎖存。
有如下例子:
void showSMG(uchar dat,uchar pos) { HC138(6); //數碼管位選 P0=0x01 << pos; //位選左移,當令第3位數碼管亮時,賦值pos為2(編號從0開始) HC138(7); //數碼管段選 P0=table[dat];
} void main() { HC138(5); P0=0x00; showSMG(4,2); //在第3位數碼管上靜態顯示4 while(1) { } }
使用時,可根據數碼管顯示位置和內容,更改dat和pos的值。
動態數碼管顯示
動態數碼管顯示實質上就是輪流點亮單個數碼管,在視覺上實現多個數碼管同時點亮不同數字。
即:在配置時,令每個數碼管點亮時間為1~2ms,只要閃爍的速度足夠快, 就能給人一組穩定的顯示數據感受。
動態顯示作用:節約IO口。若使用靜態顯示4位數碼管,需要段選8*4+4個com端,共計36個;動態顯示,需8個段選+4個com端,共計12個。
配置:
按照正常靜態數碼管顯示配置,但是為使多位數碼管點亮不同數字,需要不斷改變數碼管的顯示
即:將第一位配置為一個數(位選第一位,令第一位顯示這個數),再關閉第一位位選,開啟第二位位選,配置第二位。一直循環重復,即可完成動態數碼管顯示。
注意每個顯示間隔可為1~2ms。
(1)靜態數碼管顯示基礎下,進行for循環
uchar t=0; uchar show[8]={1,2,3,4,5,6,7,8};//內部元素可以更改更新 void main() { while(1) { for(t=0;t<8;t++)//使用for循環,將show[]內元素依次顯示到數碼管1~8位上 { ShowSMG(show[t],t); Delay2ms(); } } }
(2)重復的循環顯示循環顯示
//動態數碼管顯示部分 void Show_calendar() { ShowSMG(year/1000,0); Delay2ms(); ShowSMG(year%1000/100,1); Delay2ms(); ShowSMG(year%100/10,2); Delay2ms(); ShowSMG(year%10,3); Delay2ms(); ShowSMG(mon/10,4); Delay2ms(); ShowSMG(mon%10,5); Delay2ms(); ShowSMG(day/10,6); Delay2ms(); ShowSMG(day%10,7); Delay2ms(); }
(3)放置於定時器服務函數下,在定時器內進行數碼管動態顯示
優點:顯示穩定,主程序內各種代碼都不會影響數碼管顯示
缺點:耗費定時器資源
void Timer2Init() //2??@12.000MHz { AUXR |= 0x04; T2L = 0x40; T2H = 0xa2; AUXR |= 0x10; IE |= 0x40; EA = 1; } void SMG_Showing()//根據數碼管顯示要求不同,更改對應位的顯示值 { switch(pos_bit) { case 1:Display_bit =dat%1000/100;break; case 2:Display_bit = dat%100/10;break; case 3:Display_bit = dat%10;break; case 6:Display_bit = dat_AD/10;break; case 7:Display_bit = dat_AD%10;break; default:Display_bit = 10;break; } } void Sever_Timer2() interrupt 12//數碼管顯示精度要求不高,也可以在里面進行一些簡單的計時 { SMG_Showing(); SMG_Show_com(pos_bit,Display_bit); if(++pos_bit == 8) pos_bit = 0; }
總結:
1、數碼管進行靜態、動態顯示需要控制相應的段選(亮什么)與位選(亮哪位);
2、位選時,需要令138譯碼器Y6=0;
3、段選時,需要令138譯碼器Y7=0;
4、數碼管動態顯示,還需要注意每一位的停留時間,建議為1~2ms;
5、可將數碼管動態顯示放入定時器內,使數碼管穩定顯示,而不會被主程序內的延時函數影響。