例如,我采用51单片机开发平台,实现模拟拨号,数位显示在 2 4 6 8数码管上,此时我该在if(KeyValue ==18)后增加怎样的延时函数,才能使我已经输入的四位数字,在8位数码管上自右向左滚动显示。请教
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit we = P2^7;
sbit du = P2^6;
uchar KeyValue,temp,i,j,k,t;
uchar code leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
};
extern unsigned char ledbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char n;
extern unsigned char a[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
//检测20个按键的键盘扫描函数
void KeyScan() //带返回值的子函数
{
P3 = 0xf0;//判断哪一列被按下
if(P3 != 0xf0)
{
delay(5);//软件消抖
if( P3 != 0xf0)
{
switch(P3)
{
case 0xe0: KeyValue = 0; break;
case 0xd0: KeyValue = 1; break;
case 0xb0: KeyValue = 2; break;
case 0x70: KeyValue = 3; break;
}
P3 = 0x0f;//判断哪一行被按下
switch(P3)
{
case 0x0e: KeyValue = KeyValue; break;
case 0x0d: KeyValue += 4; break;
case 0x0b: KeyValue += 8; break;
case 0x07: KeyValue += 12; break;
}
while(P3 != 0x0f);//松手检测
if (a[0]!=0x00)
{a[0]=0x00;a[1]=0x00;a[2]=0x00;a[3]=0x00;a[4]=0x00;a[5]=0x00;a[6]=0x00;a[7]=0x00;}
a[0]=a[2];a[2]=a[4];a[4]=a[6];
a[6]=leddata[KeyValue];
}
}
P3 = 0xff;//判断独立按键
if(P3 != 0xff)
{
delay(5);//软件消抖
if( P3 != 0xff)
{
switch(P3)
{
case 0xfe: KeyValue = 16; break;
case 0xfd: KeyValue = 17; break;
case 0xfb: KeyValue = 18; break;
case 0xf7: KeyValue = 19; break;
}
while(P3 != 0xff);//松手检测
if (KeyValue == 16)
{
a[6]=a[4];a[4]=a[2];a[2]=a[0];
a[0]=0x00;
}
if (KeyValue == 19)
{a[0]=0x00;a[1]=0x00;a[2]=0x00;a[3]=0x00;a[4]=0x00;a[5]=0x00;a[6]=0x00;a[7]=0x00;}
if (KeyValue == 17)
{
temp=a[7];
a[7]=a[0];a[0]=a[1];a[1]=a[2];a[2]=a[3];a[3]=a[4];a[4]=a[5];a[5]=a[6];a[6]=temp;
}
if(KeyValue ==18)
{
}
}
}
}
void main()
{
we = 1;//打开位选
P0 = 0;//八位数码管全显示
we = 0;//锁存位选
du = 1;//打开段选端
P0 = 0;
while(1)
{
KeyScan();
P0 = ledbit[n];
we = 1;//打开位选
we = 0; //关闭位选
P0 = a[n];
du = 1; //打开段选
du = 0; //关闭段选
delay(2);//延时
if (n==0){n=8;}
n--;
}
}