该代码应通过按钮读取数字输入引脚的状态并将其输出到LED。 即,当输入为高电平时,LED点亮,反之亦然 由于该按钮连接到上拉电阻,因此当按下按钮时,输入应该读为LOW,反之亦然。
我的代码:
#include "board.h"
#include <stdio.h>
//setting pointers
#define Port0 ((LPC_GPIO_T *) 0x50000000) //Port 0
#define IOCON ((LPC_IOCON_T *) 0x40044000) //IO configuration
int main(void)
{
/* Initialize pins */
Port0->DIR &= ~((1 << 1)); //PIO0_1 input - onboard switch (unpressed state is pulled-up)
Port0->DIR |= (1<<7); //PIO0_7 output - onboard LED
//Pin configuration
IOCON->REG[IOCON_PIO0_7] &= 0x0 << 3; //No addition pin function
IOCON->REG[IOCON_PIO0_1] &= 0x0 << 3; // "
Port0->DATA[1<<7] &= ~(1<<7); // output initially low
while (1) {
if((Port0->DATA[1<<1]) & (1<<1)) //When input is high
{
Port0->DATA[1<<7] |= (1<<7); //drive PIO0_7 High
}
else
{
Port0->DATA[1<<7] &= ~(1<<7); //Drive PIO0_7 Low
}
}
return 0;
}
这部分代码执行后,除非按下按钮,否则PIO0_7保持低电平。但是,由于拉起开关,这不是相反的意思吗?我还用电压表仔细检查了这一点。
我尝试更改
if((Port0->DATA[1<<1]) & (1<<1)) //When input is high
到
if(!(Port0->DATA[1<<1]) & (1<<1)) //When input is Low
即使按下按钮,LED输出仍保持高电平。
答案 0 :(得分:0)
假设您的Port0->DATA[0]
指向基本地址0x5000 0000
并被定义为对齐的8位阵列,那么您的Pin-Port地址/掩码错误。
请参见LPC111x user manual UM10398 Rev. 12.4 p196 Chapter 12.4.1 write/read data operation:
为了使软件能够设置GPIO位而不会影响单个引脚上的任何其他引脚 写操作,使用14位宽的地址总线的位[13:2]来创建12位宽的地址 每个端口的12个GPIO引脚上的写入和读取操作的掩码。
因此,地址中的偏移量为2位,以获取/设置所需引脚的值。 因此,您必须将寻址移位2位,以下方法可以解决问题:
Port0->DATA[1<<(7+2)] &= ~(1<<7); // output initially low
while (1) {
if((Port0->DATA[1<<(1+2)]) & (1<<1)) //When input is high
{
Port0->DATA[1<<(7+2)] |= (1<<7); //drive PIO0_7 High
}
else
{
Port0->DATA[1<<(7+2)] &= ~(1<<7); //Drive PIO0_7 Low
}
}