51单片机里有许多寄存器(存储器),每个寄存器8位为一组,例如P1,P2等等。每一位连接有导线,导线连接驱动器,对应一个I/O口,驱动器能够增大驱动能力。CPU能够通过程序访问寄存器,给I/O口高电平或低电平,1是高电平,0是低电平。
正常情况下,寄存器P2口为高电平,灯不亮。当给任意一位低电平时,相应的灯才会亮。
正常情况下,P31,P30,P32,P33处于高电平。当按键按下,P3口与地相连,处于低电平。
按键控制LED亮灭
#include <REGX52.H>
void main()
{
while(1)
{
if(P3_0==0) //当P3_0按键按下
{
P2_0=0; //P2_0 LED灯亮
}
else
{
P2_0=1; //按键没有按下,灯不亮
}
}
}
按键控制LED显示二进制
#include <REGX51.H>
void Delay20ms() //@11.0592MHz 20ms延迟
{
unsigned char i, j, k;
i = 1;
j = 216;
k = 35;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
if(P3_1==0) //按键p3_1按下
{
Delay20ms(); //防抖处理
while(P3_1==0) ;//当P3_1按键按下没有松开,P3_1一直处于低电平,让它一直处于while循环,按键松开程序继续执行
Delay20ms(); //防抖处理
P2--; //p2口默认是高电平,初始值是1111 1111,灯全灭,每次按下让p2减一,实现LED表示二进制
}
}
}
独立按键控制LED移位
#include <REGX51.H>
void Delay20ms() //@11.0592MHz 20ms延迟
{
unsigned char i, j, k;
i = 1;
j = 216;
k = 35;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
unsigned char LED_num; //定义变量LED_num,没有赋值默认是0
P2=~0X01; //P2口初始值为0000 0001再取反1111 1110,只有一个灯亮
while(1)
{
if(P3_1==0) //当按键P3_1按下
{
Delay20ms(); //按键防抖
while(P3_1==0);//当P3_1按键按下没有松开,P3_1一直处于低电平,让它一直处于while循环,按键松开程序继续执行
Delay20ms(); //按键防抖
LED_num++; //按键P3_1按下松开一次,变量LED_num加1,
if(LED_num==8)//当LED_num为8时,重新赋值0
LED_num=0;
P2=~(0X01<<LED_num);//0000 0001左移再取反
}
if(P3_0==0)
{
Delay20ms();
while(P3_0==0);
Delay20ms();
LED_num--; //按键P3_0按下松开一次,变量LED_num减1,
if(LED_num==0XFF)//LED_num为无符号变量,0减1为255,16进制0XFF
LED_num=7; //重新赋值7
P2=~(0X01<<LED_num);//0000 0001左移取反
}
}
}