找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

關(guān)于單片機傳送最高位date&0x80問題

查看數(shù): 6303 | 評論數(shù): 10 | 收藏 5
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2020-3-4 17:53

正文摘要:

請問各位大神,為何我畫出來的這一段寫法為這種,我知道date&0x80后判斷最高位狀態(tài),但是發(fā)送是不是發(fā)送的最低位嗎?那怎么實現(xiàn)把最高位先發(fā)送出去了,望各位發(fā)生解答。

回復

ID:372775 發(fā)表于 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);
這樣應該好理解了,在原來代碼的基礎上讓他賦值等于一個常量,然后把它右移7位,這就是他的最高位
ID:433166 發(fā)表于 2020-3-5 21:08
asp65 發(fā)表于 2020-3-5 09:30
感謝你,哎困惑了好久。

下午我繼續(xù)學習了一下數(shù)值轉(zhuǎn)換同時更正一下上文表述錯誤:  8位uchar變量  轉(zhuǎn)變成 bit  類型時  判斷的是 uchar變量是 0和非0兩種狀態(tài),對應的bit變量值就是 0和1 兩種狀態(tài)值。
      
       代碼(DATA&0x80) 運算的結(jié)果是將DATA 中低7位清零,那么此時判斷 運算后 DATA 值是否是非零態(tài)只剩下最高位 bit7的值 是否是1。
      若此時bit7 位值 是1:則運算后是:  0x80 ,非零值,bit類型轉(zhuǎn)換后   為 1 。
       若此時bit7 位值 是0:則運算后是:  0x00 ,是0,   bit類型轉(zhuǎn)換后    為 0  。  
   這樣   這句 “ MAX7219_pinDIN = DATA&0X80;  ” 指令代碼就實現(xiàn)了 把DATA 最高位 賦值給了MAX7219_pinDIN 引腳。
       這樣解釋其實還有缺陷,因為實際運算中參與清零運算的是DATA的一份拷貝值,DATA并未被真正清零,這牽扯到51匯編語言學習。            初期學習C記住這句代碼形式和功用 就可以了。我也是今天下午才理解透徹。
             ----------有誤之處,歡迎大俠拍磚。
      
ID:679425 發(fā)表于 2020-3-5 16:14
仔細看MAX7219數(shù)據(jù)手冊
ID:433166 發(fā)表于 2020-3-5 14:14
緊急更正一下:昨晚回復較倉促外加基礎不牢,文中有錯誤之處:
              標準寫法是:  Max7219_pinDIN=(bit)(DATA&0x80);
                掉了括號,否則編譯能通過,但實際運行錯誤。
ID:282021 發(fā)表于 2020-3-5 09:30
liu888888 發(fā)表于 2020-3-4 20:57
您好,您所遇到的困惑我當年也遇到過,同感!
其實是這樣的:
              1.這段代碼寫的不太標準,標 ...

感謝你,哎困惑了好久。
ID:433166 發(fā)表于 2020-3-4 20:57
您好,您所遇到的困惑我當年也遇到過,同感!
其實是這樣的:
              1.這段代碼寫的不太標準,標準寫法是:  Max7219_pinDIN=(bit)DATA&0x80; 這里 “(bit)”是關(guān)鍵。
                2, 您有一個數(shù)據(jù)類型轉(zhuǎn)換慣性誤區(qū),認為16位無符號UINT變量,在向8位無符號UCHAR類型變量賦值時,只能保留16位中的低8位;  由此您也得出  8位無符號變量在向1位bit類型變量傳送時只能保留最低位!
         但這是有個例外的: 8位uchar  轉(zhuǎn)變成 bit  類型時      保留的是  :      最高位   !!!   
      ————————知道這個規(guī)則后,例程中這段代碼就可輕易理解了,這種類型代碼您以后會經(jīng)常遇到。
ID:94031 發(fā)表于 2020-3-4 20:31
要仔細看MAX7219數(shù)據(jù)手冊,不是一兩句話可以給你說清楚。
ID:419968 發(fā)表于 2020-3-4 20:03
MAX7219_pinDIN = DATA&0X80;
應該是發(fā)送的0  因為MAX7219_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;
ID:687694 發(fā)表于 2020-3-4 18:49
看來樓主需要多看看C語言,
0x80的二進制展開是1000 0000,即最高位是1,當與一個數(shù)據(jù)(二進制8字節(jié))做位與運算時,D0-D6都為0,D7如果數(shù)據(jù)為1,則結(jié)果是0x80,如果D7為0,則結(jié)果為0x00,這樣就可以得到最高位的值了。
ID:496117 發(fā)表于 2020-3-4 18:46
最高位一般是指符號位,所以不用發(fā)

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

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

快速回復 返回頂部 返回列表