Считывание состояния входного контакта и отображение на светодиоде - LPC1115 - PullRequest
0 голосов
/ 01 декабря 2018

этот код должен считывать состояние цифрового входного контакта с помощью кнопки и выводить состояние на светодиод.т. е. при высоком входном сигнале светодиод горит и наоборот. Поскольку кнопка подключена к подтягивающему резистору, при нажатии кнопки вход должен считываться НИЗКИМ, и наоборот.

Мой код:

    #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

Выходной сигнал светодиода остается высоким даже при нажатии кнопки.

1 Ответ

0 голосов
/ 10 декабря 2018

Если ваш Port0->DATA[0] указывает на базовый адрес 0x5000 0000 и определен как выровненный 8-битный массив, то адресация / маскировка вашего Pin-порта неверна.

См. Руководство пользователя LPC111x UM10398 Rev.12.4 p196 Глава 12.4.1 Операция записи / чтения данных :

Для того, чтобы программное обеспечение могло устанавливать биты GPIO, не затрагивая другие контакты в одной операции записи, биты [13:2] 14-битной адресной шины используются для создания 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
    }
}
...