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

標題: 單片機LED點陣顯示程序問題,C語言移位不理解 [打印本頁]

作者: 22319956777    時間: 2020-8-4 16:02
標題: 單片機LED點陣顯示程序問題,C語言移位不理解
為什么在LED點陣顯示的時候里面的 通過 595 發送 2 個字節的數據 的函數中
SER = dat >> 7; //從最高位開始發送
dat <<= 1;
一位一位的給dat了那單片機是怎么得到的,
還有就是顯示的時候怎么一直用不到段選的數組
求大佬幫忙看看,謝謝!謝謝!

#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}; // 類 似 于 動態數碼管的段選
u8 ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; // 類 似 于動態數碼管的位選
void Hc595SendByte(u8 dat)
{ u8 a;
  SRCLK = 1; RCLK = 1;
for(a=0;a<8;a++) //發送 8 位數
{ SER = dat >> 7;
dat <<= 1;
SRCLK = 0; //發送時序
_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); } }
}


作者: liweimin    時間: 2020-8-4 16:43
右移7位就是最高位,然后每次再左移一個個取出來
作者: 青草麥田    時間: 2020-8-4 16:52
dat >> 7; 把dat的最高位移到最低位。其它位置用0補上,之后把這個值賦給SER,即如查那一位是1。P34就輸出1,如果為0就輸出0。dat <<= 1;數據左移。
作者: 藍魄    時間: 2020-8-4 17:10
說的問題不是很清楚,不是很明白你想要的知道什么。首先是單片機發送數據給595,dat<<=1;等同于dat=dat<<1;意思就是dat數據整體左移一位后再賦給dat,左移后的值覆蓋之前的值;還有LED1函數是怎么寫的,那里有沒有行或列的輸出。
作者: 22319956777    時間: 2020-8-4 17:59
藍魄 發表于 2020-8-4 17:10
說的問題不是很清楚,不是很明白你想要的知道什么。首先是單片機發送數據給595,dat

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

作者: 1692483014    時間: 2020-8-4 18:01
樓主是 想問單片機是怎么一個bit一個bit獲取到數據的吧!
實際上可以理解成DQ觸發器構成的移位寄存器,首先將要發送的bit電平在DAT輸入口放好,然后給觸發器的CLK口一個下降沿,這個BIT的數據就會送到觸發器的Q端,就相當于放到總線發送出去了。
然后重復上面的過程就可以發送所有的bit了。
如果想詳細了解,建議百度觸發器的類型 以及 移位寄存器的原理 等等。
作者: 22319956777    時間: 2020-8-4 18:22
1692483014 發表于 2020-8-4 18:01
樓主是 想問單片機是怎么一個bit一個bit獲取到數據的吧!
實際上可以理解成DQ觸發器構成的移位寄存器,首 ...

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


作者: wulin    時間: 2020-8-5 07:56
單片機發送的串行數據通過595轉換成并行數據輸出。重新整理一下便于樓主理解:
void Hc595SendByte(u8 dat)//參數dat是想要發送的數據
{
        u8 a;
        for(a=0;a<8;a++) //由高到低循環發送8位數據 (1個字節)
        {
                SER = dat >> 7;//將dat最高位賦值SER端口送到595
                SRCLK = 1; //移位脈沖 595內部現存數據由低到高移1位,SER狀態補入最低位
                _nop_();   //短暫延時
                _nop_();
                SRCLK = 0; //為下次移位準備
                dat <<= 1; //dat左移1位,最高位溢出,最低位補0
        }//
        RCLK = 1;     //鎖存脈沖,把595內部現存數據鎖存到輸出端口鎖存器輸出并行數據
        _nop_();    //短暫延時
        _nop_();
        RCLK = 0;    //為下次鎖存準備
}
作者: 22319956777    時間: 2020-8-5 08:37
wulin 發表于 2020-8-5 07:56
單片機發送的串行數據通過595轉換成并行數據輸出。重新整理一下便于樓主理解:
void Hc595SendByte(u8 dat ...

這樣就都理解了,謝謝,謝謝




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1