數碼管工作原理
動態數碼管顯示數字0~7代碼
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
void delay(u16 i)//延時約10*i微秒
{
while(i--);
}
void DigDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i)//位選
{
case(0):
LSA=0;LSB=0;LSC=0; break;
case(1):
LSA=1;LSB=0;LSC=0; break;
case(2):
LSA=0;LSB=1;LSC=0; break;
case(3):
LSA=1;LSB=1;LSC=0; break;
case(4):
LSA=0;LSB=0;LSC=1; break;
case(5):
LSA=1;LSB=0;LSC=1; break;
case(6):
LSA=0;LSB=1;LSC=1; break;
case(7):
LSA=1;LSB=1;LSC=1; break;
}
P0=smgduan[i];//段選
delay(100);//掃描時間間隔
P0=0x00;//消影
}
}
void main()
{
while(1)
{
DigDisplay();
}
}
工作原理
我覺得從代碼中能更好的解釋原理。
數碼管工作原理圖
從原理圖中我們可以看到,數碼管中每個顯示位都是由8個特殊的二極管組成,他們分別由引腳2 ~ 9(也即P00 ~ P07口)控制。因為數碼管是共陰接法(所有二極管陰極接在一起并接地),所以當對應二極管陽極為高電平時,二極管發光,從而達到顯示數字的效果。比如:
P0=0x3f;
0x3f 在二進制中是 00111111 ,所以對應的顯示位的 dp、g、f、e、d、c、b、a 二極管的陽極電平依次為 低、低、高、高、高、高、高、高 ,所以顯示出數字 0 .這個步驟也叫做 段選。
一個顯示位原理圖
然而,一個數碼管有8個顯示位,而且都是由引腳2~9控制。那么怎樣做到精確控制某個顯示位顯示東西呢?對了,138譯碼器能很好地解決這個問題。
138譯碼器
從原理圖我們可以看到,138譯碼器由P22~P24三個口控制,可以輸出8種不同二進制數,從而精確控制8個顯示位中的某個顯示位。比如:
P2^2=0;
P2^3=0;
p2^4=0;
就是控制右數第一個顯示位顯示數字。而這步操作也叫做 位選 。
了解了以上知識后,再來看完整代碼就比較容易了。在主函數里面不斷循環執行
DigDisplay();
也就是 快速地(通過延時函數實現) 先位選再段選,利用 發光管的余輝和人眼視覺暫留作用 使得在人看來全部數碼管 同時 都在顯示數字,而事實上它們是依次顯示的。而這個過程也就是 動態數碼管 的實現。
最后還有一個小問題就是DigDisplay函數里面地一個語句:
P0=0x00;
顧碼思義,就是清空數碼管顯示的數字。那之所以要這樣做,是因為為了如果下一次顯示不同的數字時不會出現上一次數字的余影,從而達到較好的顯示效果。這個步驟也叫消影。
以上。