我的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)
。