亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
看不懂單片機的移位程序
[打印本頁]
作者:
ddsj900l
時間:
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++);
}
}
本人自學請各位老師指教
作者:
hbnpmw
時間:
2018-9-29 19:56
key_v是上一次循環采集到的按鍵值,紅色第一行是判斷新掃描的鍵值與 key_v(上次值)不同,則進入if語句內,延時是為了去除按鍵按下時的抖動,之后再次讀取鍵值(讀取的目的是判斷按鍵仍舊在按下狀態,防止本次進入是因為干擾),同樣再次判斷鍵值;把本次獲得的鍵值賦值給上次的鍵值,最后一句就是對該按鍵的處理函數了,具體功能你分析proc_key函數可得到
作者:
飛云居士
時間:
2018-9-29 19:59
紅色一段程序,是延時后,再次讀鍵,如果兩次讀的鍵值一致,去處理按下的鍵。否側,是鍵在抖動。
作者:
飛云居士
時間:
2018-9-29 20:01
紅色的程序,是防鍵抖動程序。經延時后,再讀一次鍵值,如果一致,去處理鍵。否則的鍵的抖動。
作者:
冰純
時間:
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,這樣才可解碼啊
作者:
冰純
時間:
2018-9-29 22:51
上面有錯,漏打一句,if((key_v & 0x01) == 0)和 else if((key_v & 0x02) == 0)有問題?是否應==1和==10。
作者:
低奢內
時間:
2019-3-24 22:05
老師們,請問<<=和<<有什么區別啊?
作者:
wulin
時間:
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++);
}
}
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1