C8051F340 P4口LED操作
C8051F340的官方DataSheet上这样写道“通过对应的端口数据寄存器访问端口P3-0,这些寄存器既可以按位寻址也可以按字节寻址。端口P4(仅C8051F340/1/4/5)使用的SFR只能按字节寻址。”一开始没有注意,后来发现P4口连的LED没有反应,检查代码无数遍也没发现错误,知道翻看到这里才发现问题所在。C51寻址分为两种,一种是位寻址,如定义的bit类变量以及使用sbit的IO操作;其余的就为字节寻址了,比如直接对寄存器操作。
因此,若要操作P4上的IO不能使用如下代码:
1 sbit LED1 = P4^0; 2 sbit LED2 = P4^1;
而应该是这样操作:
1 #define LED1_STATE P4&0x01 2 #define LED1_ON() P4 |= 0x01 3 #define LED1_OFF() P4 &=~0x01 4 #define LED1_CHANGE() P4&0x01 ? (P4 &=~0x01) : (P4 |= 0x01) 5 #define LED2_STATE P4&0x02 6 #define LED2_ON() P4 |= 0x02 7 #define LED2_OFF() P4 &=~0x02 8 #define LED2_CHANGE() P4&0x02 ? (P4 &=~0x02) : (P4 |= 0x02)
浙公网安备 33010602011771号