51单片机,要求用 8 位数码管动态显示 12 位学号。
还要用按键调整走动速度,C语言的。
题目链接:http://zhidao.baidu.com/question/1754521247451476108.html
2014-07-08 23:22 做而论道回答如下:
//-------------------------------------------
#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++) { //显示八位数码
P0 = SEG7[DISP_BUFF[i + k]];
P2 = w; DelayMS(1); P2 = 0;
w = _cror_(w, 1);
}
j++;
if (j > x) { //显示遍数达到了预置数
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;//遍数增加,移位就变慢
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; //显示当前遍数
}
}
//-------------------------------------------
程序仿真运行时的截图:
http://xiangce.baidu.com/picture/detail/9f5a51be23f1f1641233c74aa74185593a227585
说明:
程序中的显示部分,也是轮流显示八位数,也是属于常见的动态显示。
但是,稍有不同的是:做而论道给它增加了一个参数 k。
k = 0 时,就和一般的显示程序相同,显示 DISP_BUFF[] 的第 0~7 个元素。
调用显示程序 x 遍后(x 预设值为 30),再令 k 加一。
k = 1 时,就要显示 DISP_BUFF[] 的第 1~8 个元素。
这样就可以在数码管上看到数据移动了一位。
以此类推,k 不断的加一,就会使得 DISP_BUFF[] 中各个元素,依照先后顺序,每次都取出 8 个元素,显示在数码管上。
当 k + 8 为 DISP_BUFF[] 中最末尾的元素时,再令 k = 0,这时就又会从头开始移位显示。
利用按键,对变量 x (在主函数中的变量是 d)的大小进行修改,即可控制数码滚动显示的速度。
d 的范围设定为 10~50,数值越大则滚动越慢。
d 的当前值,可以在 P1 口看到。