...........Р.Р.Р
...........В.В.В
...........5.6.7
РА12--1-2-3
РА11--4-5-6
РА10--7-8-9
РА9 --*-0-#
Читаю:
Код
// вкл. pin1 - на вывод
/* Настраиваем KEYCOL1 - на вых.двухтактный f=50MHz */
GPIOB->CRL&= ~(GPIO_CRL_CNF5);
GPIOB->CRL|=GPIO_CRL_MODE5;
ON_PIN(KEYCOL1);// вкл. стобец столбец
__NOP();
// __NOP();
// __NOP();
// __NOP();
// __NOP();
tmp=RD_PORT(inPort);
KeyMat[i++]=(u16)tmp;//=tmp<<4;
OFF_PIN(KEYCOL1);
// вкл. pin3 - Z-состояние
/* Настраиваем KEYCOL1 - на вход в третьем сост */
GPIOB->CRL&= ~(GPIO_CRL_MODE5|GPIO_CRL_CNF5);
GPIOB->CRL|=GPIO_CRL_CNF5_0;
// вкл. pin2 - на вывод
/* Настраиваем KEYCOL2 - на вых.двухтактный f=50MHz */
GPIOB->CRL&= ~(GPIO_CRL_CNF6);
GPIOB->CRL|=GPIO_CRL_MODE6;
ON_PIN(KEYCOL2);// вкл. второй столбец
__NOP();
// __NOP();
// __NOP();
// __NOP();
// __NOP();
tmp=RD_PORT(inPort);
KeyMat[i++]=(u16)tmp;//=tmp<<4;
OFF_PIN(KEYCOL2);
// вкл. pin2 - Z-состояние
/* Настраиваем KEYCOL2 - на вход в третьем сост */
GPIOB->CRL&= ~(GPIO_CRL_MODE6|GPIO_CRL_CNF6);
GPIOB->CRL|=GPIO_CRL_CNF6_0;
// вкл. pin3 - на вывод
/* Настраиваем KEYCOL3 - на вых.двухтактный f=50MHz */
GPIOB->CRL&= ~(GPIO_CRL_CNF7);
GPIOB->CRL|=GPIO_CRL_MODE7;
ON_PIN(KEYCOL3); // вкл. первый столбец
__NOP();
// __NOP();
// __NOP();
// __NOP();
// __NOP();
tmp=RD_PORT(inPort);
KeyMat[i++]=(u16)tmp;//=tmp<<4;
OFF_PIN(KEYCOL3);// выкл. первый столбец
// вкл. pin1 - Z-состояние
/* Настраиваем KEYCOL3 - на вход в третьем сост */
GPIOB->CRL&= ~(GPIO_CRL_MODE7|GPIO_CRL_CNF7);
GPIOB->CRL|=GPIO_CRL_CNF7_0;
/* Настраиваем KEYCOL1 - на вых.двухтактный f=50MHz */
GPIOB->CRL&= ~(GPIO_CRL_CNF5);
GPIOB->CRL|=GPIO_CRL_MODE5;
ON_PIN(KEYCOL1);// вкл. стобец столбец
__NOP();
// __NOP();
// __NOP();
// __NOP();
// __NOP();
tmp=RD_PORT(inPort);
KeyMat[i++]=(u16)tmp;//=tmp<<4;
OFF_PIN(KEYCOL1);
// вкл. pin3 - Z-состояние
/* Настраиваем KEYCOL1 - на вход в третьем сост */
GPIOB->CRL&= ~(GPIO_CRL_MODE5|GPIO_CRL_CNF5);
GPIOB->CRL|=GPIO_CRL_CNF5_0;
// вкл. pin2 - на вывод
/* Настраиваем KEYCOL2 - на вых.двухтактный f=50MHz */
GPIOB->CRL&= ~(GPIO_CRL_CNF6);
GPIOB->CRL|=GPIO_CRL_MODE6;
ON_PIN(KEYCOL2);// вкл. второй столбец
__NOP();
// __NOP();
// __NOP();
// __NOP();
// __NOP();
tmp=RD_PORT(inPort);
KeyMat[i++]=(u16)tmp;//=tmp<<4;
OFF_PIN(KEYCOL2);
// вкл. pin2 - Z-состояние
/* Настраиваем KEYCOL2 - на вход в третьем сост */
GPIOB->CRL&= ~(GPIO_CRL_MODE6|GPIO_CRL_CNF6);
GPIOB->CRL|=GPIO_CRL_CNF6_0;
// вкл. pin3 - на вывод
/* Настраиваем KEYCOL3 - на вых.двухтактный f=50MHz */
GPIOB->CRL&= ~(GPIO_CRL_CNF7);
GPIOB->CRL|=GPIO_CRL_MODE7;
ON_PIN(KEYCOL3); // вкл. первый столбец
__NOP();
// __NOP();
// __NOP();
// __NOP();
// __NOP();
tmp=RD_PORT(inPort);
KeyMat[i++]=(u16)tmp;//=tmp<<4;
OFF_PIN(KEYCOL3);// выкл. первый столбец
// вкл. pin1 - Z-состояние
/* Настраиваем KEYCOL3 - на вход в третьем сост */
GPIOB->CRL&= ~(GPIO_CRL_MODE7|GPIO_CRL_CNF7);
GPIOB->CRL|=GPIO_CRL_CNF7_0;
При подаче 1 на РВ5 и замыкании кнопки (кн.4) на РА11 срабатывает соседний пин РА10.
При замыкании кнопки7 на РА10 срабатывают соседние РА11, РА9.
При замыкании кнопки * на РА9 иногда срабатывает соседний РА10.
Если после включения 1 на столбце и считывания строк ввести задержку __NOP(); помехи пропадают.
Есть ли другие способы борьбы с такими помехами ?