控制单独LED
SDCC安装目录下的这个文件里面有定义P2_0这个位置单独的定义,引用这个头文件就可以单独控制P2.0
D:\work\SDCC\include\mcs51\8051.h
h
/* P2 */
__sbit __at (0xA0) P2_0 ;
__sbit __at (0xA1) P2_1 ;
__sbit __at (0xA2) P2_2 ;
__sbit __at (0xA3) P2_3 ;
__sbit __at (0xA4) P2_4 ;
__sbit __at (0xA5) P2_5 ;
__sbit __at (0xA6) P2_6 ;
__sbit __at (0xA7) P2_7 ;
| 部分 | 含义 |
|---|---|
| __sbit | SDCC 的关键字,表示"定义一个位变量"(占 1 位,不是 1 字节) |
| __at (0xA0) | 把这个位变量定位到地址 0xA0 |
| P2_0 | 变量名,代表 P2 口的第 0 位 |
| ; | 语句结束 |
单独点亮P2.0
编译烧录如下代码,可以实现单独点亮P2.0
sdcc -mmcs51 --model-small --iram-size 256 --xram-size 0 --code-size 8192 .\key_led.c
c
#include <mcs51/8051.h> // 用 SDCC 的头文件,不是 REGX52.H
void main(void)
{
while(1) {
// P2 = 0xFE; // 11111110,P2.0/P20 输出低电平,点亮第一个 LED
P2_0 = 0; // 直接写 P2_0,头文件里已经定义好了
}
}
补充 1:P2_0 和 P2 = 0xFE; 的区别
| 写法 | 影响范围 | 适用场景 |
|---|---|---|
| P2_0 = 0; | 只影响 P2.0 | 只想控制一个灯,其他位不动 |
| P2 = 0xFE; | 影响整个 P2 口 | 流水灯、多个灯一起控制 |
补充 2:P2_0 = 0; 和 P2_0 = 1; 的效果
c
P2_0 = 0; // P2.0 输出低电平,灯亮(低电平点亮)
P2_0 = 1; // P2.0 输出高电平,灯灭
按键控制LED
如图,四个按键一侧连接GND,另外一侧悬空。以k1为例,没有按下时,P3.1读取为高电平,按下时为低电平。

sdcc -mmcs51 --model-small --iram-size 256 --xram-size 0 --code-size 8192 .\key_led.c
c
#include <mcs51/8051.h> // 包含P2_0的定义
void main(void)
{ // 按下点亮led,松开灭
while(1) {
if(P3_1 == 0) { // 如果按键 k1 按下
P2_0 = 0; // led 01 亮
} else {
P2_0 = 1; // led 01 灭
}
}
}
效果展示
