c-读取输入引脚的状态并在LED上显示-LPC1115



该代码应该通过按钮读取数字输入引脚的状态,并将状态输出到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输出仍保持高电平。

假设您的Port0->DATA[0]指向基址0x5000 0000,并定义为对齐的8位阵列,那么您的引脚端口寻址/屏蔽是错误的。

参见LPC111x用户手册UM10398修订版12.4 p196第12.4.1章写入/读取数据操作:

为了使软件能够在不影响单个引脚中任何其他引脚的情况下设置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
}
}

最新更新