51單片機教程:數碼管動態顯示(0~99999999)74hc138驅動

數碼管動態顯示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,直到溢出
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章