![]() |
發(fā)布時間: 2020-3-4 17:53
正文摘要:請問各位大神,為何我畫出來的這一段寫法為這種,我知道date&0x80后判斷最高位狀態(tài),但是發(fā)送是不是發(fā)送的最低位嗎?那怎么實現(xiàn)把最高位先發(fā)送出去了,望各位發(fā)生解答。 |
試了一下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位,這就是他的最高位 |
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記住這句代碼形式和功用 就可以了。我也是今天下午才理解透徹。 ----------有誤之處,歡迎大俠拍磚。 |
仔細看MAX7219數(shù)據(jù)手冊 |
緊急更正一下:昨晚回復較倉促外加基礎不牢,文中有錯誤之處: 標準寫法是: Max7219_pinDIN=(bit)(DATA&0x80); 掉了括號,否則編譯能通過,但實際運行錯誤。 |
liu888888 發(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)常遇到。 |
要仔細看MAX7219數(shù)據(jù)手冊,不是一兩句話可以給你說清楚。 |
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; |
看來樓主需要多看看C語言, 0x80的二進制展開是1000 0000,即最高位是1,當與一個數(shù)據(jù)(二進制8字節(jié))做位與運算時,D0-D6都為0,D7如果數(shù)據(jù)為1,則結(jié)果是0x80,如果D7為0,則結(jié)果為0x00,這樣就可以得到最高位的值了。 |
最高位一般是指符號位,所以不用發(fā) |
Powered by 單片機教程網(wǎng)