595这么纯粹的器件,不会很难吧? 1、在SHCP的上升沿,把DS的电平存入595内(共8个位,SHCP需8个时钟),串行 2、在STCP的上升沿,把595内的数据存到输出缓存寄(8位并行),这里只要一个STCP时钟 3、OE低电平时,Q0-Q7的电平等于输出缓存寄(8位并行),OE为高电平时,Q0-Q7为高阻态 注意上升沿和低电平在代码上的区别,基本上就能驱起来了。 595的时钟高达50M,渣渣51单片机的速度对它来说是小CASE,根本不需要什么NOP,即便是M1的内核都不需要NOP! |
void HC595SendByte(unsigned char dat)//3入多出,这是串行输入,并行输出的东西 { unsigned char a; YA=0; HUAN=0; for(a=0;a<8;a++) { DAT=dat>>7; dat<<=1; YA=1; _nop_();//对于12mhz的芯片延时1us,包含在intrinsic.h里 _nop_(); delay(1000);//故意延时 YA=0; delay(1000);//故意延时 } HUAN=1; _nop_(); _nop_(); // delay(3000);//故意延时 HUAN=0; } |
void HC595SendByte(unsigned char dat)//3入多出,这是串行输入,并行输出的东西 { unsigned char a; YA=0; HUAN=0; for(a=0;a<8;a++) { DAT=dat>>7; dat<<=1; YA=1; _nop_();//对于12mhz的芯片延时1us,包含在intrinsic.h里 _nop_(); delay(1000);//故意延时 YA=0; delay(1000);//故意延时 } HUAN=1; _nop_(); _nop_(); // delay(3000);//故意延时 HUAN=0; } |
本帖最后由 wjsyjh 于 2022-9-3 16:21 编辑 void HC595SendByte(unsigned char dat)//3入多出,这是串行输入,并行输出的东西 { unsigned char a; YA=0; HUAN=0; for(a=0;a<8;a++) { DAT=dat>>7; dat<<=1; YA=1; _nop_();//对于12mhz的芯片延时1us,包含在intrinsic.h里 _nop_(); delay(1000);//故意延时 YA=0; delay(1000);//故意延时 } HUAN=1; _nop_(); _nop_(); // delay(3000);//故意延时 HUAN=0; } 子函数延时短一点就可以了 |
可以试试把28和29行代码换成dat<<1;DAT=CY; |
接线有问题的吧,或者图发完整一点 |
接线有问题,应该U2-11接P21,U2-14接P20,U2-12接P22. |
void HC595SendByte(unsigned char dat)//3入多出,这是串行输入,并行输出的东西 { unsigned char a; HUAN=0; for(a=0;a<8;a++) { YA=0; DAT=dat>>7; dat<<=1; YA=1; _nop_();//对于12mhz的芯片延时1us,包含在intrinsic.h里 _nop_(); delay(50000);//故意延时 } HUAN=1; _nop_(); _nop_(); delay(50000);//故意延时 HUAN=0; YA=0; } 我稍改了一下,试一下这个 |
1205551786 发表于 2021-7-13 14:22 对~只是把delay(50000);改delay(3000); |
595和595A是不一样的,看下是不是用了595A |
用的我的程序么 |
原理图发完整一点,至少74HC595的这些引脚怎么接得发全一点,你这样发我只能看到一半 |
我的没问题 ![]() |
Q0~Q7'接的是什么? |
devcang 发表于 2021-7-13 11:15 您这个是595对的用法,我看了很多资料了,我这个问题还没有解决 |
595输出要加上拉 |
注意时序必须符合要求 |