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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2545|回復: 10
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
新手小白,正在學習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. }
復制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 (176.85 KB, 下載次數: 139)

Screenshot_20211013_221740_com.android.browser.jpg
回復

使用道具 舉報

5#
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;

}
回復

使用道具 舉報

6#
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;

}
回復

使用道具 舉報

7#
ID:332444 發表于 2021-10-14 09:12 | 只看該作者
回復

使用道具 舉報

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

使用道具 舉報

9#
ID:624769 發表于 2021-10-14 20:44 | 只看該作者
npn 發表于 2021-10-13 22:02
你還沒用過硬件SPI驅動,速度更快,完全沒有問題。

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

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

使用道具 舉報

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

說來 ...

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

使用道具 舉報

11#
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爱视频在线观看 | 日本午夜视频 | 国产网站在线免费观看 | 免费成人高清在线视频 | 国产精品久久久久久久久久久久冷 | 久久不卡 | 国产精品久久久久久一区二区三区 | 午夜影院| 男女视频在线观看网站 | 精品国产欧美一区二区三区成人 | 黄色片亚洲 | 一区二区视频 | 日韩另类 | 国产人成精品一区二区三 | 一区二区三区国产好 | 国内精品免费久久久久软件老师 | 日韩欧美视频在线 | 天堂中文在线播放 | 丁香综合| 99久久久国产精品 | 四虎影视一区二区 | 在线观看成人精品 | 国产精品永久免费视频 | 国产精品福利视频 | 欧美一区视频 | 久久国产视频播放 | 欧美二区在线 | 九九热精品在线视频 |