搜索
bottom↓
回复: 11

AVR单片机HC595芯片驱动数码管显示出错

[复制链接]

出0入0汤圆

发表于 2015-9-3 08:54:57 | 显示全部楼层 |阅读模式
程序中一部分用了一片ARRATMEL48和一片HC595驱动数码管,下面是显示的程序。
问题是:不管输入数据是多少,位选通后数码管全亮,不受控制,各位坛友帮分析分析。
//存储器锁存
#define SET_HC595_latch  (PORTD |= (1 << PD1))
#define CLR_HC595_latch  (PORTD &= ~(1 << PD1))
//寄存器移位
#define SET_HC595_sclk   (PORTD |= (1 << PD2))
#define CLR_HC595_sclk   (PORTD &= ~(1 << PD2))
//串行数据
#define SET_HC595_data   (PORTD |= (1 << PD3))
#define CLR_HC595_oe     (PORTD&= ~(1 << PD3))

void HC595_Send_Data(unsigned char byte)
{   
   unsigned char i;   
   CLR_HC595_latch;  //锁存低电平
   CLR_HC595_sclk;     //移位低电平
   for(i = 0;i < 8;i++)  
    {     
      if(byte & 0x80)   
        {     
          SET_HC595_data;    //数据位输出1
         }   
     else   
        {     
          CLR_HC595_data;   //数据位输出0
        }    byte <<=1;      
        SET_HC595_sclk;     //移位高电平   
       //上升沿数据移位   
       CLR_HC595_sclk;     //移位低电平
    }      
    SET_HC595_latch;   //锁存高电平
    CLR_HC595_latch;    //锁存低电平
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2015-9-3 09:18:13 | 显示全部楼层
sbit _LCLK = LCLK;
sbit _SCLK = SCLK;
sbit _DATA = DATA;
/*******************************************************************************
函数功能:向一片595发送数据输入
参数:数据的地址输出参数:无
*******************************************************************************/
void Send595(UCHAR * pdat)
{           
    unsigned char i,j;           
    j=0x80;           
    for (i=0;i<8;i++)           
    {              
        if((*pdat)&j) _DATA = 1;                        
        else          _DATA = 0;              
        _SCLK = 0;                
       _SCLK = 1;              
        j>>=1;   
    }
}

/*******************************************************************************
函数功能:串行静态显示函数输入
参数:显存的地址输出参数:无
*******************************************************************************/
code UCHAR DisplayHex[]={0xC0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,                        
                                         0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,                        };
void DisplayBy595(UCHAR * pdat)
{           
    UCHAR i;           
    for(i=0;i<4;i++)            
    {              
        Send595(&DisplayHex[*(pdat+i)]);   
    }      
    _LCLK=0;        
    _LCLK=1;
}

你的时序怎么和我的不一样,试试我的。

出0入0汤圆

 楼主| 发表于 2015-9-3 09:31:56 | 显示全部楼层
AHTY 发表于 2015-9-3 09:18
sbit _LCLK = LCLK;
sbit _SCLK = SCLK;
sbit _DATA = DATA;

移位寄存器输出先低后高,存储器锁存也是

出20入12汤圆

发表于 2015-9-3 10:45:00 | 显示全部楼层
时序没问题,可能是主频太快了,降低下速度试试

出0入0汤圆

 楼主| 发表于 2015-9-3 12:21:52 | 显示全部楼层
gaolf_2012 发表于 2015-9-3 10:45
时序没问题,可能是主频太快了,降低下速度试试

系统时钟1MHz

出20入12汤圆

发表于 2015-9-3 14:30:02 | 显示全部楼层
void delayus(unsigned int n)
{
        unsigned int wI,wJ;

        for(wI=0;wI<n;wI++)
        {
                for(wJ=0;wJ<4;wJ++);
        }
}

void InitSpi(void)
{
        SPI_CS = 1;
        SPI_CLK = 0;
        SPI_MOSI = 0;
       
        SPI_MOSI_TRIS = 0;
        SPI_CLK_TRIS = 0;
        SPI_CS_TRIS = 0;
}

void writeSpi( unsigned char bData)
{
        unsigned char bI, bTemp;

        bTemp = 0x80;
        for(bI=0; bI<8; bI++)
        {
                SPI_CLK = 0;
                delayus(1);
                if(bData & bTemp)
                        SPI_MOSI = 1;
                else
                        SPI_MOSI = 0;
                delayus(1);
                bTemp >>= 1;
                SPI_CLK = 1;
                delayus(1);
        }
        SPI_CLK = 0;
}


void WritePort(void)
{
        InitSpi();
        SPI_CS = 0;
        delayus(5);
        writeSpi(gbCtrl);
        writeSpi(gbRelay);
        delayus(5);
        SPI_CS = 1;
        OUT_ENABLE = 0;

}
给你8M,pic16的

出0入0汤圆

发表于 2015-9-3 14:55:18 | 显示全部楼层
检查一下硬件。另外,上升沿不该是0->1么?   SET_HC595_latch;   //锁存高电平     CLR_HC595_latch;    //锁存低电平,这不是下降沿么?

出0入0汤圆

发表于 2015-9-3 14:59:15 | 显示全部楼层
出错现象是什么?也有可能是受到干扰啊。

出0入0汤圆

发表于 2015-9-3 15:59:26 | 显示全部楼层
s20120907 发表于 2015-9-3 09:31
移位寄存器输出先低后高,存储器锁存也是

可是我见你是先高后低。

出0入0汤圆

 楼主| 发表于 2015-9-4 11:07:06 | 显示全部楼层
chengyang79 发表于 2015-9-3 14:59
出错现象是什么?也有可能是受到干扰啊。

输出全是高电平或者全是低电平

出0入0汤圆

发表于 2015-9-4 11:12:56 | 显示全部楼层
你查查你位选的和动态显示的频率

出0入0汤圆

 楼主| 发表于 2015-9-4 11:17:38 | 显示全部楼层
Ideal-007 发表于 2015-9-4 11:12
你查查你位选的和动态显示的频率

暂时只选通一个数码管,测试HC595
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 12:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表