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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

關于單片機傳送最高位date&0x80問題

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

正文摘要:

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

回復

ID:372775 發表于 2021-3-29 23:01
試了一下4樓的代碼,發現并不行,然后自己琢磨寫了一下
這是我自己寫的代碼
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 發表于 2020-3-5 21:08
asp65 發表于 2020-3-5 09:30
感謝你,哎困惑了好久。

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

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

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲91精品 | 久久精品成人 | av男人的天堂av | 人人射人人插 | 精品久久久久久亚洲综合网站 | 久久久久久久国产精品 | 亚洲精品一区二区 | 亚洲一区中文字幕在线观看 | 亚洲 中文 欧美 日韩 在线观看 | 淫片一级国产 | 欧美精品一区二区三区在线播放 | 曰韩三级 | 激情av网站 | 国产高清精品一区二区三区 | 成人在线免费观看 | 欧美视频免费在线 | 久久亚洲一区二区三区四区 | 国产日韩欧美一区二区 | 最新国产视频 | 国产精品成人品 | 国产欧美一区二区三区在线播放 | 久久不射电影网 | 日本网站免费在线观看 | 国产欧美精品一区二区三区 | 91av在线免费观看 | 国产高清在线观看 | 精品无码久久久久久久动漫 | 欧美色性| 亚洲一区二区视频 | 国产精品一区二区在线 | 91高清视频在线观看 | 综合久久99 | 国产91精品久久久久久久网曝门 | 亚洲精品成人在线 | 热99精品视频 | 国产一区二区三区视频免费观看 | 亚洲一区二区三区在线视频 | 91精品国产一区二区三区 | 毛片网站在线观看 | 精品国产一区二区三区久久久久久 | 亚洲一区二区在线视频 |