![]() |
發布時間: 2023-5-30 14:03
正文摘要:單片機通過74HC595控制8個LED循環點亮,按照D16-D15-D14......D9依次循環,每次亮一個。仿真看著沒問題,實物運行起來會有不止一個LED亮起來,學藝不精,找了很久沒找到問題根源,還請大佬指點迷津。 單片機型號STC ... |
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驅動代碼調整一下試試。
|