帮忙看一下,51单片机的4位数码管动态显示

为什么后两个数码管在16(0x10)以前没有被消影,16(0x10)的时候最后一个数码管没有消影,17(0x11)以上的时候全部数码管被消影
#include <reg51.h>

void delay(unsigned int i);

unsigned char code Disp_Tab[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code dispbit[4]={0x7f,0xbf,0xcf,0xef}; // ??
unsigned char disbuf[4];

void delayms(unsigned int ms)
{
unsigned int a,b,c;
for(a=2;a>0;a--)
for(b=46;b>0;b--)
for(c=ms;c>0;c--);
}

void Led_Disp()
{
unsigned char i;
for(i=0;i<4;i++)
{
P3 = Disp_Tab[disbuf[i]];
P2 = dispbit[i];
delayms(1);
P3 = 0x00;
}
}

main()
{
int firstdat=17;
int seconddat=1;
while(1)
{
disbuf[0]=(((firstdat&0xf0)>>4)&0x0f);
disbuf[1]=firstdat&0x0f;
disbuf[2]=(((seconddat&0xf0)>>4)&0x0f);
disbuf[3]=seconddat&0x0f;
Led_Disp();
/*
P2 = 0x0f;
P0 = 0x06;
delay(600);

P2 = 0xf0;
P0 = 0x07;

delay(600);

*/
}

第1个回答  2014-02-26
你的现象应该是那两位数码管在
16 以前显示的是 0 和 一个数,如15 时显示的是 0 和 F、14 时显示的是 0 和 e。。。
16 时显示的是 1 和 0 ,17 时显示的是 1 和 1

disbuf[0]=(((firstdat&0xf0)>>4)&0x0f);
disbuf[1]=firstdat&0x0f;
disbuf[2]=(((seconddat&0xf0)>>4)&0x0f);
disbuf[3]=seconddat&0x0f;
这里不用这么麻烦吧,直接
disbuf[0]=firstdat>>4; 右移时,低四位被移出,高四位移入0,就是你要的结果了
disbuf[1]=firstdat&0x0f;
disbuf[2]=seconddat>>4;
disbuf[3]=seconddat&0x0f;
或者
disbuf[0]=firstdat/16; 除以16 得到 16 进制的十位
disbuf[1]=firstdat%16; 对16取余得到 16进制的个位
disbuf[2]=seconddat/16;
disbuf[3]=seconddat%16;
就行了吧
我想应该不会出现没消影的,不知道你说的消影是指什么现象
第2个回答  2014-02-26

参考一下这个仿真实例的8位数码管的动态显示,试试

第3个回答  推荐于2017-05-25
#include <reg51.h>

void delay(unsigned int i);

unsigned char code Disp_Tab[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code dispbit[4]={0x7f,0xbf,0xcf,0xef}; // 高4位进行段选择,每次选择一个数码管
unsigned char disbuf[4];

void delayms(unsigned int ms)
{
unsigned int a,b,c;
for(a=2;a>0;a--)
for(b=46;b>0;b--)
for(c=ms;c>0;c--);
}

void Led_Disp()
{
unsigned char i;
for(i=0;i<4;i++)
{
P2 = dispbit[i];
P3 = Disp_Tab[disbuf[i]];
delayms(1);
P3 = 0xff;//关闭显示
}
}

main()
{
int firstdat=17;
int seconddat=1;
while(1)
{
disbuf[0]=((firstdat&0xf0)>>4)&0x0f;//
disbuf[1]=firstdat&0x0f; //
disbuf[2]=((seconddat&0xf0)>>4;//
disbuf[3]=seconddat&0x0f;//
Led_Disp();
/*
P2 = 0x0f;
P0 = 0x06;
delay(600);

P2 = 0xf0;
P0 = 0x07;

delay(600);

*/
}本回答被网友采纳
相似回答