標(biāo)題: 關(guān)于單片機(jī)傳送最高位date&0x80問題 [打印本頁]

作者: asp65    時間: 2020-3-4 17:53
標(biāo)題: 關(guān)于單片機(jī)傳送最高位date&0x80問題
請問各位大神,為何我畫出來的這一段寫法為這種,我知道date&0x80后判斷最高位狀態(tài),但是發(fā)送是不是發(fā)送的最低位嗎?那怎么實(shí)現(xiàn)把最高位先發(fā)送出去了,望各位發(fā)生解答。

IMG_20200304_174953.jpg (1.24 MB, 下載次數(shù): 76)

IMG_20200304_174953.jpg

作者: huangzongwu    時間: 2020-3-4 18:46
最高位一般是指符號位,所以不用發(fā)
作者: lovexulu    時間: 2020-3-4 18:49
看來樓主需要多看看C語言,
0x80的二進(jìn)制展開是1000 0000,即最高位是1,當(dāng)與一個數(shù)據(jù)(二進(jìn)制8字節(jié))做位與運(yùn)算時,D0-D6都為0,D7如果數(shù)據(jù)為1,則結(jié)果是0x80,如果D7為0,則結(jié)果為0x00,這樣就可以得到最高位的值了。
作者: adject    時間: 2020-3-4 20:03
MAX7219_pinDIN = DATA&0X80;
應(yīng)該是發(fā)送的0  因?yàn)镸AX7219_pinDIN  只能是0 或 1  DATA&0x80 可能是 0 或 0x80

可以這樣試試
for(i=0x80;i!= 0x01; i>>=1)
{
    if(i&DATA)
      {

         MAX7219_pinDIN = 1;
      }
    else  MAX7219_pinDIN =0;
}
或者

or(i=0;i<8;i++)
{
   
    if(0x01&(DATA>>(7-i)))
      {

         MAX7219_pinDIN = 1;
      }
    else  MAX7219_pinDIN =0;

作者: xuyaqi    時間: 2020-3-4 20:31
要仔細(xì)看MAX7219數(shù)據(jù)手冊,不是一兩句話可以給你說清楚。
作者: liu888888    時間: 2020-3-4 20:57
您好,您所遇到的困惑我當(dāng)年也遇到過,同感!
其實(shí)是這樣的:
              1.這段代碼寫的不太標(biāo)準(zhǔn),標(biāo)準(zhǔn)寫法是:  Max7219_pinDIN=(bit)DATA&0x80; 這里 “(bit)”是關(guān)鍵。
                2, 您有一個數(shù)據(jù)類型轉(zhuǎn)換慣性誤區(qū),認(rèn)為16位無符號UINT變量,在向8位無符號UCHAR類型變量賦值時,只能保留16位中的低8位;  由此您也得出  8位無符號變量在向1位bit類型變量傳送時只能保留最低位!
         但這是有個例外的: 8位uchar  轉(zhuǎn)變成 bit  類型時      保留的是  :      最高位   !!!   
      ————————知道這個規(guī)則后,例程中這段代碼就可輕易理解了,這種類型代碼您以后會經(jīng)常遇到。
作者: asp65    時間: 2020-3-5 09:30
liu888888 發(fā)表于 2020-3-4 20:57
您好,您所遇到的困惑我當(dāng)年也遇到過,同感!
其實(shí)是這樣的:
              1.這段代碼寫的不太標(biāo)準(zhǔn),標(biāo) ...

感謝你,哎困惑了好久。

作者: liu888888    時間: 2020-3-5 14:14
緊急更正一下:昨晚回復(fù)較倉促外加基礎(chǔ)不牢,文中有錯誤之處:
              標(biāo)準(zhǔn)寫法是:  Max7219_pinDIN=(bit)(DATA&0x80);
                掉了括號,否則編譯能通過,但實(shí)際運(yùn)行錯誤。
作者: haierzaifei11    時間: 2020-3-5 16:14
仔細(xì)看MAX7219數(shù)據(jù)手冊
作者: liu888888    時間: 2020-3-5 21:08
asp65 發(fā)表于 2020-3-5 09:30
感謝你,哎困惑了好久。

下午我繼續(xù)學(xué)習(xí)了一下數(shù)值轉(zhuǎn)換同時更正一下上文表述錯誤:  8位uchar變量  轉(zhuǎn)變成 bit  類型時  判斷的是 uchar變量是 0和非0兩種狀態(tài),對應(yīng)的bit變量值就是 0和1 兩種狀態(tài)值。
      
       代碼(DATA&0x80) 運(yùn)算的結(jié)果是將DATA 中低7位清零,那么此時判斷 運(yùn)算后 DATA 值是否是非零態(tài)只剩下最高位 bit7的值 是否是1。
      若此時bit7 位值 是1:則運(yùn)算后是:  0x80 ,非零值,bit類型轉(zhuǎn)換后   為 1 。
       若此時bit7 位值 是0:則運(yùn)算后是:  0x00 ,是0,   bit類型轉(zhuǎn)換后    為 0  。  
   這樣   這句 “ MAX7219_pinDIN = DATA&0X80;  ” 指令代碼就實(shí)現(xiàn)了 把DATA 最高位 賦值給了MAX7219_pinDIN 引腳。
       這樣解釋其實(shí)還有缺陷,因?yàn)閷?shí)際運(yùn)算中參與清零運(yùn)算的是DATA的一份拷貝值,DATA并未被真正清零,這牽扯到51匯編語言學(xué)習(xí)。            初期學(xué)習(xí)C記住這句代碼形式和功用 就可以了。我也是今天下午才理解透徹。
             ----------有誤之處,歡迎大俠拍磚。
      

作者: __Aknice    時間: 2021-3-29 23:01
試了一下4樓的代碼,發(fā)現(xiàn)并不行,然后自己琢磨寫了一下
這是我自己寫的代碼
k=DATA&0x80;
j=k>>7;
if(j==1)
        GPIO_SetBits(GPIOC,GPIO_Pin_3);
else
        GPIO_ResetBits(GPIOC,GPIO_Pin_3);
這樣應(yīng)該好理解了,在原來代碼的基礎(chǔ)上讓他賦值等于一個常量,然后把它右移7位,這就是他的最高位




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