做个简单的数码显示,最后一位数据在其他为都以阴影出现
时间:10-02
整理:3721RD
点击:
写了个多功能数码管函数。可以任意显示多少位,从哪位开始显示,以及小数点显示。
假设我显示 5163,可是调试时一切正常,全速运行时,板子上的8位数码
管显示前四位5163 正确,可是所有的位都有3的阴影显示,单步看得时候也没有阴影。
/*******************************************************************************
* Function Name : void Display(int data,int position,int bit,int point)
* Description : 数码管动态显示数据
* Input : int data 要显示的数据 int bit 显示的位数
position 数据开始显示的位置 char point小数点位置
* Output : None
* Return : None
*******************************************************************************/
void Display(int data,int position,int bit,int point)
{
char i, j;
char Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
struct Posi //分解的数据
{
char kb;
char hun;
char de;
char te;
}P1;
P1.kb = data/1000;
P1.hun = data/100%10;
P1.de = data/10%10;
P1.te = data%10;
j = position;
Display_Clear();
for(i=0;i<bit;i++)
{ Display_Clear();
P4OUT = 0xff; //关闭位选
Pos_EN;
Pos_DS;
switch(j) //j 数据开始显示的位置
{
case 0: break;
case 1: if(point == j)
{
P4OUT = Tab[P1.kb]| 0x80; //显示千位
}
else
{
P4OUT = Tab[P1.kb];
}
Seg_EN; //段 使能
Seg_DS;
P4OUT =~(0x01<<j-1);
Pos_EN;
Pos_DS; //位 使能
Delay(2);break;
case 2: if(point == j)
{
P4OUT = Tab[P1.hun]| 0x80; //显示白位
}
else
{
P4OUT = Tab[P1.hun];
}
Seg_EN; //段 使能
Seg_DS;
P4OUT = ~(0x01<<j-1);
Pos_EN;
Pos_DS; //位 使能
Delay(2); break;
case 3: if(point == j)
{
P4OUT = Tab[P1.de]| 0x80;
}
else
{
P4OUT = Tab[P1.de]; //显示十位
}
Seg_EN; //段 使能
Seg_DS; //位 使能
P4OUT = ~(0x01<<j-1);
Pos_EN;
Pos_DS;
Delay(2); break;
case 4: if(point == j)
{
P4OUT = Tab[P1.te]| 0x80;//显示个位
}
else
{
P4OUT = Tab[P1.te];
}
Seg_EN; //段 使能
Seg_DS; //位 使能
P4OUT = ~(0x01<<j-1);
Pos_EN;
Pos_DS;
Delay(2);break;
default : break;
}
if(j<position+bit)
{
j++;
}
else
{
j=0;
}
}
}
很奇怪,有木有高手解释下。
假设我显示 5163,可是调试时一切正常,全速运行时,板子上的8位数码
管显示前四位5163 正确,可是所有的位都有3的阴影显示,单步看得时候也没有阴影。
/*******************************************************************************
* Function Name : void Display(int data,int position,int bit,int point)
* Description : 数码管动态显示数据
* Input : int data 要显示的数据 int bit 显示的位数
position 数据开始显示的位置 char point小数点位置
* Output : None
* Return : None
*******************************************************************************/
void Display(int data,int position,int bit,int point)
{
char i, j;
char Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
struct Posi //分解的数据
{
char kb;
char hun;
char de;
char te;
}P1;
P1.kb = data/1000;
P1.hun = data/100%10;
P1.de = data/10%10;
P1.te = data%10;
j = position;
Display_Clear();
for(i=0;i<bit;i++)
{ Display_Clear();
P4OUT = 0xff; //关闭位选
Pos_EN;
Pos_DS;
switch(j) //j 数据开始显示的位置
{
case 0: break;
case 1: if(point == j)
{
P4OUT = Tab[P1.kb]| 0x80; //显示千位
}
else
{
P4OUT = Tab[P1.kb];
}
Seg_EN; //段 使能
Seg_DS;
P4OUT =~(0x01<<j-1);
Pos_EN;
Pos_DS; //位 使能
Delay(2);break;
case 2: if(point == j)
{
P4OUT = Tab[P1.hun]| 0x80; //显示白位
}
else
{
P4OUT = Tab[P1.hun];
}
Seg_EN; //段 使能
Seg_DS;
P4OUT = ~(0x01<<j-1);
Pos_EN;
Pos_DS; //位 使能
Delay(2); break;
case 3: if(point == j)
{
P4OUT = Tab[P1.de]| 0x80;
}
else
{
P4OUT = Tab[P1.de]; //显示十位
}
Seg_EN; //段 使能
Seg_DS; //位 使能
P4OUT = ~(0x01<<j-1);
Pos_EN;
Pos_DS;
Delay(2); break;
case 4: if(point == j)
{
P4OUT = Tab[P1.te]| 0x80;//显示个位
}
else
{
P4OUT = Tab[P1.te];
}
Seg_EN; //段 使能
Seg_DS; //位 使能
P4OUT = ~(0x01<<j-1);
Pos_EN;
Pos_DS;
Delay(2);break;
default : break;
}
if(j<position+bit)
{
j++;
}
else
{
j=0;
}
}
}
很奇怪,有木有高手解释下。
最好加个清除显示的语句,不然他最后跳出这个显示函数的时候,锁存器的锁存端还是3,这可能是造成阴影的原因吧
在显示的最后一条加一条消隐语句,就可以解决。P4OUT = 0xff;