51單片機--8 位數(shù)碼管動態(tài)顯示 12 位數(shù)字
51單片機,要求用 8 位數(shù)碼管動態(tài)顯示 12 位學(xué)號。
還要用按鍵調(diào)整走動速度,C語言的。
//-------------------------------------------
#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ù)達到了預(yù)置數(shù)
j = 0;
k++; //那么從下一位開始顯示
if (k == 20) k = 0;
}
}
//-------------------------------------------
void main()
{
unsigned char d = 30;//顯示30遍,移動一位
while(1) {
if (!k_add) {
display(d); //延時
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ù)
}
}
//-------------------------------------------
程序仿真運行時的截圖:
說明:
程序中的顯示部分,也是輪流顯示八位數(shù),也是屬于常見的動態(tài)顯示。
但是,稍有不同的是:做而論道給它增加了一個參數(shù) k。
k = 0 時,就和一般的顯示程序相同,顯示 DISP_BUFF[] 的第 0~7 個元素。
調(diào)用顯示程序 x 遍后(x 預(yù)設(shè)值為 30),再令 k 加一。
k = 1 時,就要顯示 DISP_BUFF[] 的第 1~8 個元素。
這樣就可以在數(shù)碼管上看到數(shù)據(jù)移動了一位。
以此類推,k 不斷的加一,就會使得 DISP_BUFF[] 中各個元素,依照先后順序,每次都取出 8 個元素,顯示在數(shù)碼管上。
當(dāng) k + 8 為 DISP_BUFF[] 中最末尾的元素時,再令 k = 0,這時就又會從頭開始移位顯示。
利用按鍵,對變量 x (在主函數(shù)中的變量是 d)的大小進行修改,即可控制數(shù)碼滾動顯示的速度。
d 的范圍設(shè)定為 10~50,數(shù)值越大則滾動越慢。
d 的當(dāng)前值,可以在 P1 口看到。