通过2片595串行连接来驱动4位数码管闪亮问题

2019-07-18 10:32发布

我通过2片595来驱动4位的数码管去动态显示
在protues上仿真是没有任何问题的,但是在实际电路的上总是会闪亮,而且有时候改变延时后第一位数字没有显示了。
程序如下
#include <iom162v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
uint num;
int PianXuan[10]={0x5f,0x42,0x9b,0xd3,0xc6,0xd5,0xdd,0x43,0xdf,0xd7};
int WeiXuan[4]={0x0e,0x0d,0x0b,0x07};
void delay_ms(unsigned int x)    // 延时 (x) ms
{
unsigned char j;
while(x--)
{
  for(j=0;j<123;j++)
  {
    ;  
  }
}
}
void delay_us(unsigned char x)   // 延时 (x*2+5) us
{
    while(--x);
}
//------------------------------------------------------------
//PA5    CLK                     //时钟位定义
//PA6    Load                    //转载/移位位定义
//PA7   Data                      //接收位定义
/**********************74hc595接收程序***********************/
//-------------------------------------------------------------
void ShuMa_595_Xie(unsigned char Data)   //74hc 595的写操作
{
int i;
uchar j;
for(i = 0; i < 8; i++)
{
  PORTB&=~BIT(2);
  j=Data&0x80;
  if(j==0x00)
  PORTB&=~BIT(0);
  else
  PORTB|=BIT(0);
  Data<<=1;
  PORTB|=BIT(2);
}
}
void ShuMa_595_Du(void)           //74hc595 读操作
{
PORTB&=~BIT(1);
;
PORTB|=BIT(1);
}
//------------------------------------------------------------
//PA5    CLK                     //时钟位定义
//PA6    Load                    //转载/移位位定义
//PA7   Data                      //接收位定义
/************************4位数码管接收程序********************/
//-------------------------------------------------------------
void ShuMa(int BianMa)     //数码管驱动
{
int x,y,i=4;
x=BianMa;
for(i=4;i>0;i--)
{     
  ShuMa_595_Xie(WeiXuan[i-1]);
  y=x%10;
  x=x/10;
  ShuMa_595_Xie(PianXuan[y]);
  ShuMa_595_Du();
  delay_ms(10);
  ShuMa_595_Xie(i-1);
  ShuMa_595_Xie(0x00);
  ShuMa_595_Du();
  delay_ms(1);
}
}
main()            //主函数
{

int i,k=4621;
DDRB=0xff;
while(1)
{
  ShuMa(k);
}
}

希望能给我具体的解决方法  
我想用动态显示达到目的
QQ截图20150716102555.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。