標題: Char型變量與Bit型變量,如何進行”或運算”。 [打印本頁]
作者: ≯叁界∝爵ャ 時間: 2018-12-2 00:03
標題: Char型變量與Bit型變量,如何進行”或運算”。
大神們,本人C語音小白。學習金沙工作時宋雪松老師《手把教你學 51 單片機 -C語音版》遇到不同變量直接的運算問題。
小人看C語言描述 :運算時 都是短字節向長字節轉換。如char型變量 & int型變量,進行運算時,是編譯器強制將char 轉換成int型。
但宋雪松老師講的如下:連續將key4值通過T0中斷,一位一位用“或運算“寫入char 型變量keybuf中。這與其他地方對不同變量的運算描述不符,請大神們賜教。小弟拜謝。
void InterruptTimer0() interrupt 1
{ static unsigned char keybuf = 0xFF; //按鍵掃描緩沖區,保存一段時間內的掃描值
TH0 = 0xF8; TL0 = 0xCD;
keybuf = (keybuf << 1) | KEY4; //只取KEY4為例,緩沖區左移一位,并將當前掃描值移入最低位
if (keybuf == 0x00)
{ //當連續8次掃描值都為0,即16ms內都只檢測到按下狀態時,可認為按鍵已按下
KeySta = 0; //按鍵狀態值為按下
}
else if (keybuf == 0xFF)
{ //當連續8次掃描值都為1,即16ms內都只檢測到彈起狀態時,可認為按鍵已彈起
KeySta = 1; //按鍵狀態值為彈起
}
作者: 聆煙雨 時間: 2018-12-2 02:38
char 變量與 bit 變量 或運算,也是把 bit 轉換成 char
看程序發現,這是個定時器中斷,中斷間隔為 2ms
KEY4 是個 bit,按下為0,彈起為1
keybuf 是個局部靜態變量,其值在函數退出后仍能保存。
程序執行流程:
1,當key被按下后,進入中斷,keybuf 當前值為 0xFF
2,由于機械按鍵存在抖動,所以要去抖,程序中采用了檢測8次的方法來去抖
3,keybuf = (keybuf << 1) | KEY4;
假定這次讀出的 KEY4 為0, keybuf 左移一位變成 b1111 1110 然后與 KEY4 或運算
注意此處進行了轉換,將 KEY4 的 bit 類型值轉換成 char, 二進制 b0000 0000
運算結束后, keybuf 結果為 0xFE ,用二進制表示為 1111 1110
2ms 后,第二次進中斷,如果 KEY4 還是 0 ,那么 keybuf 的值為 b1111 1100
4,如果進入中斷 8 次,讀出的 KEY4 都為 0, 那么 keybuf 的值就變成 0x00
5,由于抖動期間, KEY4 的值會變化 01,所以如果存在抖動,keybuf 的值就不是 b0000 0000
有可能是 b1100 0001 這樣的
作者: jll586 時間: 2018-12-2 16:16
10.1 數字秒表實驗10.1.1 不同數據間的類型轉換
在C語言中,不同數據類型之間是可以混合運算的。當表達式中的數據類型不一致時,首先轉換為同一種類型,然后再進行計算。C語言有兩種方法實現類型轉換,一是自動類型轉換,另外一種是強制類型轉換。這塊內容是比較繁雜的,因此我們根據我們常用的編程應用來講部分相關內容。
當不同數據類型之間混合運算的時候,不同類型的數據首先會轉換為同一類型,轉換的主要原則是:短字節的數據向長字節數據轉換。
比如:unsigned char a ; unsigned int b; unsigned int c; c = a *b;
在運算的過程中,程序會自動全部按照unsigned int型來計算。比如a=10,b=200,c的結果就是2000。那當a=100,b=700,那c是70000嗎?新手最容易犯這種錯誤,大家要注意每個變量的數據類型,c的數據類型是unsigned int型,取值范圍是0~65535,70000超過65535溢出了,所以最終c的結果是(70000 - 65536) = 4464。
那要想讓c正常獲得70000這個結果,需要把c定義成一個unsigned long型。我們如果寫成:unsigned char a=100; unsigned int b=700; unsigned long c=0; c = a *b;如果有做過實驗的同學,會發現這個c的結果還是4464,這個是個什么情況呢?
大家注意,C語言不同類型運算的時候數值會轉換同一類型運算,但是每一步運算都會進行識別判斷,不會進行一個總的分析判斷。比如我們這個程序,a和b相乘的時候,是按照unsigned int類型運算的,運算的結果也是unsigned int類型的4464,只是最終把unsigned int類型4464賦值給了一個unsigned long型的變量而已。我們在運算的時候如何避免這類問題的產生呢?可以采用強制類型轉換的方法。
在一個變量前邊加上一個變量類型,并且這個變量類型用小括號括起來,表示把這個變量強制轉換成括號里的變量類型。如 c = (unsigned long)a * b;由于強制類型轉換運算優先級高于*,所以這個地方的運算是先把a轉換成一個unsigned long型的變量,而后與b相乘,根據C語言的規則b會自動轉換成一個unsigned long型的變量,而后運算完畢結果也是一個unsigned long型的,最終賦值給了c。
當不同類型變量相互賦值時,短字節的數據向長字節的變量賦值時,值不變,比如unsigned char a=100; unsigned int b=700; b = a;那么最終b的值就是100了。但是如果我們的程序是unsigned char a=100; unsigned int b=700; a=b;那么a的值僅僅是取了b的低8位,我們首先要把700變成一個16位的二進制數據,然后取它的低8位出來,也就是188,這就是長字節給短字節賦值的結果。
在51單片機里邊,有一種特殊情況,就是bit類型的變量,這個bit類型的強制類型轉換,是不符合上邊講的這個原則的,比如bit a = 0; unsigned char b; a = (bit)b;這個地方要特別注意,使用bit做強制類型轉換,不是取b的最低位,而是他會判斷b這個變量是0還是非0的值,如果b是0,那么a的結果就是0,如果b是任意非0的其他數字,那么a的結果都是1。
這是咱們站里的學習資料或許對你有幫助
歡迎光臨 (http://www.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
成人av片在线观看
|
一区二区精品
|
国产精品色婷婷久久58
|
欧日韩在线
|
精品亚洲一区二区
|
国产精品久久一区二区三区
|
www.99精品
|
国产成年人小视频
|
亚洲精品久久久久久久不卡四虎
|
亚洲第一区久久
|
免费的色网站
|
成人乱人乱一区二区三区软件
|
日日天天
|
精品一区二区三区91
|
亚洲最新在线
|
a级免费观看视频
|
www国产亚洲精品
|
一区二区三区在线
|
99精品国产一区二区三区
|
91精品国产92
|
亚洲精品www久久久
www.蜜桃av
|
国产欧美在线一区
|
亚洲精品久久久一区二区三区
|
国产乡下妇女做爰
|
免费亚洲成人
|
人人人人爽|
国产精品视频偷伦精品视频
|
精品入口麻豆88视频
|
亚洲一区二区三区免费观看
|
亚洲欧美日韩中文在线
|
色综合天天天天做夜夜夜夜做
|
日日欧美
|
精品欧美|
精品99久久久久久
|
久久精品视频在线播放
|
中文福利视频
|
在线免费观看黄色网址
|
亚洲国产精品久久
|
成人 在线
|
亚洲精品成人
|
九九精品久久久
|