51單片機100例實例之13例
?//項目名稱:4只按鍵分組控制LED
//項目再創(chuàng)作者:科技小宅神
//完成時間:2021/01/21
//功能說明:每次按下K1逐次點亮LED,全亮時再次按下則循環(huán)開始
//K2按下,點亮上4只LED,K3按下,點亮下4只LED,K4按下關閉所有LED

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
//1毫秒延時子程序
void DelayMS(uint x)
{
? uchar t;
while(x--)
{
for(t=0;t<120;t--);
}
}
//主程序
void main()
{
? uchar k,t,Key_State;
P0 = 0xff;
P1 = 0xff;
while(1)//無限循環(huán)
{
t = P1;//令t=P1
{
DelayMS(10);
if(t != P1)
continue;
Key_State = ~t >> 4;//取得4位按鍵值,也就是讀取P1.0~P1.3的電位狀態(tài)。先取反后移位,位運算符優(yōu)先級~大于>>。
k = 0;
while(Key_State != 0)//即P1.0~P1.3的按鍵值不等于0x00時
{
k++;
Key_State >>= 1;//將Key_State向右移動1位,再賦值給Key_State。先運算再賦值。(復合賦值運算)注意是這里是算術右移!
}
switch(k)//根據(jù)按鍵號K進行4種處理
{
case 1: if(P0 == 0x00)//如果P0全部接低電平
P0 = 0xff;//那么P0全部1111 1111
P0 <<= 1;//將P0向左移動1位,再賦值給P0。先運算再賦值。(復合賦值運算)(逐增點亮)注意是這里是算術左移!
DelayMS(200);
break;//
case 2: P0 = 0xf0;//1111 0000 上四個點亮
break;
case 3: P0 = 0x0f;//0000 1111 下四個點亮
break;
case 4: P0 = 0xff;//1111 1111 全部關閉
}
}
}
}