51單片機(jī),動(dòng)態(tài)數(shù)碼管靜態(tài)和滾動(dòng)方式顯示0-F

#include"reg52.h"
typedef unsigned char u8;//定義數(shù)據(jù)類型別名
typedef unsigned int u16;
#define SMG_A_DP P0//宏定義數(shù)碼管控制管腳P0
sbit LSA=P2^2;//定義38譯碼器的輸入管腳
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 gsmg[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共陰0-F段碼
void delay_10us(u16 ten_us)//延時(shí)函數(shù),輸入1延時(shí)10us
{
while(ten_us--);
}
void smg_display(void)//為讓數(shù)碼管顯示的代碼移植性更好,單獨(dú)封裝一個(gè)函數(shù),(void)表示不返回
{
u8 i=8;
for(i=8;i<16;i++)//循環(huán)讓每一個(gè)數(shù)碼管依次有效
{
switch(i-8)//選通一個(gè)數(shù)碼管。當(dāng)i=8時(shí),(i-8=0),調(diào)用case 0,38譯碼器Y0有效,其他無效
{
case 7: LSC=1;LSB=1;LSA=1;break;
//38譯碼器Y7有效,其他無效。不加break會(huì)跳到下一個(gè)case,加入break,執(zhí)行case后退出switch往下執(zhí)行
case 6: LSC=1;LSB=1;LSA=0;break;
//38譯碼器Y6有效,其他無效
case 5: LSC=1;LSB=0;LSA=1;break;
case 4: LSC=1;LSB=0;LSA=0;break;
case 3: LSC=0;LSB=1;LSA=1;break;
case 2: LSC=0;LSB=1;LSA=0;break;
case 1: LSC=0;LSB=0;LSA=1;break;
case 0: LSC=0;LSB=0;LSA=0;break;
}
SMG_A_DP=gsmg[i];//發(fā)送數(shù)碼管段碼信號(hào),i=8時(shí),發(fā)送8的段碼,i=15時(shí),發(fā)送F的段碼
delay_10us(50000);//每一個(gè)數(shù)碼管顯示延時(shí)一段時(shí)間后顯示下一個(gè)。
//利用人眼視覺暫留時(shí)間20-50毫秒,調(diào)整延時(shí)時(shí)間改變顯示效果。
//delay_10us(100);0-F一起顯示出來。delay_10us(50000);0-F依次流水顯示
}
}
void main()//主函數(shù)
{
while(1)
{
smg_display();//調(diào)用封裝的數(shù)碼管顯示函數(shù)
}
}