51單片機(jī)--8 位數(shù)碼管動(dòng)態(tài)顯示 12 位數(shù)字
掃描二維碼
隨時(shí)隨地手機(jī)看文章
51單片機(jī),要求用 8 位數(shù)碼管動(dòng)態(tài)顯示 12 位學(xué)號(hào)。
還要用按鍵調(diào)整走動(dòng)速度,C語(yǔ)言的。
//-------------------------------------------
#include
#include
sbit k_add = P3^1;
sbit k_sub = P3^4;
//-------------------------------------------
unsigned char code SEG7[] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};
unsigned char DISP_BUFF[] = {
10, 10, 10, 10, 10, 10, 10, 10,
1, 3, 9, 2, 5, 8, 0, 7, 4, 6, 3, 2,
10, 10, 10, 10, 10, 10, 10, 10};
unsigned char j = 0, k = 1;
//-------------------------------------------
void DelayMS(unsigned int x)
{
unsigned char i;
while(x--) for(i = 200; i > 0; i--);
}
//-------------------------------------------
void display(unsigned char x)
{
unsigned char i, w = 128;
for(i = 0; i < 8; i++) { //顯示八位數(shù)碼
P0 = SEG7[DISP_BUFF[i + k]];
P2 = w; DelayMS(1); P2 = 0;
w = _cror_(w, 1);
}
j++;
if (j > x) { //顯示遍數(shù)達(dá)到了預(yù)置數(shù)
j = 0;
k++; //那么從下一位開始顯示
if (k == 20) k = 0;
}
}
//-------------------------------------------
void main()
{
unsigned char d = 30;//顯示30遍,移動(dòng)一位
while(1) {
if (!k_add) {
display(d); //延時(shí)
if (!k_add) { //消抖
d += 2; if (d > 50) d = 50;//遍數(shù)增加,移位就變慢
while (!k_add) display(d);
} }
if (!k_sub) {
display(d);
if (!k_sub) {
d -= 2; if (d < 10) d = 10;
while (!k_sub) display(d);
}}
display(d);
P1 = d; //顯示當(dāng)前遍數(shù)
}
}
//-------------------------------------------
程序仿真運(yùn)行時(shí)的截圖:
說(shuō)明:
程序中的顯示部分,也是輪流顯示八位數(shù),也是屬于常見(jiàn)的動(dòng)態(tài)顯示。
但是,稍有不同的是:做而論道給它增加了一個(gè)參數(shù) k。
k = 0 時(shí),就和一般的顯示程序相同,顯示 DISP_BUFF[] 的第 0~7 個(gè)元素。
調(diào)用顯示程序 x 遍后(x 預(yù)設(shè)值為 30),再令 k 加一。
k = 1 時(shí),就要顯示 DISP_BUFF[] 的第 1~8 個(gè)元素。
這樣就可以在數(shù)碼管上看到數(shù)據(jù)移動(dòng)了一位。
以此類推,k 不斷的加一,就會(huì)使得 DISP_BUFF[] 中各個(gè)元素,依照先后順序,每次都取出 8 個(gè)元素,顯示在數(shù)碼管上。
當(dāng) k + 8 為 DISP_BUFF[] 中最末尾的元素時(shí),再令 k = 0,這時(shí)就又會(huì)從頭開始移位顯示。
利用按鍵,對(duì)變量 x (在主函數(shù)中的變量是 d)的大小進(jìn)行修改,即可控制數(shù)碼滾動(dòng)顯示的速度。
d 的范圍設(shè)定為 10~50,數(shù)值越大則滾動(dòng)越慢。
d 的當(dāng)前值,可以在 P1 口看到。