发光二极管
- 符号图
- 实物图:
LED模块
-
右边接电源是高电平,只有左边是低电平时,灯才会亮
-
例如:
1111 1101 就是第二个灯亮
写代码时转为十六进制表示即可(0xFD)
-
控制LED模块的寄存器为P2,所以操作P2就能够实现基本点灯
独立按键模块
- 看对应按键引出编号对应的I/O口
-
可以看出四个按键分别对应P3.1、P3.0、P3.2、P3.3
-
单片机上电时,I/O口默认为高电平,按键按下变为低电平
-
用独立按键控制LED亮灭不能用八位寄存器,要单独操作位寄存器,在库函数种找到P2的sbit(库函数<REG52.H>没有位声明)
按键的消抖
- 对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。
-
按键消抖代码:
Delay(20);
//按下消除抖动while(P3_1==0);
//检测是否松手Delay(20);
//松手消除抖动
keil代码示例
1. 点亮LED
#include <REGX52.H>
void main()
{
P2 = 0x00; //0000 0000
while(1);
}
2. LED闪烁
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms() //延时函数
{
unsigned char data i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
P2 = 0xFE;
Delay500ms();
P2 = 0xFF;
Delay500ms();
}
3. LED流水灯
#include <REG52.H>
void Delay(unsigned int xms);
void main()
{
while(1)
{
P2=0xFE;//1111 1110
Delay(1000);
P2=0xFD;//1111 1101
Delay(100);
P2=0xFB;//1111 1011
Delay(1000);
P2=0xF7;//1111 0111
Delay(1000);
P2=0xEF;//1110 1111
Delay(100);
P2=0xDF;//1101 1111
Delay(100);
P2=0xBF;//1011 1111
Delay(1000);
P2=0x7F;//0111 1111
Delay(100);
}
}
void Delay(unsigned int xms)
{
unsigned char data i, j, k;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
}
while (--i);
xms--;
}
}
4. 独立按键控制LED
#include <REGX52.H>
void main()
{
while(1)
{
if(P3_1==0)//K1被按下
{
P2_0=0;
}else{
P2_0=1;
}
}
}
5. 独立按键控制LED状态
#include <REGX52.H>
void Delay(unsigned int xms);
void Delay(unsigned int xms)
{
unsigned char data i, j;
while(xms)
{
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
while(1)
{
if(P3_1==0)//按键被按下
{ //27-29行代码为按键消除抖动操作
Delay(20); //消除按下抖动
while(P3_1==0); //检测是否松手
Delay(20); //消除松手抖动
P2_0=~P2_0;
}
}
}
6. 独立按键控制LED二进制显示
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
}
void main()
{
unsigned char LEDNum;//用char类型的原因是char类型和P2寄存器一样8个字节
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
//初始状态 1111 1111
LEDNum++;//0000 0000
P2=~LEDNum;
}
}
}
7. 独立按键控制LED移位
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
}
unsigned char LEDNum;
void main()
{
P2=~0x01;
while(1)
{
if(P3_1==0)//按下K1控制LED左移
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
if(LEDNum>7)
LEDNum=0;
P2=~(0x01<<LEDNum);//左移后记得取反
}
if(P3_0==0)//按下K2控制LED右移
{
Delay(20);
while(P3_0==0);
Delay(20);
if(LEDNum==0)
LEDNum=7;
else
LEDNum--;
P2=~(0x01<<LEDNum);
}
}
}