Jump to content

    
Sign in to follow this  
MaxiMuz

Ошибочное срабатывание матричной клавиатуры на STM32

Recommended Posts

Организовал матричную клавиатуру 3х4. На столбцы PB5,PB6,PB7 подаю бегущую "1". Строки РА12...РА9 настроенные как вход с внутренней подтяжкой к нулю.

 

...........Р.Р.Р

...........В.В.В

...........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;

 

При подаче 1 на РВ5 и замыкании кнопки (кн.4) на РА11 срабатывает соседний пин РА10.

При замыкании кнопки7 на РА10 срабатывают соседние РА11, РА9.

При замыкании кнопки * на РА9 иногда срабатывает соседний РА10.

Если после включения 1 на столбце и считывания строк ввести задержку __NOP(); помехи пропадают.

Есть ли другие способы борьбы с такими помехами ?

Edited by MaxiMuz

Share this post


Link to post
Share on other sites
Есть ли другие способы борьбы с такими помехами ?
И с этими и с другими - внешние подтяжки значительно меньшего сопротивления, чем внутренние. Физику не обманешь, паразитным емкостям выводов и монтажа нужно время для зарядки/разрядки. Чем меньше ток - тем больше время.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this