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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3151|回復: 7
收起左側

看不懂單片機的移位程序

[復制鏈接]
ID:403906 發表于 2018-9-29 15:45 | 顯示全部樓層 |閱讀模式
#include <reg51.h>
#include <intrins.h>

unsigned char scan_key();
void proc_key(unsigned char key_v);
void delayms(unsigned char ms);

sbit        K1 = P3^0;
sbit        K2 = P3^1;
unsigned char scan_key()
{
        unsigned char key_s;
        key_s = 0x00; //key_s=0x00;賦值
        key_s |= K2;     //key_s=key_s|k2
    key_s<<=1;      //key_s =key_s << 1;
        key_s |= K1;   //相當于key_s=key_s|k1
        return key_s;//  返回key_s的值
}
main()
{
        
        unsigned char key_s,key_v;
        key_v = 0x03;//既然key_v = 0x03為啥if(key_s != key_v) 沒有按鍵的時候為假?
        P1 = 0xfe;
        while(1)
        {
                key_s = scan_key();//scan_key()是另一個返回函數
                if(key_s != key_v) //以下的都是不懂請教各位老師
                {
                        delayms(10);
                        key_s = scan_key();//key_s 不等于 key_v時
                        if(key_s != key_v)
                        {        
                                key_v = key_s;//二者相等時        if(key_s != key_v)         為假,key_v位0x03
                                proc_key(key_v);                                       
                        }
                }
        }        
}



void proc_key(unsigned char key_v)
{
        if((key_v & 0x01) == 0)
        {
                P1 = _cror_(P1,1);
        }
        else if((key_v & 0x02) == 0)
        {
                P1 = _crol_(P1, 1);
        }
}

void delayms(unsigned char ms)        
// 延時子程序
{                                                
        unsigned char i;
        while(ms--)
        {
                for(i = 0; i < 120; i++);
        }
}
本人自學請各位老師指教

回復

使用道具 舉報

ID:277374 發表于 2018-9-29 19:56 | 顯示全部樓層
key_v是上一次循環采集到的按鍵值,紅色第一行是判斷新掃描的鍵值與 key_v(上次值)不同,則進入if語句內,延時是為了去除按鍵按下時的抖動,之后再次讀取鍵值(讀取的目的是判斷按鍵仍舊在按下狀態,防止本次進入是因為干擾),同樣再次判斷鍵值;把本次獲得的鍵值賦值給上次的鍵值,最后一句就是對該按鍵的處理函數了,具體功能你分析proc_key函數可得到

評分

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

查看全部評分

回復

使用道具 舉報

ID:404160 發表于 2018-9-29 19:59 | 顯示全部樓層
紅色一段程序,是延時后,再次讀鍵,如果兩次讀的鍵值一致,去處理按下的鍵。否側,是鍵在抖動。
回復

使用道具 舉報

ID:404160 發表于 2018-9-29 20:01 | 顯示全部樓層
紅色的程序,是防鍵抖動程序。經延時后,再讀一次鍵值,如果一致,去處理鍵。否則的鍵的抖動。
回復

使用道具 舉報

ID:261288 發表于 2018-9-29 21:06 | 顯示全部樓層
這段程序是判斷按鍵(K2;K1)是否被按下,key_s的值寫為二進制為0000 00K2K1,只要不等于0x03,代表有鍵被按下,接著延時消抖再判斷一次,如為“真”,則key_s(當前值)賦值給key_v,再運行proc_key(key_v)。但 if((key_v & 0x01) == 0)和 else if((key_v & 0x02) == 0)有問題?是否應==1,這樣才可解碼啊
回復

使用道具 舉報

ID:261288 發表于 2018-9-29 22:51 | 顯示全部樓層
上面有錯,漏打一句,if((key_v & 0x01) == 0)和 else if((key_v & 0x02) == 0)有問題?是否應==1和==10。
回復

使用道具 舉報

ID:405642 發表于 2019-3-24 22:05 來自觸屏版 | 顯示全部樓層
老師們,請問<<=和<<有什么區別啊?
回復

使用道具 舉報

ID:213173 發表于 2019-3-25 08:55 | 顯示全部樓層
這個程序如果是用于訓練邏輯思維還算能行。如果用于編程就純屬故弄玄虛,畫蛇添足。
如此簡單的事情為什么要搞得這么復雜?給你逐條注釋了,應該能夠理解了。
#include <reg51.h>
#include <intrins.h>

unsigned char scan_key();
void proc_key(unsigned char key_v);
void delayms(unsigned char ms);
sbit        K1 = P3^0;
sbit        K2 = P3^1;
unsigned char scan_key()//此函數是為了把兩個bit型數據組合成無符號字符型數據。K1、K2默認為1
{                                        //組合后成0000 0011,單獨按鍵后只會發生2種變化:0000 0010 和 0000 0001
        unsigned char key_s;
        key_s = 0x00; //key_s=0x00;賦初值
        key_s |= K2;  //把K2理解為0000 0001 加 0000 0000,key_s=0000 0001
        key_s<<=1;      //key_s 左移1,key_s=0000 0010
        key_s |= K1;   //把K1理解為0000 0001 加 0000 0010,key_s=0000 0011
        return key_s;        //無鍵按下返回key_s的鍵值0x03,有鍵按下鍵返回的鍵值0x01或0x02
}
void main()
{       
        unsigned char key_s,key_v;
        key_v = 0x03;
        P1 = 0xfe;
        while(1)
        {
                key_s = scan_key();//讀取鍵值
                if(key_s != key_v) //判斷條件成立即為真,執行以下語句
                {
                        delayms(10);
                        key_s = scan_key();//延時后再讀取鍵值
                        if(key_s != key_v)//判斷條件成立即為真,執行以下語句
                        {        
                                key_v = key_s;//將有效鍵值賦值于key_v
                                proc_key(key_v);//將key_v作為參數傳輸給proc_key函數
                        }
                }
        }        
}

void proc_key(unsigned char key_v)
{
        if((key_v & 0x01) == 0)
        {
                P1 = _cror_(P1,1);//循環右移
        }
        else if((key_v & 0x02) == 0)
        {
                P1 = _crol_(P1,1);//循環左移
        }
}

void delayms(unsigned char ms)        
// 延時子程序
{                                                
        unsigned char i;
        while(ms--)
        {
                for(i = 0; i < 120; i++);
        }
}
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品九九九 | 亚洲视频免费一区 | 国产91在线精品 | 日本人做爰大片免费观看一老师 | 高清人人天天夜夜曰狠狠狠狠 | 久久精品视频9 | 成人性生交大片免费看中文带字幕 | 久久91视频 | 夫妻午夜影院 | 亚洲精品中文字幕 | 日韩国产在线观看 | 精品综合久久久 | 毛片免费看 | 一区视频| 国产精品欧美一区二区三区不卡 | 国产精品夜色一区二区三区 | 午夜精品久久久 | 国产综合欧美 | 四虎影视免费观看 | 亚洲精品电影网在线观看 | 91国产在线播放 | 2018国产精品 | 国产视频欧美 | 精品久久一区 | 成人在线免费视频 | 国产精品一区二区久久久久 | 亚洲一区二区三区在线视频 | 日韩在线观看一区 | 九九综合九九 | 国产特黄一级 | 日韩在线视频免费观看 | 久草成人 | 九九热热九九 | 日韩精品免费视频 | 亚洲一区二区视频 | 福利一区二区在线 | 国产精品成人一区二区三区夜夜夜 | 日韩精品成人免费观看视频 | 一区二区三区四区在线 | 中文区中文字幕免费看 | 久久精品色欧美aⅴ一区二区 |