單片機學習——共陽數(shù)碼管的靜態(tài)顯示(自用)
內(nèi)容:
8個數(shù)碼管分別單獨依次顯示0-9的值,然后所有數(shù)碼管一起同時顯示0-F的值,如此往復(fù)。
基礎(chǔ)部分:
①共陽:所有數(shù)碼管陽極接到一起,單獨一支數(shù)碼管一端接陰極,則亮
②共陰:所以數(shù)碼管陰極接到一起,單獨一支數(shù)碼管一端接陽極(高電平),則亮
硬件部分:
兩個鎖存器,一個譯碼器
設(shè)計思路:
①一個鎖存器控制數(shù)碼管位置,另一個控制數(shù)碼管的內(nèi)容,通過兩個for循環(huán),一個控制0-9,另一個負責選擇交替輸出的數(shù)碼管,從而實現(xiàn)每個數(shù)碼管單獨顯示0-9的值。
②激活所有的數(shù)碼管,全部調(diào)到高電平,通過一個for循環(huán)1-16使得數(shù)碼管輸出0-F的值
代碼及說明:
#include "reg52.h"
unsigned char code SMG_duanma[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x88,0x80,
0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
void delay(unsigned int t)
{
while(t--);
while(t--);
}//延時函數(shù)
?void InitHC138(unsigned char n)
{
?switch(n) //選擇工作的鎖存器
?{
?case 4:
?P2=(P2 & 0x1f) | 0x80; ? //0x1f為00011111
?break; ? ? ? ? ? ? ? ? ? ? ? ? ???? //&是為了給前三項清零
?case 5: ? ? ? ? ? ? ? ? ? ? ? ? ???//|為了輸入二進制數(shù)(賦值)
?P2=(P2 & 0x1f) | 0xa0;
?break;
?case 6:
?P2=(P2 & 0x1f) | 0xc0;
?break;
?case 7:
?P2=(P2 & 0x1f) | 0xe0;
?break;
?}
}
? void showSMG_Bit(unsigned char dat,unsigned pos)
? {
? ?InitHC138(6);? ?//激活控制段位的鎖存器
? ?P0=0x01<<pos;? ?//激活第一位、要哪一位為1,就右移多少位
? ?InitHC138(7);? ?//激活顯示數(shù)字的鎖存器
? ?P0=dat; ? ? ? ?//輸出數(shù)字6所對應(yīng)的編碼值
? }
void SMG_static()
{
unsigned char i,j;
for(i=0;i<8;i++)
{
?for(j=0;j<10;j++) ? //每一位從0-9顯示完了j再去執(zhí)行下一位數(shù)碼管i
?{
?showSMG_Bit(SMG_duanma[j],i) ;
?delay(60000);
?} ? //效果:八個數(shù)碼管分別依次顯示0-9的值
}
?for(j=0;j<10;j++)
?{
? ?InitHC138(6);? ? ? ? ? ? ? ?//激活控制段位的鎖存器
? ?P0=0xff;? ? ? ? ? ? ? ? ? ? //數(shù)碼管全部顯示高電平(8個端口)
? ?InitHC138(7);? ? ? ? ? ? ? ?//激活顯示數(shù)字的鎖存器
? ?P0=SMG_duanma[j]; ? ? ? ?//輸出數(shù)字j所對應(yīng)的編碼值 }
}
void main()
{
SMG_static();
}