Arduino spi 74hc595级联atmega64

Arduino spi 74hc595级联atmega64,arduino,spi,atmega,Arduino,Spi,Atmega,我在显示7段40组件74hc595级联链路上显示的40个值时遇到问题。 我在arduino上执行我的程序,效果很好 这是我的密码: static const byte Pattern[] = { B00010100, // 0 B00111111, // 1 B10011000, // 2 B00011010, // 3 B00110011, // 4 B01010010, // 5 B01010000, // 6 B

我在显示7段40组件74hc595级联链路上显示的40个值时遇到问题。

我在arduino上执行我的程序,效果很好 这是我的密码:

 static const byte Pattern[] = {
    B00010100, // 0
    B00111111, // 1
    B10011000, // 2
    B00011010, // 3
    B00110011, // 4
    B01010010, // 5     
    B01010000, // 6
    B00011111, // 7
    B00010000, // 8
    B00010010, // 9
    B00010000}; // BLANK


byte HC595_DS_POS = 2;     //Data pin (DS) pin location

byte HC595_SH_CP_POS = 3;  //Shift Clock (SH_CP) pin location
byte HC595_ST_CP_POS = 4;  //Store Clock (ST_CP) pin location



void IE74595_Out(uint8_t *p, unsigned char n)
{
  unsigned char i, j;
  uint8_t b;


  digitalWrite(HC595_ST_CP_POS,0);
  digitalWrite(HC595_SH_CP_POS,0);


  for(j=0;j<n;j++)
  {
    b = Pattern[*(p+n-j-1)];    // Lay byte cao nhat truoc

    for(i=0;i<8;i++)
    {

      digitalWrite(HC595_SH_CP_POS,0);

      if(b & 0b00000001)
      {

       digitalWrite(HC595_DS_POS,1);

      }
      else
      {

        digitalWrite(HC595_DS_POS,0);

      }

      digitalWrite(HC595_SH_CP_POS,1);

      b=b>>1;  //Now bring next bit at MSB position

    }
  }


digitalWrite(HC595_ST_CP_POS,1);

}



void setup()
{
  // put your setup code here, to run once:
  pinMode(HC595_ST_CP_POS, OUTPUT);
  pinMode(HC595_SH_CP_POS, OUTPUT);
  pinMode(HC595_DS_POS, OUTPUT); 

}

void loop() {

   uint8_t Data[40]={2,5,1,3,2,1,3,6,1,9,4,8,1,7,0,5,1,2,5,6,5,4,1,4,1,8,1,3,1,9,5,6,4,5,6,2,6,1,0,2};


          IE74595_Out(Data,40);


}
然后我在atmel studio上重新制作了另一个程序,并通过extrem burner和卡中的Usbasp加载它 这是我的密码:

    #define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>

static const uint8_t Pattern[] = {
    0b00010100, // 0
    0b00111111, // 1
    0b10011000, // 2  
    0b00011010, // 3
    0b00110011, // 4
    0b01010010, // 5  
    0b01010000, // 6  
    0b00011111, // 7
    0b00010000, // 8
    0b00010010, // 9
        0b00010000}; // BLANK

#define output_low(port,pin) port &= ~(1<<pin)
#define output_high(port,pin) port |= (1<<pin)
#define set_input(portdir,pin) portdir &= ~(1<<pin)
#define set_output(portdir,pin) portdir |= (1<<pin)

#define HC595_DS_POS PC4    //Data pin (DS) pin location
#define HC595_SH_CP_POS PC5  //Shift Clock (SH_CP) pin location
#define HC595_ST_CP_POS PC6  //Store Clock (ST_CP) pin location



#define HC595_PORT   PORTC
#define HC595_DDR    DDRC


void IE74595_Out(uint8_t *p, unsigned char n)
{
    unsigned char i, j;
    uint8_t b;

    output_low(HC595_PORT,HC595_ST_CP_POS);
     output_low(HC595_PORT,HC595_SH_CP_POS);


    for(j=0;j<n;j++)
    {
        b = Pattern[*(p+n-j-1)];// Lay byte cao nhat truoc


        for(i=0;i<8;i++)
        {
            output_low(HC595_PORT,HC595_SH_CP_POS);

            if(b & 0b00000001)
            {

                output_high(HC595_PORT,HC595_DS_POS);

            }
            else
            {

                output_low(HC595_PORT,HC595_DS_POS);

            }

            output_high(HC595_PORT,HC595_SH_CP_POS);
            b=b>>1;  

        }
    }


    output_high(HC595_PORT,HC595_ST_CP_POS);
}

int main(void)
{
     set_output(DDRC,HC595_DS_POS);
    set_output(DDRC,HC595_SH_CP_POS); 
    set_output(DDRC,HC595_ST_CP_POS);

    uint8_t Data[40]={5,9,1,6,1,1,0,9,1,7,1,5,4,2,6,2,8,7,0,7,1,2,3,5,1,5,4,2,1,7,5,9,1,9,4,8,1,5,2,9};


 while (1)
 {


    IE74595_Out(Data,40);
        return 1;


 }


}
这是我的名片

显示与arduino不同 我只显示最后一个值

我在中国开发了我的电子卡

材料有问题吗

这两个计划之间的唯一区别是: 在arduino上数码书写 和atmel上的输出_高或输出_低

DigitalWrite==输出是高还是低

我必须写最后一条指令返回1;过了一会儿


Thank的

SS Slave Select上的10K下拉电阻器设计用于在主处理器引导时防止寄存器以位计时,并且SS线可能处于浮动和不确定状态

这是

调用SPI.transfer一次向寄存器发送一个字节一个位,然后使锁存器(也称为SS或ST line high)从寄存器的内部存储器向输出引脚传输数据

销连接


Uno和类似产品的引脚连接:

每个移位寄存器是否有合适的去耦电容器?此外,digitalWrite的速度大约是sbi/cbi指令的80倍,因此缺少解耦可能是一个问题。特别是对于这种电流,@20mA=>3.2A上的所有段的一半,以及=>6.4A上的所有段。不,我使用我在中国开发的电子卡,我找到了解决方案,我找到了解决方案,我在时钟前加了一个延迟,这是代码