打印
[AVR单片机]

74HC595 数码管显示问题

[复制链接]
4012|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
先上原理图。此图是我压缩过的,太大了不让上传,实际上的管脚连接是,
我用的MCU是ATMEGA16,  74HC595的 11管脚是接PC0,
                                12管脚是接PC1,
                                14管脚是接PC2,
我的电路就是参考这个原理图搭的,但程序是把51的这个程序改成AVR的。
现在的问题是两个数码管常亮,我想是让这两个数码管在同一时间,显示不同的数字。
附上我修改的程序,请高手指教,


#include<avr/io.h>
#include<util/delay.h>

#define uint unsigned int
#define uchar unsigned char

typedef struct _bit_struct  
      {  
       unsigned char bit0 : 1 ;  
       unsigned char bit1 : 1 ;  
       unsigned char bit2 : 1 ;  
       unsigned char bit3 : 1 ;  
       unsigned char bit4 : 1 ;  
       unsigned char bit5 : 1 ;  
       unsigned char bit6 : 1 ;  
       unsigned char bit7 : 1 ;  
      }bit_field;  

//定义一个宏,用来得到每一位的值  
#define GET_BITFIELD(addr) (*((volatile  bit_field *) (addr)))  
//定义每一个位  
#define DAT         GET_BITFIELD(PORTC).bit2

void port_init(void)
{   

PORTC = 0x00;  
DDRC  = 0xFF;

}
     

uchar const tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void sendbyte(uchar byte)  
{      
        uchar num,c;   
        num=tab[byte];  
         
        for(c=0;c<8;c++)  
        {  
         PORTC&=~(1<<PC0);
         DAT = num&0x80;  
         num=num<<1;  
         PORTC|=(1<<PC0);
        }  

           
}  

void out595(void)  
{  
        PORTC&=~(1<<PC1);  
        PORTC|=(1<<PC1);
}  

void display(uchar word)  
{  
uchar i,j;  
i=word/10;  
j=word-10*i;  
sendbyte(j);  
sendbyte(i);  
out595();  
}  


int main(void)  
{     
    port_init();     
    while(1)  
    {   
     display(19);  
    }      
}  

未命名.JPG (32.3 KB )

未命名.JPG

相关帖子

沙发
acgean| | 2011-7-7 08:11 | 只看该作者
void sendbyte(uchar byte)  
{      
        uchar num,c;   
        num=tab[byte];  
         
        for(c=0;c<8;c++)  
        {  
         PORTC&=~(1<<PC0);
         DAT = num&0x80;  
         num=num<<1;  
         PORTC|=(1<<PC0);
        }  
}  

其中的:
         DAT = num&0x80;  
         num=num<<1;  
DAT 是什么东西? 你好象没有把数据输出到 SER 脚上去嘛?
其实, 用 AVR 的 SPI 驱动 595 是最方便的简单的办法.
我以前都这样用, 不用这么麻烦, 写 SPI 数据寄存器就行了.

使用特权

评论回复
板凳
bobodianxin|  楼主 | 2011-7-7 15:55 | 只看该作者
学习一下了。。。

使用特权

评论回复
地板
bobodianxin|  楼主 | 2011-7-7 16:02 | 只看该作者
还想问一下。如果我的板子,是用ISP方式下载程序,那再对SPI寄存器配置,会不会有冲突,因为ISP方式是要占用 MISO MOSI SCK 等引脚的?小弟愚钝。:$

使用特权

评论回复
5
chenczy| | 2011-7-12 13:57 | 只看该作者
用ISP下载,那几个脚是用不了的,除非你不用ISP

使用特权

评论回复
6
chenczy| | 2011-7-12 13:59 | 只看该作者
发一个595AVR程序给你参考下,我的是4个相连的
void send595(unsigned char led1,unsigned char led2,unsigned char led3,unsigned char led4)
{
   unsigned char i,j,k;
   for(j=1;j<5;j++)
   {  
    if(j==1) k=led1;
    else if(j==2) k=led2;
    else if(j==3) k=led3;
    else if(j==4) k=led4;
   
    for(i=0;i<8;i++)
     {   
     if(k&0x80) PORTD.5=1;
     else PORTD.5=0;  
     PORTD.6=1;
     k<<=1;
     PORTD.6=0;   
     }      
    }
     PORTD.7=1;
     PORTD.7=0;  
  }

使用特权

评论回复
7
cyrseven| | 2011-7-12 20:09 | 只看该作者
围观,学习。。。

使用特权

评论回复
8
hotpower| | 2011-7-13 09:28 | 只看该作者
电路设计不太合理。

使用特权

评论回复
9
mulian| | 2013-9-23 09:42 | 只看该作者
acgean 发表于 2011-7-7 08:11
void sendbyte(uchar byte)  
{      
        uchar num,c;   

貌似你没仔细看程序,命名DAT在define里面有啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

10

帖子

1

粉丝