独立按键控制LED移位
所用到的电路图
一,独立按键模块,
JP1连接到单片机的P1口,接口一一对应的
二,LED模块,
J19连接到单片机的P2口,接口一一对应的
按键的小问题
解决方法: 在按下前面加个延时函数,渡过这时间段
代码一
#include <REGX51.h>
void Delay_ms(Xms) //延时函数
{
unsigned char i, j;
while(Xms>0)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
Xms--;
}
}
void main()
{
unsigned char LEDNum = 0;
P2 = 0xFE; //让D1点亮,其他灭
while(1)
{
if (P1_0 == 0) //前进按键
{
Delay_ms(20);
while(P1_0 == 0);
Delay_ms(20);
if (LEDNum == 7) //满了,重新置零
LEDNum = 0;
else
LEDNum++;
P2 = ~(0x01<<LEDNum);
}
if (P1_1 == 0) //后退按键
{
Delay_ms(20);
while(P1_1 == 0);
Delay_ms(20);
if(LEDNum == 0) //满了,重新置7
LEDNum = 7;
else
LEDNum--;
P2 = ~(0x01<<LEDNum);
}
}
}
分析代码:
<<代表左移一位,低位由0补全
是以LEDNum的大小为点亮的关键,一开始就是D1亮,通过LEDNum的大小,来决定移的大小
实验现象:
刚通上电的时候,D1点亮,
然后有两个选项,
①按K1,并且松开,D1灭,D2亮,以此类推,小的灭掉,大的亮起来,到最后D8灭,D1亮
②按K2,并且松开,D1灭,D8亮,以此类推,大的灭掉,小的亮起来
代码二:
#include <REGX51.h>
void Delay_ms(Xms);//延时函数
void main()
{
unsigned int Num = 0x01;
P2 = 0xFE; //让D1点亮,其他灭
while(1)
{
if (P1_0 == 0) //按下前进按键
{
Delay_ms(20);
while(P1_0 == 0);
Delay_ms(20);
if (Num == 0x00)
Num = 0x01;
if (Num > 0x80)
Num = 0x01;
else
Num = (Num << 1);
P2 = ~Num;
}
if (P1_1 == 0) //按下后退按键
{
Delay_ms(20);
while(P1_1 == 0);
Delay_ms(20);
if (Num < 0x01)
Num = 0x80;
else
Num = (Num >> 1);
P2 = ~Num;
}
}
}
void Delay_ms(Xms)
{
unsigned char i, j;
while(Xms>0)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
Xms--;
}
}
分析代码:
1,<<代表左移一位,低位由0补全
2.>>代表右移一位,高位由0补全
是通过Num的具体大小,进行取反,直接点亮LED
实验现象:
刚通上电的时候,D1点亮,
然后有两个选项,
①按K1,并且松开,D1灭,D2亮,以此类推,小的灭掉,大的亮起来,到最后D8灭,再按一下K1,并且松掉,D1才会亮
②按K2,并且松开,D1灭,再按一下K2,并且松掉,D8才会亮,以此类推,大的灭掉,小的亮起来