Еще один примерчик на светодиодах, к предыдущей схеме добавилась кнопка и резистор. Теперь в основном цикле ждем нажатия кнопки, и если она будет нажата, то будет загораться или гаснуть светодиод HL5, а в прерывании теперь будут моргать 4 светодиода ( HL1-HL4), только побыстрей.
Для обработки нажатия использовал встроенную в MikroC процедуру Button(). В железе проверено.
Код:
unsigned short counter, oldstate, step;
void interrupt(){ // подпрограмма обработки прерывания
if(INTCON.T0IF){
counter++;
if (counter>1){
PORTB=~PORTB&0x0f|step;
counter=0;
}
INTCON.T0IF=0;
}
}// interrupt
void Init(){ // подпрограмма начальной инициализации
CMCON=7; // все входы как цифровые, компараторы отключены
TRISA=0xff; // настроили выводы PORTA на вход
TRISB=0; // настроили выводы PORTB на вывод
OPTION_REG = 0x87; // настройка TMR0, прерывания будут каждые 66,304 ms
INTCON.T0IE=1; // разрешили прерывания по переполнению TMR0
INTCON.GIE=1; // разрешили все прерывания
step=0;
oldstate=0;
}// Init
void main(){
Init();
while(1){ // организовали вечный цикл
if (Button(&PORTA, 0, 1, 0))
oldstate = 1;
if (oldstate && Button(&PORTA, 0, 1, 1)){ // ждем отпускания кнопки (переход от 0 к 1)
step=~step&0x80;
PORTB|=step;
oldstate = 0;
}
}
}//~
Планирую еще примеры по работе с модулем ШИМ, по работе с ЖКИ и термометром DS18B20. Жалко, что в PIC16F628A нет АЦП.
Если будут пожелания, то можно еще что-нибудь запустить.