74hc595级联

时间:2016-11-10 08:36:50

标签: bit-shift

我的SPI协议有问题。我有两个74hc595级联寄存器,并与7段连接。

我有以下显示数字的模式:

static const uint8_t Pattern[] = {
    0b01000000, // 0
    0b11101001, // 1
    0b00100010, // 2
    0b10100000, // 3
    0b10001001, // 4
    0b10000100, // 5
    0b00000100, // 6
    0b11100001, // 7
    0b00000000, // 8
    0b10000000, // 9
    0b11101111}; // BLANK

但是我无法执行该程序;当我想显示数字1或4或7时,位数会发生偏移。

我注意到这三个数字以第1位结束(问题是):

0b1110100**1**, // 1
0b1000100**1**, // 4
0b1110000**1**, // 7

使用其他数字(0,2,3,5,6,8,9),该程序运作良好。

这是我的计划:

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

//#define Chek_Bit(var,pos) ((var) & (1 << (pos)))
#define HC595_PORT   PORTC
#define HC595_DDR    DDRC
#define HC595_DS_POS PC7      //Data pin (DS) pin location 42
#define HC595_SH_CP_POS PC5      //Shift Clock (SH_CP) pin location 40
#define HC595_ST_CP_POS PC6      //Store Clock (ST_CP) pin location 41

static const uint8_t Pattern[] = {
    0b01000000, // 0
    0b11101001, // 1
    0b00100010, // 2
    0b10100000, // 3
    0b10001001, // 4
    0b10000100, // 5
    0b00000100, // 6
    0b11100001, // 7
    0b00000000, // 8
    0b10000000, // 9
    0b11101111}; // BLANK

void shiftInit()
{
   //Make the Data(DS), Shift clock (SH_CP), Store Clock (ST_CP) lines output
   HC595_DDR|=((1<<HC595_SH_CP_POS)|(1<<HC595_ST_CP_POS)|(1<<HC595_DS_POS));
}


#define HC595DataHigh() (HC595_PORT|=(1<<HC595_DS_POS))
#define HC595DataLow() (HC595_PORT&=(~(1<<HC595_DS_POS)))



void SendSpiData(char data)
{

    for(int8_t i=0;i<8;i++)
    {
        HC595_PORT|=(1<<HC595_SH_CP_POS); //HIGH

        if(data & 0b10000000)

        { //MSB is 1 so output high
            HC595DataHigh();
        }
        else
        {
            //MSB is 0 so output high
            HC595DataLow();
        }

        HC595_PORT&=(~(1<<HC595_SH_CP_POS));//LOW
        data=data<<1;  

    }

}


int main(void)
{



   shiftInit(); 


  HC595_PORT&=(~(1<<HC595_SH_CP_POS));//LOW
  HC595_PORT&=(~(1<<HC595_ST_CP_POS));//LOW


   while(1)
   {  

   HC595_PORT|=(1<<HC595_ST_CP_POS);//HIGH


   SendSpiDataV2(Pattern[7]);   //Write the data to shift register
   SendSpiData(Pattern[0]);   //Write the data to shift register

   HC595_PORT&=(~(1<<HC595_ST_CP_POS));//LOW


   }
}

当我发送7和0(11100001 01000000)时,我收到两个寄存器74hc595(11100000 01000001),因此数据不一样。注意:位置4&#34; 111 0 0001&#34;在7段中忽略了它的BP。

问题出在哪里?我认为问题在于测试if(data & 0b10000000)

0 个答案:

没有答案