Я использую микроконтроллер 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
}
Давайте предположим, что вы прочитали ввод из PORTA в переменную, которую мы назовем input
,
В этом случае тестирование отдельных битов input
выглядит примерно так:
if (input & 1) {
// bit 0 was set
}
if (input & 2) {
// bit 1 was set
}
if (input & 4) {
// bit 2 was set
}
Если вы используете что-то вроде 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
,