PIC мк. Эксперимент №2. Подключение кнопки.

Задача:  По нажатию кнопки переключать светодиод.

Исходный материал: PIC16f628a и простенькая devboard.

button

В коде ничего сложного нет, единственное что здесь стоило бы оптимизировать антидребезг контактов, но для начала и так пойдет.


#include <htc.h>

#define _XTAL_FREQ 4000000 //Clock 4MHz

__CONFIG(MCLREN & WDTDIS & UNPROTECT);

unsigned char sRB1=0;  //сначала светодиод выключен

void main() {
 TRISB = 0b11111101;  // В1 на выход
 RB1 = 0;             // присваиваем В1 0
 for (;;) {
 if (RB0 == 0) {
 __delay_ms(30);  //антидребезг
     if (RB0 == 0) { sRB1 = !sRB1;}
 }
 RB1 = sRB1;
 }

}

PIC мк. Эксперимент №2. Подключение кнопки.: 13 комментариев

  1. Без указания типа генератора, у меня HS никто не моргает. А как можно управлять в этом компиляторе отдельной ногой без затрагивания отдельных битов в порту

    Ответить

  2. Например выставили единичку на RC1 а продолжаем моргать на ноге RC2. А второй вопрос если я хочу выводить переменную в порт С как будет выглядеть запись? Так PORTC = f; ? Или там еще какие_то знаки надо дописать? Где можно про синтаксис этого компилятора почитать, подробно, а лучше на русском. Заранее благодарен!

    Ответить

    sarge Ответил:

    Да можно использовать разные пины по разным назначениям.
    Да, PORTC = f;
    Есть Hi-tech picc manual прямо в его директории установки, на русском не встречал.

    Ответить

  3. Здравствуйте. А антидребезг контактов — что это значит?
    if (RB0 == 0) {
    __delay_ms(30); //антидребезг
    if (RB0 == 0) { sRB1 = !sRB1;}
    }
    RB1 = sRB1;
    }
    Я немного не понял что из этого then и где else…. Наверное просто из-за не знания Си, да и микроконтроллеров…
    Вот я так написал:
    #include
    #define _XTAL_FREQ 4000000 //Clock 4MHz

    __CONFIG(MCLREN & WDTDIS & UNPROTECT);

    main(){
    TRISB=0b11111101;

    while (1){
    if (RB0==0)
    RB1=1;
    __delay_ms(150);
    RB1=0;
    __delay_ms(150);
    else
    RB1=0;
    }
    }
    P.S: кстати и без этого –#define _XTAL_FREQ 4000000 //Clock 4MHz
    работает….

    Ответить

    sarge Ответил:

    Кнопка не нажимается моментально, по нажатии на самом деле происходит куча нажатий отпусканий (дребезг), чтобы нам не обрабатывать эти левые нажатия делается программная задержка ( антидребезг ).

    Ответить

  4. Я думаю что лучше обработку кнопки сделать через прерывание по изменение состояния соответствующего пина, вот часть кода
    void interrupt isr(){
    if(GPIF==1){
    if((GPIO&16)==0)
    button();
    GPIF=0;
    }
    }
    //—————————-
    void button(){
    __delay_ms(100);
    inc++;}

    Ответить

  5. void interrupt isr(){
    if(GPIF==1){ //флаг изменения состояния порта GPIO это для pic12f675
    if((GPIO&16)==0) // анализ входа GPIO4
    button();
    GPIF=0; //обнуляем флаг
    }

    }
    //—————————-
    void button(){
    __delay_ms(100); //задержка от дребезга
    inc++; //переменная в которой хранится число нажатия кнопки
    }

    Ответить

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">