Справочная информация
У меня есть плата Uno32 с 32-разрядным процессором MIPS и базовым экраном ввода-вывода, который идет вместе с ним.Помимо прочего, IO-щит имеет восемь светодиодных индикаторов и четыре кнопки.Приведенная ниже программа включает светодиодный индикатор 1 на время нажатия кнопки 1.Я прокомментировал код с моей интерпретацией того, что делает каждая строка, и включил дополнительное объяснение ниже кода.Мой фактический вопрос связан со вторым фрагментом кода, но я начну с представления этого рабочего кода в попытке оправдать мои ожидания относительно второго фрагмента.
#include <pic32mx.h>
/*
* read from Rx[n]: (PORTx >> n) & 0x1
* drive value to Rx[n]: PORTx = value << n
*
* set Rx[n] to output: TRISx |= 0x...., where only bit n is 0
* set Rx[n] to input: TRISx |= 0x...., where only bit n is 1
*
* REn: LED light n+1
* RFn: Button n+1
*/
int main(void) {
TRISE = ~0xff; // set RE[7:0] to output, RE[15:8] to input
TRISF |= 0x2; // set RF[1] to input
while(1)
PORTE = (PORTF >> 1) & 0x1; // drive RF1 to RE0
return 0;
}
Светодиодные индикаторы загораются при работес 1 и выключается при движении с 0. Кнопки подключаются так, чтобы выдавать 1 при нажатии и 0 при отпускании.Микропроцессор Uno32 организует группы GPIO в порты и называет эти порты RA, RB, RC, RD, RE, RF и RG.Каждый порт может иметь до 16 контактов GPIO и управляется двумя регистрами: TRISx и PORTx, где x - это буква (AG), обозначающая интересующий порт.16 младших разрядов регистра TRISx определяют, является ли каждый вывод входом или выходом.Когда данный бит регистра TRISx равен 0, вывод является выходом;когда это 1, это вход.16 младших разрядов регистра PORTx определяют соответствующие значения, которые выводятся или считываются с каждого контакта.
Выводы с 0 по 7 порта E (то есть RE0–RE7
) соответствуют восьми светодиодным индикаторам.Вывод 1 порта F (т. Е. RF1
) соответствует кнопке 1. Я выяснил, что RF1
соответствует кнопке 1, ознакомившись со справочными руководствами для платы Uno32 и экрана IO (соответствующие таблицы из руководств прилагаются кэто сообщение).
Опять же, обращаясь к справочному руководству, я считаю, что RF2
, RF3
и RF4
соответствуюткнопка 2, кнопка 3 и кнопка 4 соответственно.(Это будет актуально в ближайшее время.)
Учитывая вышеприведенный фон, позвольте мне объяснить, почему в приведенном выше коде светодиод 1 горит на время нажатия кнопки 1.Оператор TRISE = ~0xff;
устанавливает выводы от 0 до 7 порта E (порт светодиодного индикатора) для вывода.Затем TRISF |= 0x2;
устанавливает вывод кнопки 1 в качестве входа.Когда кнопка нажата, PORTE = (PORTF >> 1) & 0x1;
переводит входное значение 1
на первый светодиодный индикатор RE0
, потому что нажатие кнопки приводит к тому, что RF1
становится 1
.Когда кнопка отпущена, PORTE = (PORTF >> 1) & 0x1;
выводит входное значение 0
на первый светодиод RE0
, поскольку RF1
равно 0
.Эти «механизмы» объясняют, почему в приведенном выше коде светодиод 1 светится в течение всего времени нажатия кнопки 1.
Вопрос
Теперь, используя те же рассуждения, что и выше, Я ожидаю, что приведенный ниже код заставит светодиод 1 светиться в течение всего времени нажатия кнопки 2 (потому что я ожидаю, что (PORTF >> 2) & 0x1
даст мне значение RF2
).
int main(void) {
TRISE = ~0xff; // set RE[7:0] to output, RE[15:8] to input
TRISF |= 0x4; // set RF[2] to input
while (1)
PORTE = (PORTF >> 2) & 0x1; // drive RF2 to RE0
return 0;
}
Однако,Эффект этого кода заключается в том, что светодиодный индикатор 1 светится постоянно, и ни одна из кнопок не имеет видимого эффекта.
Где я иду не так?