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

读取输入引脚的状态并显示在LED上-LPC1115,c,arm,gpio,lpc,nxp-microcontroller,C,Arm,Gpio,Lpc,Nxp Microcontroller,该代码通过按钮读取数字输入引脚的状态,并将状态输出到LED。 i、 e.当输入高时,LED亮起,反之亦然 由于按钮与上拉电阻器相连,当按下按钮时,输入应为低,反之亦然 我的代码: #include "board.h" #include <stdio.h> //setting pointers #define Port0 ((LPC_GPIO_T *) 0x50000000) //Port 0 #define IOCON ((LPC_IOCON

该代码通过按钮读取数字输入引脚的状态,并将状态输出到LED。 i、 e.当输入高时,LED亮起,反之亦然 由于按钮与上拉电阻器相连,当按下按钮时,输入应为低,反之亦然

我的代码:

    #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

即使按下按钮,LED输出仍保持高电平。

假设端口0->数据[0]指向基址0x5000 0000并定义为对齐的8位阵列,则Pin端口寻址/屏蔽错误

见:

为了使软件能够设置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
    }
}
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
    }
}