Задача: По нажатию кнопки переключать светодиод.
Исходный материал: PIC16f628a и простенькая devboard.
В коде ничего сложного нет, единственное что здесь стоило бы оптимизировать антидребезг контактов, но для начала и так пойдет.
#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; } }
Спасибо! Очень помогло!)
Не за что!
В 15 строке: if (RB == 0) { sRB1 = !sRB1;}.
Может RB0 ==0?
Не понял вопроса.
Чем отличаются RB == 0 и RB0 == 0 ?
Теперь понял.
Да вы правы, это ошибка, ща поправим, спасибо.
Без указания типа генератора, у меня HS никто не моргает. А как можно управлять в этом компиляторе отдельной ногой без затрагивания отдельных битов в порту
Например выставили единичку на RC1 а продолжаем моргать на ноге RC2. А второй вопрос если я хочу выводить переменную в порт С как будет выглядеть запись? Так PORTC = f; ? Или там еще какие_то знаки надо дописать? Где можно про синтаксис этого компилятора почитать, подробно, а лучше на русском. Заранее благодарен!
Да можно использовать разные пины по разным назначениям.
Да, PORTC = f;
Есть Hi-tech picc manual прямо в его директории установки, на русском не встречал.
Здравствуйте. А антидребезг контактов — что это значит?
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
работает….
Кнопка не нажимается моментально, по нажатии на самом деле происходит куча нажатий отпусканий (дребезг), чтобы нам не обрабатывать эти левые нажатия делается программная задержка ( антидребезг ).
Я думаю что лучше обработку кнопки сделать через прерывание по изменение состояния соответствующего пина, вот часть кода
void interrupt isr(){
if(GPIF==1){
if((GPIO&16)==0)
button();
GPIF=0;
}
}
//—————————-
void button(){
__delay_ms(100);
inc++;}
void interrupt isr(){
if(GPIF==1){ //флаг изменения состояния порта GPIO это для pic12f675
if((GPIO&16)==0) // анализ входа GPIO4
button();
GPIF=0; //обнуляем флаг
}
}
//—————————-
void button(){
__delay_ms(100); //задержка от дребезга
inc++; //переменная в которой хранится число нажатия кнопки
}
Уведомление: PIC Lab, PIC16, Experiment #2: Button connection | diymicro.org