找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3871|回復(fù): 16
收起左側(cè)

單片機(jī)+兩個74hc595驅(qū)動LED程序?qū)嵲诟悴欢?求大神幫忙

[復(fù)制鏈接]
ID:718523 發(fā)表于 2021-3-22 13:00 | 顯示全部樓層 |閱讀模式
      兩個74hc595串聯(lián)的不是就有16個輸出腳了嗎?想讓它輸出10個0和6個1也就是0000000000111111我的程序如下,但是是錯的求大神指正。

單片機(jī)源程序如下:
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #define  NOP() _nop_()  /* 定義空指令 */

  4. //SPI IO
  5. sbit MOSIO =P3^4;
  6. sbit R_CLK =P3^5;
  7. sbit S_CLK =P3^6;
  8. void HC595SendData(unsigned char SendVal);//向595發(fā)送數(shù)據(jù)

  9. main()
  10. {
  11. HC595SendData(0x00);//初始化595使他為高電平 讓LED處于熄滅狀態(tài)  
  12.   HC595SendData(0xfc00);//1111110000000000  
  13. }

  14. void HC595SendData(unsigned char SendVal)
  15. {  
  16.   unsigned char i;               
  17.   for(i=0;i<8;i++)
  18.    {
  19.         if((SendVal<<i)&0x80) MOSIO=1;
  20.         else MOSIO=0;                                   

  21.         S_CLK=0;
  22.         NOP();        
  23.         NOP();
  24.         S_CLK=1;        
  25.    }
  26.         
  27.   R_CLK=0;
  28.   NOP();   
  29.   NOP();
  30.   R_CLK=1;

  31. }
復(fù)制代碼

像代碼中的藍(lán)字我把8改成16過,把80改成800和8080過都不起作用,請問要怎么改呢才能輸出本文開頭提的問題呢?注:這個程序在一片595中使用是可以的。



回復(fù)

使用道具 舉報

ID:718523 發(fā)表于 2021-3-22 15:01 | 顯示全部樓層
我嘗試著接在8段3位的數(shù)碼管上
A-DP=Qa-Qh
DIG1-DIG3=Qb-Qd
程序改成
  1. HC595SendData(0x08); //00001000
  2. HC595SendData(0xf9);//11111001
復(fù)制代碼

我覺得它應(yīng)該是DIG3這一個管里右邊顯示1,結(jié)果它顯示111(DIG1-DIG3都是右邊的1)
回復(fù)

使用道具 舉報

ID:844772 發(fā)表于 2021-3-22 15:39 | 顯示全部樓層
unsigned char SendVal,char不是只有8位嗎?你傳16位給它是什么意思。
回復(fù)

使用道具 舉報

ID:332444 發(fā)表于 2021-3-22 15:51 | 顯示全部樓層
串聯(lián)的595送2次8位數(shù)據(jù)即可.
回復(fù)

使用道具 舉報

ID:275826 發(fā)表于 2021-3-22 15:59 | 顯示全部樓層
把if((SendVal<<1)&0x80) MOSIO=1;
回復(fù)

使用道具 舉報

ID:718523 發(fā)表于 2021-3-22 16:29 | 顯示全部樓層

沒看懂什么意思
回復(fù)

使用道具 舉報

ID:718523 發(fā)表于 2021-3-22 16:31 | 顯示全部樓層
glinfei 發(fā)表于 2021-3-22 15:39
unsigned char SendVal,char不是只有8位嗎?你傳16位給它是什么意思?

請問這個應(yīng)該怎么寫呢?
回復(fù)

使用道具 舉報

ID:275826 發(fā)表于 2021-3-22 16:34 | 顯示全部樓層

要仔細(xì)看,跟原來的差別
回復(fù)

使用道具 舉報

ID:123289 發(fā)表于 2021-3-22 16:46 | 顯示全部樓層
與硬件的接法有關(guān):
1、兩個595串接,即一個DATA輸入,則用16個CLK,達(dá)成目的,這時DATA端當(dāng)以序輸入10個0、6個1。
1、兩個595并接,即有兩個DATA輸入,DATA1、DATA2,則用8個CLK,達(dá)成目的,這時DATA1端當(dāng)以序輸入8個0,DATA2端當(dāng)以序輸入兩個0、及6個1。
回復(fù)

