控制单独LED
SDCC安装目录下的这个文件里面有定义P2_0这个位置单独的定义,引用这个头文件就可以单独控制P2.0
D:\work\SDCC\include\mcs51\8051.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.0sdcc -mmcs51 --model-small --iram-size 256 --xram-size 0 --code-size 8192 .\key_led.c
#include<mcs51/8051.h>// 用 SDCC 的头文件,不是 REGX52.Hvoidmain(void){while(1){// P2 = 0xFE; // 11111110,P2.0/P20 输出低电平,点亮第一个 LEDP2_0=0;// 直接写 P2_0,头文件里已经定义好了}}补充 1:P2_0 和 P2 = 0xFE; 的区别
| 写法 | 影响范围 | 适用场景 |
|---|---|---|
| P2_0 = 0; | 只影响 P2.0 | 只想控制一个灯,其他位不动 |
| P2 = 0xFE; | 影响整个 P2 口 | 流水灯、多个灯一起控制 |
补充 2:P2_0 = 0; 和 P2_0 = 1; 的效果
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
#include<mcs51/8051.h>// 包含P2_0的定义voidmain(void){// 按下点亮led,松开灭while(1){if(P3_1==0){// 如果按键 k1 按下P2_0=0;// led 01 亮}else{P2_0=1;// led 01 灭}}}