51单片机100例实例之13例
//项目名称:4只按键分组控制LED
//项目再创作者:科技小宅神
//完成时间:2021/01/21
//功能说明:每次按下K1逐次点亮LED,全亮时再次按下则循环开始
//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)//无限循环
{
t = P1;//令t=P1
{
DelayMS(10);
if(t != P1)
continue;
Key_State = ~t >> 4;//取得4位按键值,也就是读取P1.0~P1.3的电位状态。先取反后移位,位运算符优先级~大于>>。
k = 0;
while(Key_State != 0)//即P1.0~P1.3的按键值不等于0x00时
{
k++;
Key_State >>= 1;//将Key_State向右移动1位,再赋值给Key_State。先运算再赋值。(复合赋值运算)注意是这里是算术右移!
}
switch(k)//根据按键号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 全部关闭
}
}
}
}