使用道具 舉報

ID:718523 發(fā)表于 2021-3-22 16:58 | 顯示全部樓層
yzwzfyz 發(fā)表于 2021-3-22 16:46
與硬件的接法有關(guān):
1、兩個595串接,即一個DATA輸入,則用16個CLK,達(dá)成目的,這時DATA端當(dāng)以序輸入10個0 ...

是串連的請問我的程序需要改哪里呢?
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2021-3-22 17:01 | 顯示全部樓層
forest415 發(fā)表于 2021-3-22 16:31
請問這個應(yīng)該怎么寫呢?

數(shù)據(jù)類型unsigned int
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #define  NOP() _nop_()  /* 定義空指令 */

  4. //SPI IO
  5. sbit MOSIO =P3^4;
  6. sbit R_CLK =P3^5;
  7. sbit S_CLK =P3^6;
  8. void HC595SendData(unsigned int SendVal);//向595發(fā)送數(shù)據(jù)

  9. main()
  10. {
  11. //        HC595SendData(0x00);//初始化595使他為高電平 讓LED處于熄滅狀態(tài)  
  12.         HC595SendData(0x003f);//0000000000111111  
  13.         while(1);
  14. }

  15. void HC595SendData(unsigned int SendVal)
  16. {  
  17.   unsigned char i;               
  18.   for(i=0;i<16;i++)
  19.    {
  20.         if((SendVal<<i)&0x8000) MOSIO=1;//由高位到低位傳送
  21.         else MOSIO=0;                                   

  22.         S_CLK=0;
  23.         NOP();        
  24.         NOP();
  25.         S_CLK=1;        
  26.    }
  27.         
  28.   R_CLK=0;
  29.   NOP();   
  30.   NOP();
  31.   R_CLK=1;
  32. }
復(fù)制代碼
回復(fù)

使用道具 舉報

ID:718523 發(fā)表于 2021-3-22 17:23 | 顯示全部樓層
wulin 發(fā)表于 2021-3-22 17:01
數(shù)據(jù)類型unsigned int

這個程序第二片595全部都是高電平
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2021-3-22 19:08 | 顯示全部樓層
forest415 發(fā)表于 2021-3-22 17:23
這個程序第二片595全部都是高電平

無標(biāo)題.jpg
回復(fù)

使用道具 舉報

ID:68800 發(fā)表于 2021-3-22 22:15 | 顯示全部樓層
#include<reg52.h>
#include <intrins.h>
#define  NOP() _nop_()  /* 定義空指令 */

//SPI IO
sbit MOSIO =P3^4;
sbit R_CLK =P3^5;
sbit S_CLK =P3^6;
void HC595SendData(unsigned char SendVal);//向595發(fā)送數(shù)據(jù)

main()
{HC595SendData(0xfc);//11111100先發(fā)第二片的從左往右移 入 左邊第一位在第二片的q7
  HC595SendData(0x00);//00000000  第一片的數(shù)據(jù)
}

void HC595SendData(unsigned char SendVal)
{  
  unsigned char i;               
  for(i=0;i<8;i++)
   {
        if((SendVal<<i)&0x80) MOSIO=1;
        else MOSIO=0;                                   

        S_CLK=0;
        NOP();        
        NOP();
        S_CLK=1;        
   }
        
  R_CLK=0;
  NOP();   
  NOP();
  R_CLK=1;

}
回復(fù)

使用道具 舉報

ID:332444 發(fā)表于 2021-3-23 10:02 | 顯示全部樓層
發(fā)送2次8位數(shù)據(jù),可看到下面的數(shù)據(jù)往上移動. 錄像14_轉(zhuǎn).gif
回復(fù)

使用道具 舉報

ID:126591 發(fā)表于 2021-3-23 18:06 | 顯示全部樓層
unsigned char SendVal這個怎么不是unsigned short呢
回復(fù)

使用道具 舉報

ID:884042 發(fā)表于 2021-3-24 19:15 | 顯示全部樓層
forest415 發(fā)表于 2021-3-22 16:31
請問這個應(yīng)該怎么寫呢?

unsigned char SendVal把它改成int型也就是unsigned int SendVal
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表