Шрифт:
Рис. 5.11. Функциональная схема аппаратных средств для примера 5.3.3
/*----------------------------------------------------------------------*/
/*filename: debounced_swith.c */
/*осуществляет опрос 8 переключателей с программной защитой от дребезга */
/*выполняет специальные действия для каждого нажатого переключателя */
/*зажигает зеленый светодиод в разряде активизированного переключателя */
/*----------------------------------------------------------------------*/
/*подключаемые файлы*/
#include <912b32.h>
/*используемые функции*/
int process_valid_input(unsigned char input_value); //управление
//процессом опроса в реальном времени
void initialize_ports(void); //инициализация портов
void timer_init(void); //инициализация таймера
//глобальные переменные
int keep_going=1; //переменная цикла
unsigned char old_PORTB= 0xff; //предыдущее значение порта PORTB
unsigned char new_PORTB; //новое значение порта PORTB
void main{void) {
initialize_ports;
timer_init;
while(keep_going) {
new_PORTB=PORTB; //читать порт PORTB
if (new_PORTB != old_PORTB) {
//выполнять, если значение порта изменилось
swith(new_PORTB) {
case 0xFE: //переключатель PB0
if (process_valid_input(new_PORTB)) //процедура
//антидребезга
{ //выполнять действия, связанные
: //с нажатием клавиши PB0
:
PORTC = 0х01;//зажечь зеленый в разряде PB0
keep_going = 1;
}
break;
case 0xFD: // переключатель PB01
if (process_valid_input(new_PORTB)) // процедура
// антидребезга
{ //выполнять действия, связанные
: //с нажатием клавиши PB1
PORTC = 0х02; //зажечь зеленый в разряде PB1
keep_going = 1;
}
break;
case 0x7F: // переключатель PB7
if (process_valid_input(new_PORTB)) // процедура
//антидребезга
{ //выполнять действия, связанные
: //с нажатием клавиши PB7
PORTC = 0х80; //зажечь зеленый в разряде PB7
keep_going = 1;
}
break;
default:
; //аll other cases
} //окончание распозвания, какая клавиша нажата (switch(new_PORTB))
} //окончание обработки нажатой клавиши (if new_PORTB)
old_PORTB = new_PORTB; //обновить PORTB
} //окончание (while(keep_going))
} //окончание (main)
/*-----------------------------------------------------------------*/
/* Функция void initialize_ports устанавливает режим работы портов */
/*-----------------------------------------------------------------*/
void initialize_ports(void) {
DDRC=0xff; //порт PORTC на вывод
PORTC=0x00; //выходы порта PORTC в 0, зажгутся красные светодиоды