欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)74HC595程序有些地方看不懂

[復(fù)制鏈接]
ID:890956 發(fā)表于 2021-10-13 19:34 | 顯示全部樓層 |閱讀模式
新手小白,正在學(xué)習(xí)74HC595,找了一串代碼,有些地方看不懂,各位大佬幫忙解釋一下。
1.dat可以幫忙解釋一下嗎,沒有定義為什么沒有報(bào)錯(cuò)?
2._nop_();為什么要連用兩次,可以用一次嗎,用一次和用兩次有什么區(qū)別?
3.P0=0x7f;在這里是控制第一列的吧(這個(gè)不太確定),可以不加嗎?

單片機(jī)源程序如下:
  1. #include "reg51.h"                        
  2. #include<intrins.h>


  3. typedef unsigned int u16;         
  4. typedef unsigned char u8;


  5. sbit SRCLK=P3^6;
  6. sbit RCLK=P3^5;
  7. sbit SER=P3^4;


  8. u8 ledduan[]={0x38,0x44,0x42,0x21,0x42,0x44,0x38,0x00};
  9. u8 ledwei[]={0x7f
  10. ,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

  11. void delay(u16 i)
  12. {
  13.         while(i--);        
  14. }
  15. void Hc595SendByte(u8 dat)
  16. {
  17.         u8 a;
  18.         SRCLK=0;
  19.         RCLK=0;
  20.         for(a=0;a<8;a++)
  21.         {
  22.                 SER=dat>>7;
  23.                 dat<<=1;


  24.                 SRCLK=1;
  25.                 _nop_();
  26.                 _nop_();
  27.                 SRCLK=0;        
  28.         }


  29.         RCLK=1;
  30.         _nop_();
  31.         _nop_();
  32.         RCLK=0;
  33. }

  34. void main()
  35. {                        
  36.         u8 i;
  37.         while(1)
  38.         {
  39.                 P0=0x7f;
  40.                 for(i=0;i<8;i++)
  41.                 {
  42.                         P0=ledwei[i];                  
  43.                         Hc595SendByte(ledduan[i]);
  44.                         delay(100);                  
  45.                         Hc595SendByte(0x00);  
  46.                 }        
  47.         }               
  48. }
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2021-10-13 20:42 | 顯示全部樓層
用一次就是等一拍,用兩次就是等兩拍,只用一個(gè),就是等的時(shí)間少了,根據(jù)你實(shí)際需求決定。

其實(shí)HC595頻率可以高達(dá)27MHz, 如果你單片機(jī)的速度沒有比他高,完全可以不用 NOP。反正我寫HC595代碼時(shí)從來不用NOP。
回復(fù)

使用道具 舉報(bào)

ID:57657 發(fā)表于 2021-10-13 22:02 | 顯示全部樓層
188610329 發(fā)表于 2021-10-13 20:42
用一次就是等一拍,用兩次就是等兩拍,只用一個(gè),就是等的時(shí)間少了,根據(jù)你實(shí)際需求決定。

其實(shí)HC595頻 ...

你還沒用過硬件SPI驅(qū)動(dòng),速度更快,完全沒有問題。
回復(fù)

使用道具 舉報(bào)

ID:366464 發(fā)表于 2021-10-13 22:18 來自觸屏版 | 顯示全部樓層
百度就知道!不懂先問度妹!
Screenshot_20211013_221740_com.android.browser.jpg
回復(fù)

使用道具 舉報(bào)

ID:839438 發(fā)表于 2021-10-14 08:05 | 顯示全部樓層
你這個(gè)是驅(qū)動(dòng)數(shù)碼管的,最近也是在研究595 ,有的程序就沒有nop ,這個(gè)是延時(shí)手冊上有,dat 這個(gè)傳參,我給你一個(gè)控制24個(gè)led 可以參考一下,我這個(gè)是最近抄的,多個(gè)可以這樣一直下去
H595Sendbyte(0xff,0xff,0xff);
#include "74HC595.h"
sbit SRCLK=P3^2;//移位寄存器時(shí)鐘(上升沿有效)
sbit RCLK=P3^3;//存儲寄存器時(shí)鐘(上升沿有效)
sbit sid=P4^3; //液晶LCD的sid與74hc595的ds工用
        /**
* @brief  595驅(qū)動(dòng)函數(shù)
* @param  無
* @retval * 3個(gè)聯(lián)級74HC595的工作過程:
* 每個(gè)74HC595內(nèi)部都有一個(gè)8位的寄存器,兩個(gè)聯(lián)級起來就有兩個(gè)寄存器。ST引腳就相當(dāng)于一個(gè)刷新
* 信號引腳,當(dāng)ST引腳產(chǎn)生一個(gè)上升沿信號時(shí),就會把寄存器的數(shù)值輸出到74HC595的輸出引腳并且鎖存起來,
* sid是數(shù)據(jù)引腳,SH是把新數(shù)據(jù)送入寄存器的時(shí)鐘信號。也就是說,srclk引腳負(fù)責(zé)把數(shù)據(jù)送入到寄存器里,rclk引腳
* 負(fù)責(zé)把寄存器的數(shù)據(jù)更新輸出到74HC595的輸出引腳上并且鎖存起來。
**/
void  H595Sendbyte(u8 dat1,u8 dat2,u8 dat3) //595輸出函數(shù),         dat1 第一個(gè)595, dat2 第二個(gè) dat3 第三個(gè)
{
        unsigned char i;
        for(i = 0; i < 8; i ++)
        {
                if(dat3 >= 0x80)
                {
                        sid = 1;
                }
                else
                {
                        sid = 0;
                }
                SRCLK = 0;        /*引腳的上升沿把數(shù)據(jù)送入寄存器*/
                  _nop_();
      _nop_();
                SRCLK = 1;                       
                dat3 = dat3 <<1;
        }
        for(i = 0; i < 8; i ++)
        {
                if(dat2 >= 0x80)
                {
                        sid = 1;
                }
                else
                {
                        sid = 0;
                }
                SRCLK = 0;        /*Srck引腳的上升沿把數(shù)據(jù)送入寄存器*/
                  _nop_();
      _nop_();
                SRCLK = 1;                       
                dat2 = dat2 <<1;
        }
        //temp = dat1;        /*再先送低8位*/
        for(i = 0; i < 8; i ++)
        {
                if(dat1 >= 0x80)
                {
                        sid = 1;
                }
                else
                {
                        sid = 0;
                }
                 SRCLK = 0;        /*SH引腳的上升沿把數(shù)據(jù)送入寄存器*/
                  _nop_();
      _nop_();
                 SRCLK = 1;
                 dat1 = dat1 <<1;
        }
       
            RCLK = 0;        /*rclk引腳把3個(gè)寄存器的數(shù)據(jù)更新輸出到74HC595的輸出引腳上并且鎖存起來*/
            _nop_();
      _nop_();
            RCLK = 1;

}
回復(fù)

使用道具 舉報(bào)

ID:839438 發(fā)表于 2021-10-14 08:23 | 顯示全部樓層
1.dat 沒有定義,就沒辦法傳參數(shù),
2._nop_();有的程序都沒有這句,只是延時(shí)的時(shí)間稍微長一點(diǎn)
我最近也在研究595,給你一個(gè)595驅(qū)動(dòng)24個(gè)led 參考一下 如果是n個(gè)可以這么一直寫下去
void  H595Sendbyte(u8 dat1,u8 dat2,u8 dat3) //595輸出函數(shù),         dat1 第一個(gè)595, dat2 第二個(gè) dat3 第三個(gè)
{
        unsigned char i;
//        temp=dat3;
        for(i = 0; i < 8; i ++)
        {
                if(dat3 >= 0x80)
                {
                        sid = 1;
                }
                else
                {
                        sid = 0;
                }
                SRCLK = 0;        /*引腳的上升沿把數(shù)據(jù)送入寄存器*/
                  _nop_();
      _nop_();
                SRCLK = 1;                       
                dat3 = dat3 <<1;
        }
        for(i = 0; i < 8; i ++)
        {
                if(dat2 >= 0x80)
                {
                        sid = 1;
                }
                else
                {
                        sid = 0;
                }
                SRCLK = 0;        /*Srck引腳的上升沿把數(shù)據(jù)送入寄存器*/
                  _nop_();
      _nop_();
                SRCLK = 1;                       
                dat2 = dat2 <<1;
        }
        //temp = dat1;        /*再先送低8位*/
        for(i = 0; i < 8; i ++)
        {
                if(dat1 >= 0x80)
                {
                        sid = 1;
                }
                else
                {
                        sid = 0;
                }
                 SRCLK = 0;        /*SH引腳的上升沿把數(shù)據(jù)送入寄存器*/
                  _nop_();
      _nop_();
                 SRCLK = 1;
                 dat1 = dat1 <<1;
        }
       
            RCLK = 0;        /*rclk引腳把3個(gè)寄存器的數(shù)據(jù)更新輸出到74HC595的輸出引腳上并且鎖存起來*/
            _nop_();
      _nop_();
            RCLK = 1;

}
回復(fù)

使用道具 舉報(bào)

ID:332444 發(fā)表于 2021-10-14 09:12 | 顯示全部樓層
回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2021-10-14 09:31 | 顯示全部樓層
單片機(jī)執(zhí)行每一條指令都是需要時(shí)間的,
RCLK=1之后需要保持一段時(shí)間,就用NOP來耗時(shí)間,其實(shí)用其它指令也同樣能達(dá)成目的。
用多少個(gè),與需要延時(shí)量決定,你需要查看595的手冊,了解這個(gè)時(shí)間量!
關(guān)鍵:是你對595的了解不夠!
P0=0x7問題,需要你結(jié)合原理圖,看P0口的接線。同樣也需要你對595的了解透徹。
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2021-10-14 20:44 | 顯示全部樓層
npn 發(fā)表于 2021-10-13 22:02
你還沒用過硬件SPI驅(qū)動(dòng),速度更快,完全沒有問題。

HC595嚴(yán)格來講,屬于移位寄存器,雖然,也可以用硬件SPI來傳輸,但是自由度不如軟件控制來的高。

說來也奇怪,DS1302, 用硬件SPI傳輸會很爽,但是卻沒有人研究,還一個(gè)個(gè)的都說不是SPI,其實(shí)只是雙線SPI用的少而已。反而HC595這種,本不是SPI,卻特別熱衷SPI傳輸。
回復(fù)

使用道具 舉報(bào)

ID:57657 發(fā)表于 2021-10-18 10:06 | 顯示全部樓層
188610329 發(fā)表于 2021-10-14 20:44
HC595嚴(yán)格來講,屬于移位寄存器,雖然,也可以用硬件SPI來傳輸,但是自由度不如軟件控制來的高。

說來 ...

硬件SPI 通常用于與內(nèi)存卡、物聯(lián)網(wǎng)、USB模塊、攝像頭等高速傳輸數(shù)據(jù),建議控制等長走線。
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2021-10-18 20:48 | 顯示全部樓層
npn 發(fā)表于 2021-10-18 10:06
硬件SPI 通常用于與內(nèi)存卡、物聯(lián)網(wǎng)、USB模塊、攝像頭等高速傳輸數(shù)據(jù),建議控制等長走線。

硬件SPI通常用于,完整字節(jié)的傳輸, HC595根據(jù)應(yīng)用的需要,有時(shí)候,只是移位用,此時(shí)用硬件SPI反而不方便。所以,不能一概而論。
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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