单片机学习笔记-按键控制LED流水灯
按键控制LED流水灯
1.按键实现LED显示二进制
(1).延迟函数
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
(2).主函数内部主要是消抖功能
对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。
void main()
{
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDnum++;
P2=~(LEDnum);
}
}
}
(3).全部代码演示
#include <REGX52.H>
unsigned char LEDnum=0;
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void main()
{
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDnum++;
P2=~(LEDnum);
}
}
}
2.按键控制LED位移
(1).按键P3_1设置为右移
if (P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDnum++;
if(LEDnum>=8)
{
LEDnum=0;
}
P2=~(0x01<<LEDnum);
}
LEDnum为移动位数,当LEDnum>=8时,要让他置零
(2).按键P3_0设置为左移
if (P3_0==0)
{
Delay(20);
while(P3_0==0);
Delay(20);
if(LEDnum<=0)
{
LEDnum=7;
}
else
LEDnum--;
P2=~(0x01<<LEDnum);
}
LEDnum为移动位数,当LEDnum<=0时,让他返回7。
(3).全部代码展示
#include <REGX52.H>
unsigned char LEDnum=0;
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void main()
{
P2=~(0x01);
while(1)
{
if (P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDnum++;
if(LEDnum>=8)
{
LEDnum=0;
}
P2=~(0x01<<LEDnum);
}
if (P3_0==0)
{
Delay(20);
while(P3_0==0);
Delay(20);
if(LEDnum<=0)
{
LEDnum=7;
}
else
LEDnum--;
P2=~(0x01<<LEDnum);
}
}
}
本人为初学者,如有错误,还请指正。