188610329 发表于 2023-5-31 17:20 在 RCK=0; RCK=1之间插入多个_nop_()也不起作用; 单片机是STC89C52,595供电电压是5V,万用表实际测下来是4.97V |
Cqzm 发表于 2023-5-30 22:55 存在的问题是,你还没完成下降,就开始上升了。不知道你用的什么单片机,如果1T 的单片机, RCLK = 0; 到 RCLK =1; 之间,你最少要插入 5个 _nop_(); 如果你的 595是 3V供电的话,你甚至需要 插入12个_nop_(); 才够。 |
pcf2000 发表于 2023-5-31 09:43 数据是串入并出的,这句是在往移位寄存器里面写入的 |
提醒楼主一个冷知识:不同厂家的595芯片,对锁存和ENABLE的逻辑要求不完全相同,你看下你使用的595芯片对应的手册就明白了。 |
1、要点,先关闭OE,这样数据的切换就不会闪动,因为这时不显示(暗,消影)。 2、给出串行数据; 3、要点:等数据稳定后,再给出移位脉冲信号上沿。 4、待输出稳定后,打开OE,放出数据。 所谓稳定,也就是插入几个NOP指令的事。 硬件上要注意,CLK信号,复位信号要做防护,不能受到干扰。 |
本帖最后由 pcf2000 于 2023-5-31 09:51 编辑 SER=byte>>7; 这句代码是什么意思,串行输出不该是一位一位输出的吗,你移动7位,高位的数据直接出位,就用0补位了,就出现LED灯亮了, 记住,你的电路是0电平点亮LED灯,要实现每次只一只LED点亮,595的输出每次必须只有一位输出为0 改为 :SER=byte>>1; 即可 |
wulin 发表于 2023-5-30 16:40 你好,我照着你的改了下代码,进入HC595_Send()函数时就将RCK拉低,八位写完后在拉高RCK,能正常运行了。 修改前HC595_Send()这个函数里面,写入八位后RCK给一个上升沿这种做法为啥不对呢?l两者看起来差不多啊,存在什么问题。 void HC595_Write(unsigned char dat) { unsigned char i; RCK=0; for(i=0;i<8;i++) { SCK=0; SER=dat>>7; dat<<=1; SCK=1; _nop_(); } RCK=1; } |
程序没有什么明显问题,仿真成功不等于实物就能成功。把595驱动代码调整一下试试。
|