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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6201|回復: 2
打印 上一主題 下一主題
收起左側

Char型變量與Bit型變量,如何進行”或運算”。

[復制鏈接]
跳轉到指定樓層
樓主
ID:418269 發表于 2018-12-2 00:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
大神們,本人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;      //按鍵狀態值為彈起
  }

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:52586 發表于 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 這樣的

評分

參與人數 1黑幣 +100 收起 理由
admin + 100 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:357520 發表于 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。

這是咱們站里的學習資料或許對你有幫助
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费一区二区三区 | 久久久精品综合 | 久久y| 欧美在线一区二区三区 | 欧美日韩中文字幕 | 欧美亚洲成人网 | 天天综合网天天综合色 | 久久久久久综合 | 亚洲精品久久久一区二区三区 | 中文字幕电影在线观看 | 成人 在线 | 亚洲九九 | 久久久久久久久久久福利观看 | 亚洲黄色av | 一区二区三区精品在线 | 久久久久久久久一区 | 国产高清视频一区 | 国产91久久精品一区二区 | 欧美一级三级 | 日本久久精品 | 国产日韩欧美电影 | 999www视频免费观看 | 超碰免费在线观看 | 亚洲国产日韩一区 | 一级黄色片免费 | 日韩另类 | 亚洲在线| 精品免费国产一区二区三区四区 | 日本在线你懂的 | 国产成人综合久久 | 欧美日韩亚洲国产综合 | 蜜桃av人人夜夜澡人人爽 | 天天草天天| 欧美日韩精品一区 | 欧美黑人一区二区三区 | 国产精品久久久久久一区二区三区 | 欧美激情一区二区三级高清视频 | 国产目拍亚洲精品99久久精品 | 你懂的免费在线 | 一级黄色片日本 | 久久88|