单片机零基础入门(6):独立按键控制LED移位
一、需求如下:
独立按键控制LED移位:
通过两个独立按键控制LED移位
-------需求------
1、按下按键1时,LED逐个往后移动;
1、按下按键2时,LED逐个往前移动;
二、需求分析:
-------分析-------
1、往后移动–>按下第一次时,LED1亮,其他灭;按下第二次时,LED2亮,其他灭;以此类推;
2、往前移动–>按下第一次时,前一次亮的LED(LED5)灭,前面一个LED(LED4)亮,以此类推。
三、源代码实现:
#include <REGX52.H>
#include <INTRINS.H>
/*独立按键控制LED状态
-----需求
1、独立按键控制LED移位
*/
void Delay(unsigned int xms)
{
while(xms)
{
unsigned char i,j;
i = 2;
j = 249;
do
{
while(--j);
}
while(--i);
xms--;
}
}
unsigned char LEDnum;
int main()
{
P2 = ~0X01;
while(1)
{
if(P3_1 == 0) //按键1按下
{
//消抖
Delay(20);
//检查按键是否松开
while(P3_1 ==0);
Delay(20);
LEDnum++;
if(LEDnum>=8) //判断是否溢出
LEDnum = 0;
P2 = ~(0X01<<LEDnum);
}
if(P3_0 == 0) //按键1按下
{
//消抖
Delay(20);
//检查按键是否松开
while(P3_0 ==0);
Delay(20);
if(LEDnum==0) //判断是否溢出
LEDnum = 7;
else
LEDnum--;
P2 = ~(0X01<<LEDnum);
}
}
}
四、原理图:
1、独立按键和单片机核心原理图:
2、LED模块原理图:
五、解释
1、分析解释:
(1)通过原理图可得出:独立按键1为:P3_1。按下为0,松开为1。P3_1 == 0即按下。
按键1按下时,LED灯第1个点亮,其他熄灭。然后再按下时,亮第二个,依次下去,故:P3_1 == 0条件下,P2 = ~0X01,LEDnum++;
(2)通过原理图可得出:独立按键2为:P3_0。按下为0,松开为1。P3_0 == 0即按下。
按键1按下时,LED灯第1个点亮,其他熄灭。然后再按下时,亮前一个,依次下去,故:P3_0 == 0条件下,P2 = ~0X01,LEDnum–;与(1)相反既可。
2、代码解释:
(1)void Delay(unsigned int xms) —>延时函数。
(2)P2 = ~0x01 —>按位取反。
十六进制:0x01-----转化为二进制—>0000 0001
0000 0001前面的文章中有写到点亮为0,熄灭为1.(原因:灯亮是因为两侧有电压差,当LED的正极接到VCC,负极接到单片机的P1.0上,当单片机的P1.0为高电平时,此时LED两端电压一样,电流不会流动,LED不会亮,只有当P1.0为低电平是,电流才会从VCC经过LED流向P1.0,再进过单片机内部形成回路,LED就会亮了,反之一样,当LED负极接GND,正极接P1.0,当P1.0置高电平时,LED也会亮,置于低电平时,LED不会亮。)
注意,很多人都容易把按位取反搞错了。
0x01—>0000 0001按位取反得出:1111 1110。故点亮1个LED灯,其他熄灭。
(3)LEDnum++ —> 往下移动一个LED灯。LEDnum–与之相反。
(4)LEDnum>=8和LEDnum0 都是判断按键是否溢出。LEDnum0 如果溢出等于0时,赋值7,返回第7个(LED为0-7)。
(5)P2 = ~(0x01<<LEDnum); —>点亮的灯依次往下执行。
-----------------人生在勤,不索何获!-------------