/**********************************************************************************
* 標題: 試驗數碼管上顯示數字( 單片機直接實現位選 共陰極) *
* *
* 連接方法:P0與J12 用8PIN排線連接 P1與JP16 用排線連接 *
***********************************************************************************
* *
* 請學員認真消化本例程,用573鎖存器控制和單片機腳直接位選控制(非譯碼器控制)數碼管 *
***********************************************************************************/
#include
#include
void delay(unsigned int i); //函數聲名
char DelayCNT;//定義變量
//此表為 LED 的字模, 共陰數碼管 0-9 -
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段碼控制
//此表為8個數碼管位選控制, 共陰數碼管 1-8個 -
unsigned char code dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位選控制 查表的方法控制
/************主函數**********************/
main()
{
unsigned int i,LedNumVal=1 ; //變量定義
unsigned int LedOut[10]; //變量定義
DelayCNT=0;
while(1)
{
if(++DelayCNT>=20) //控制數字變化速度
{
DelayCNT=0; //20個掃描周期清零一次
++LedNumVal; //每隔20個掃描周期加一次
}
LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
LedOut[1]=Disp_Tab[LedNumVal%1000/100]|0x80;
LedOut[2]=Disp_Tab[LedNumVal%100/10];
LedOut[3]=Disp_Tab[LedNumVal%10];
LedOut[4]=Disp_Tab[LedNumVal%10000/1000]; //千位
LedOut[5]=Disp_Tab[LedNumVal%1000/100]|0x80; //百位帶小數點
LedOut[6]=Disp_Tab[LedNumVal%100/10]; //十位
LedOut[7]=Disp_Tab[LedNumVal%10]; //個位
for( i=0; i<9; i++)
{
P0 = LedOut;
P1 = dispbit; //使用查表法進行位選
/* switch(i) //使用switch 語句控制位選
{
case 0:P1 = 0x7F; break;
case 1:P1 = 0xbF; break;
case 2:P1 = 0xdF; break;
case 3:P1 = 0xeF; break;
case 4:P1 = 0xf7; break;
case 5:P1 = 0xfb; break;
case 6:P1 = 0xfd; break;
case 7:P1 = 0xfe; break;
} */
delay(150); //掃描間隔時間 太長會數碼管會有閃爍感
}
}
}
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
} |