图中两个脚74HC595是并联的, 数据是级联的;这种接法不可能工作。 |
595的工作原理不知道能写程序吗? 595不是今天才用, 4年前开发的电源通信输出开路检测都用到,典型的串进并出, 每次只能接受8位数据, 根本不是楼主说的哪样。SPI通信都是标准的接法, 图中的连接MOSI都不接, 能有通信吗?这是基本的常识, 图中两个74HC595是并联的,通过使能断来改变哪一个在工作, 哪一个在Standby; |
根据图上的接法,是属于2个595级联。595的工作原理你应该知道吧? 当向U2发送第1~8bit数据时,这8bit的值会出现在U2的Q0~Q7上。当你继续发送第9bit数据时,第9bit数据的值就会出现在U3的Q0上,第10bit会出现在U3的Q1上...... 当你向U2发送2个字节数据时,第一个字节会出现在U3的Q0~Q7上,第二个字节会出现在U2的Q0~Q7上,所以,第一个字节就是数码管的“位”码,第二字节就是“段”码。 |
硬件连接错误, 而且没有可产生计数的硬件, 我加了一个外部中断; hc595 pin12-----PB2;hc595 pin14-----PB3;hc595 pin11-----PB5;hc595 pin13-----PB0&PB1;两个hc595分别接到不同的使能端; 下面的程序是我从ATmega128 的基础上改的, 在128上没有问题,应该可行; 楼主的硬件基础太差, 要认真看一下英文的数据手册; 看下面的code; //*******Numerical_LED using 74HC595 ***************// //****Created by MQ.Wu on 2015/1/30************// #include <iom48v.h> #include <macros.h> #define uchar unsigned char #define uint unsigned int #define Dis1_hc595 PORTB &= ~(1<<PB0) #define EN1_hc595 PORTB |= (1<<PB0) #define Dis2_hc595 PORTB &= ~(1<<PB1) #define EN2_hc595 PORTB |= (1<<PB1) #pragma interrupt_handler INT0_ISR:2 const uchar tab0[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90}; const uchar tab1[]={0xF7,0xEF,0xDF,0xBF}; uchar cData[4]={0,0,0,0}; //display the initial value; uint count=0; void port_init(void); void HC595out(uchar i); void Process(uint i,uchar *p); void DelayMs(uint t); void SPImasterInit(void); void SPIMasterTransmit(uchar TranData); void HC595out(uchar i); void Display(uchar *p); void main(void) { port_init(); SPImasterInit(); while(1) { Process(count,cData); Display(cData); } } void INT0_ISR() //External interrupt0; { count++; if(count==9999) count=0; } void port_init(void) { DDRB =0XFF; //define as Output; DDRC =0X00; PORTC=0XFF; DDRD =0X00; PORTD=0XFF; } void DelayMs(uint t) { uint m,n; for(n=0;n<t;n++) for (m=0;m<1140;m++); } void SPImasterInit(void) { DDRB|=(1<<3)|(1<<5); //set MOSI,SCK as output, others are input; SPCR|=(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);//Enable SPI Master mode£¬Fck/128 } void SPIMasterTransmit(uchar TranData) { SPDR=TranData; while(!(SPSR&(1<<SPIF))); } void HC595out(uchar i) { PORTB&=~(1<<2); //waiting for the data transmision; SPIMasterTransmit(i); //Transferring data; PORTB|=(1<<2); } void Process(uint num,uchar *p) { p[0]=num/1000; p[1]=num%1000/100; p[2]=num%100/10; p[3]=num%10; } void Display(uchar *p) { uchar i; for(i=0;i<4;i++) { EN1_hc595; HC595out(tab0[p[i]]); //send the segment code; Dis1_hc595; DelayMs(1); EN2_hc595; HC595out(tab1[i]);// send the bit code; Dis2_hc595; DelayMs(1); } } |
每次送两字节的数据,第一字节为位码,第二字节为段码,这样就能显示出来了。 |
你需要了解锁存这个概念 |