數碼管動態顯示0~99999999
一、共陰極8位數碼管原理
首先了解一些必要知識
1、多位數碼管是掃描顯示,也就是同一時刻只有一個數碼管顯示
2、視覺暫留效果:第一個數碼管顯示完,第二個數碼管接着顯示,接着後面數碼管一次顯示,當顯示(掃描)足夠快的時候,人眼是看不到閃爍的,就認爲多個數碼管是同時顯示的
3、多位數碼管只能同時顯示多個一樣的數字,要顯示不同數字需要掃描顯示
比如說要顯示12345678,你看起來8個數碼管是同時亮的,其實同一時刻只有一個數碼管是亮的
我們把時間放慢,看看數碼管都發生了什麼變化:
1、第1毫秒
2、第二毫秒
3、第三毫秒
4、第四毫秒
5、第五毫秒
6、第六毫秒
7、第七毫秒
8、第八毫秒
當數碼管的掃描頻率大於50hz的時候人眼是基本分不清的,也就是你的掃描8個數碼管的週期控制在20ms內就可以實現動態顯示不閃爍。
二、瞭解原理後打開proteus仿真,畫電路圖
這裏用了74hc138,不會用的可以百度一下芯片用法
三、編寫代碼
代碼功能,顯示從0自加到99999999
#include <reg51.h>
typedef unsigned long u32; //對數據類型進行聲明定義
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA=P3^0; //74hc138的A B C引腳定義
sbit LSB=P3^1;
sbit LSC=P3^2;
#define SMG P0 //定義數碼管段數據接口P0
u8 buff[8]; //顯示緩衝數組
u8 a[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//分別顯示0 1 2 3 4 5 6 7 8 9
void delay_ms(u16 t)
{
u16 i,j;
for(i=0; i<t; i++)
for(j=0; j<120; j++);
}
void update(u32 val) //更新緩衝數組
{
//分離各位數據
buff[0]=val/10000000%10; //12345678/10000000%10=1;
buff[1]=val/1000000%10; //12345678/1000000%10=2;
buff[2]=val/100000%10; //12345678/100000%10=3;
buff[3]=val/10000%10; //12345678/10000%10=4;
buff[4]=val/1000%10; //12345678/1000%10=5;
buff[5]=val/100%10; //12345678/100%10=6;
buff[6]=val/10%10; //12345678/10%10=7;
buff[7]=val%10; //12345678%10=8;
}
void display(void) //顯示函數
{
u8 n;
for(n=0; n<8; n++)
{
switch(n) //先位選
{
case 0:LSC=0;LSB=0;LSA=0;break;
case 1:LSC=0;LSB=0;LSA=1;break;
case 2:LSC=0;LSB=1;LSA=0;break;
case 3:LSC=0;LSB=1;LSA=1;break;
case 4:LSC=1;LSB=0;LSA=0;break;
case 5:LSC=1;LSB=0;LSA=1;break;
case 6:LSC=1;LSB=1;LSA=0;break;
case 7:LSC=1;LSB=1;LSA=1;break;
}
SMG=a[buff[n]]; //後發送段數據
delay_ms(1); //小延時,顯示更穩定
}
}
void main(void)
{
u32 num=0; //要顯示的數據
u16 t; //延時用
while(1)
{
update(num); //更新顯示緩衝數組
for(t=0; t<50; t++) //用for循環來延時不然顯示不正常
{
display(); //顯示緩衝數組
}
num++; //顯示數據自加
}
}
執行效果:一開始顯示00000000,然後自動加一,一會變成00000035,直到溢出