|
這個(gè)程序如果是用于訓(xùn)練邏輯思維還算能行。如果用于編程就純屬故弄玄虛,畫蛇添足。
如此簡單的事情為什么要搞得這么復(fù)雜?給你逐條注釋了,應(yīng)該能夠理解了。
#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()//此函數(shù)是為了把兩個(gè)bit型數(shù)據(jù)組合成無符號(hào)字符型數(shù)據(jù)。K1、K2默認(rèn)為1
{ //組合后成0000 0011,單獨(dú)按鍵后只會(huì)發(fā)生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) //判斷條件成立即為真,執(zhí)行以下語句
{
delayms(10);
key_s = scan_key();//延時(shí)后再讀取鍵值
if(key_s != key_v)//判斷條件成立即為真,執(zhí)行以下語句
{
key_v = key_s;//將有效鍵值賦值于key_v
proc_key(key_v);//將key_v作為參數(shù)傳輸給proc_key函數(shù)
}
}
}
}
void proc_key(unsigned char key_v)
{
if((key_v & 0x01) == 0)
{
P1 = _cror_(P1,1);//循環(huán)右移
}
else if((key_v & 0x02) == 0)
{
P1 = _crol_(P1,1);//循環(huán)左移
}
}
void delayms(unsigned char ms)
// 延時(shí)子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
} |
|