Пины ввода / вывода ASM микроконтроллер HCS12

Я использую микроконтроллер HCS12. Следующая программа, которая у меня есть, берет данные с встроенной клавиатуры и отображает буквы на встроенном ЖК-дисплее в зависимости от того, какая клавиша нажата (я прикрепил только часть кода, касающуюся входов / выходов, остальное я могу прикрепить, если нужно, но так легче на глазах.

Что я хотел бы сделать, это избавиться от клавиатуры, используемой в качестве входов, и использовать имеющийся у меня датчик, который вместо этого посылает активные сигналы низкого уровня через 3 отдельных контакта. Таким образом, вместо необходимости нажимать клавиатуру каждый раз, когда датчик считывает одно из показаний (PortA1, 2 или 3), он отображает правильную букву.

Функция init_keypad устанавливает в качестве входов PortA0-PortA3.

В функции getkey я не уверен, как изменить операторы if для индивидуального чтения PortA0-PortA3

void init_keypad(void){
DDRA = 0xf0;  // PA7-PA4 output; PA3-PA0 input
DDRB = 0xf0;
PUCR |= 1;   // PUPAE =1 (enable pull-up on all PORTA inputs)
}

char getkey(void){
PORTA = 0xe0;       // selects row 0
if ((PORTA & 1) == 0){
cmdwrt(0x01);
delay(20);
if ((PORTA & 1) == 0) return('L');//true if '1' key still active after 20 ms
}
PORTA = 0xd0;
if ((PORTA & 1) == 0){
cmdwrt(0x01);
delay(20);
if ((PORTA & 1) == 0) return('S');//true if '1' key still active after 20 ms
}
PORTA = 0xb0;
if ((PORTA & 1) == 0){
cmdwrt(0x01);
delay(20);
if ((PORTA & 1) == 0) return('R');//true if '1' key still active after 20 ms
}

0

Решение

Давайте предположим, что вы прочитали ввод из PORTA в переменную, которую мы назовем input,

В этом случае тестирование отдельных битов input выглядит примерно так:

if (input & 1) {
// bit 0 was set
}
if (input & 2) {
// bit 1 was set
}
if (input & 4) {
// bit 2 was set
}
0

Другие решения

Если вы используете что-то вроде CodeWarrior IDE для программирования HCS12, вы заметите, что файл заголовка включен в ваш проект HCS12. Это будет название чипа, для которого вы хотите скомпилировать, например. mc9s12c32.h, В этом файле вы можете видеть определения адресов и содержимое каждого регистра, доступного вам. PORTA например, определяется как переменная, которая указывает на 0x0 в памяти. Чтобы иметь возможность считывать определенный вывод на порту A, можно использовать следующее, чтобы помочь избежать путаницы.

if(PORTA & PORTA_BIT0_MASK)
{
//Do something if bit 0 was set
}
if(PORTA & PORTA_BIT1_MASK)
{
//Do something if bit 1 was set
}
if(PORTA & PORTA_BIT2_MASK)
{
//Do something if bit 2 was set
}

То, что сделано выше, это проверка между всем содержимым порта A и тем, установлен ли каждый отдельный бит на этом порту. PORTA_BIT0_MASK случается, определяется как 1, PORTA_BIT1_MASK как 2, а также PORTA_BIT2_MASK как 4,

0

По вопросам рекламы [email protected]