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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3306|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

單片機LED點陣顯示程序問題,C語言移位不理解

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:810884 發(fā)表于 2020-8-4 16:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
為什么在LED點陣顯示的時候里面的 通過 595 發(fā)送 2 個字節(jié)的數(shù)據(jù) 的函數(shù)中
SER = dat >> 7; //從最高位開始發(fā)送
dat <<= 1;
一位一位的給dat了那單片機是怎么得到的,
還有就是顯示的時候怎么一直用不到段選的數(shù)組
求大佬幫忙看看,謝謝!謝謝!

#include "reg51.h"
#include "intrins.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit SRCLK=P3^6; sbit RCLK=P3^5; sbit SER=P3^4;

u8 ledduan[]={0x00,0x00,0x3E,0x41,0x41,0x41,0x3E,0x00}; // 類 似 于 動態(tài)數(shù)碼管的段選
u8 ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; // 類 似 于動態(tài)數(shù)碼管的位選
void Hc595SendByte(u8 dat)
{ u8 a;
  SRCLK = 1; RCLK = 1;
for(a=0;a<8;a++) //發(fā)送 8 位數(shù)
{ SER = dat >> 7;
dat <<= 1;
SRCLK = 0; //發(fā)送時序
_nop_();
_nop_(); SRCLK = 1;
}

RCLK = 0;
_nop_(); _nop_(); RCLK = 1;
}void main() { u8 i=0;
while(1) { for(i=0;i<8;i++) { Hc595SendByte(ledwei); LED1(ledwei); delay(10); } }
}

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

使用道具 舉報

沙發(fā)
ID:313246 發(fā)表于 2020-8-4 16:43 | 只看該作者
右移7位就是最高位,然后每次再左移一個個取出來
回復(fù)

使用道具 舉報

板凳
ID:811253 發(fā)表于 2020-8-4 16:52 | 只看該作者
dat >> 7; 把dat的最高位移到最低位。其它位置用0補上,之后把這個值賦給SER,即如查那一位是1。P34就輸出1,如果為0就輸出0。dat <<= 1;數(shù)據(jù)左移。
回復(fù)

使用道具 舉報

地板
ID:86926 發(fā)表于 2020-8-4 17:10 | 只看該作者
說的問題不是很清楚,不是很明白你想要的知道什么。首先是單片機發(fā)送數(shù)據(jù)給595,dat<<=1;等同于dat=dat<<1;意思就是dat數(shù)據(jù)整體左移一位后再賦給dat,左移后的值覆蓋之前的值;還有LED1函數(shù)是怎么寫的,那里有沒有行或列的輸出。
回復(fù)

使用道具 舉報

5#
ID:810884 發(fā)表于 2020-8-4 17:59 | 只看該作者
藍(lán)魄 發(fā)表于 2020-8-4 17:10
說的問題不是很清楚,不是很明白你想要的知道什么。首先是單片機發(fā)送數(shù)據(jù)給595,dat

移位的運算我知道,就是有點不知道移位后是通過那個把這個8位給單片機的,請教一下
代碼是給的開發(fā)攻略復(fù)制過來的可能不小心刪了那個函數(shù)
void LED1(u8 dat1) { P0=dat1; }
回復(fù)

使用道具 舉報

6#
ID:804115 發(fā)表于 2020-8-4 18:01 | 只看該作者
樓主是 想問單片機是怎么一個bit一個bit獲取到數(shù)據(jù)的吧!
實際上可以理解成DQ觸發(fā)器構(gòu)成的移位寄存器,首先將要發(fā)送的bit電平在DAT輸入口放好,然后給觸發(fā)器的CLK口一個下降沿,這個BIT的數(shù)據(jù)就會送到觸發(fā)器的Q端,就相當(dāng)于放到總線發(fā)送出去了。
然后重復(fù)上面的過程就可以發(fā)送所有的bit了。
如果想詳細(xì)了解,建議百度觸發(fā)器的類型 以及 移位寄存器的原理 等等。
回復(fù)

使用道具 舉報

7#
ID:810884 發(fā)表于 2020-8-4 18:22 | 只看該作者
1692483014 發(fā)表于 2020-8-4 18:01
樓主是 想問單片機是怎么一個bit一個bit獲取到數(shù)據(jù)的吧!
實際上可以理解成DQ觸發(fā)器構(gòu)成的移位寄存器,首 ...

對對,有點懂了的樣子,請問這樣理解對嗎,是不是一個下降沿的時候會把SER掃一次,然后把地位存起來,

回復(fù)

使用道具 舉報

8#
ID:213173 發(fā)表于 2020-8-5 07:56 | 只看該作者
單片機發(fā)送的串行數(shù)據(jù)通過595轉(zhuǎn)換成并行數(shù)據(jù)輸出。重新整理一下便于樓主理解:
void Hc595SendByte(u8 dat)//參數(shù)dat是想要發(fā)送的數(shù)據(jù)
{
        u8 a;
        for(a=0;a<8;a++) //由高到低循環(huán)發(fā)送8位數(shù)據(jù) (1個字節(jié))
        {
                SER = dat >> 7;//將dat最高位賦值SER端口送到595
                SRCLK = 1; //移位脈沖 595內(nèi)部現(xiàn)存數(shù)據(jù)由低到高移1位,SER狀態(tài)補入最低位
                _nop_();   //短暫延時
                _nop_();
                SRCLK = 0; //為下次移位準(zhǔn)備
                dat <<= 1; //dat左移1位,最高位溢出,最低位補0
        }//
        RCLK = 1;     //鎖存脈沖,把595內(nèi)部現(xiàn)存數(shù)據(jù)鎖存到輸出端口鎖存器輸出并行數(shù)據(jù)
        _nop_();    //短暫延時
        _nop_();
        RCLK = 0;    //為下次鎖存準(zhǔn)備
}
回復(fù)

使用道具 舉報

9#
ID:810884 發(fā)表于 2020-8-5 08:37 | 只看該作者
wulin 發(fā)表于 2020-8-5 07:56
單片機發(fā)送的串行數(shù)據(jù)通過595轉(zhuǎn)換成并行數(shù)據(jù)輸出。重新整理一下便于樓主理解:
void Hc595SendByte(u8 dat ...

這樣就都理解了,謝謝,謝謝
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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