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)

 

posted on 2013-05-20 11:03  于丹三  阅读(1680)  评论(0)    收藏  举报

导航