久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2365|回復: 10
收起左側

單片機74HC595程序有些地方看不懂

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

單片機源程序如下:
  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. }
復制代碼

回復

使用道具 舉報

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

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

使用道具 舉報

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

其實HC595頻 ...

你還沒用過硬件SPI驅動,速度更快,完全沒有問題。
回復

使用道具 舉報

ID:366464 發表于 2021-10-13 22:18 來自手機 | 顯示全部樓層
百度就知道!不懂先問度妹!
Screenshot_20211013_221740_com.android.browser.jpg
回復

使用道具 舉報

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

}
回復

使用道具 舉報

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

}
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

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

使用道具 舉報

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

說來 ...

硬件SPI 通常用于與內存卡、物聯網、USB模塊、攝像頭等高速傳輸數據,建議控制等長走線。
回復

使用道具 舉報

ID:624769 發表于 2021-10-18 20:48 | 顯示全部樓層
npn 發表于 2021-10-18 10:06
硬件SPI 通常用于與內存卡、物聯網、USB模塊、攝像頭等高速傳輸數據,建議控制等長走線。

硬件SPI通常用于,完整字節的傳輸, HC595根據應用的需要,有時候,只是移位用,此時用硬件SPI反而不方便。所以,不能一概而論。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产乱码精品一区二区三区忘忧草 | 亚洲精品麻豆 | 国产日韩欧美精品一区二区三区 | 亚洲国产精品99久久久久久久久 | a级在线免费观看 | 欧美二区在线 | 91在线精品秘密一区二区 | 亚洲一区视频 | 亚洲九色| 欧美激情视频网站 | 欧美一区二区三区在线 | 久久久99精品免费观看 | 亚洲成人国产综合 | 日韩在线精品强乱中文字幕 | 欧美a在线 | 中文字幕加勒比 | 一本综合久久 | 亚洲天堂一区 | 国产精品欧美精品日韩精品 | 欧美在线亚洲 | 久久高清精品 | www.狠狠干| 日韩三级免费观看 | 欧美不卡一区二区三区 | 一级黄色毛片免费 | 日韩精品一区二区三区久久 | 四虎影院欧美 | 91精品国产91久久久久久最新 | 国产视频h| 久久精彩视频 | 国内精品视频在线观看 | 三级视频在线观看 | 国产精品久久久久久久久久久免费看 | 国产区在线免费观看 | 日韩在线一区二区 | 国精产品一品二品国精在线观看 | 免费观看一级毛片 | 国产男人的天堂 | 久久1区 | 中文字幕高清在线 | 成人黄色在线视频 |