LED灯的工作原理
当P2.4引脚为低电平时,LED1两侧产生电压差,LED1点亮,反之,为高电平时,灯熄灭
I/O引脚部分寄存器
- 每一组I/O引脚都有一组特殊功能的寄存器控制,这些寄存器复位后的初始值均为0xFF
- 对于可进行位寻址的寄存器,其字节地址加上位序号即可得到位地址
I/O引脚控制的方法
由于P2寄存器支持位寻址,所以既可以进行位操作,也可以进行字节操作
- 字节操作
- 字节操作是指对整个寄存器进行赋值
- 在进行字节操作前,必须使用
sfr
关键字定义特殊功能的寄存器,如sfr P2 = 0xA0; // 定义P2的地址为0xA0
- 对P2进行字节操作的代码如`P2 = 0xAF; // 点亮LED1和LED3
- 位操作
- 位操作是指对可进行位寻址的寄存器中的某一位进行赋值
- 在进行位操作前,必须使用
sbit
关键字定义特殊功能寄存器的可寻位地址sbit LED1 = 0xA4 // 位定义LED1
,但在实际过程中,直接使用为地址进行位定义会稍显复杂,所以在实际过程中,通常使用"^"
符号找到P2寄存器的位地址一般用sbit LED1 = P2 ^ 4 // 位定义LED1
- 位定义后,即可使用LED1改变P2特殊功能寄存器的值,
LED1 = 0; // 点亮LED1
实例与代码解析
- 包含头文件
#include <reg52.h>
- 位定义LED
sbit LED1 = P2 ^ 4; // 定义LED1
sbit LED2 = P2 ^ 5;
sbit LED3 = P2 ^ 6;
sbit LED4 = P2 ^ 7;
- 编写延时函数
static void DelayNms(int nms); // 内部延时函数声明
static void DelayNms(int nms) // 内部函数实现
{
unsigned int i, j;
for (i = 0; i < nms; i++)
{
for (j = 0; j < 123; j++)
{
}
}
}
- 编写主函数
void main()
{
while (1)
{
LED1 = 0; // 打开LED1
DelayNms(500); // 延时500ms
LED1 = 1; // 关闭LED1
LED2 = 0; // 打开LED2
DelayNms(500); // 延时500ms
LED2 = 1; // 关闭LED2
LED3 = 0; // 打开LED3
DelayNms(500); // 延时500ms
LED3 = 1; // 关闭LED3
LED4 = 0; // 打开LED4
DelayNms(500); // 延时500ms
LED4 = 1; // 关闭LED4
}
}