Файлы к статье nec.rar Code //Chip type : ATmega8 //AVR Core Clock frequency: 4.000000 MHz
#include <mega8.h> #include <stdio.h>
typedef unsigned char byte; typedef unsigned int word;
byte evt_cnt=0; //Счетчик событий word pvkc; //CUSTOM code byte pvk[3]; //DATA code
void keydown(word custom,byte data) { //Вызывается при нажатии
//Здесь пишим код, для события
printf("DOWN: %u,%u\r",custom,data); }
void keypress(word custom,byte data) { //Вызывается при удержании
//Здесь пишим код, для события
printf("PRESS: %u,%u\r",custom,data); }
void tmr_reset() { TCCR0=0; //Выключаем счетчик TCNT0=0; //Сбрасываем счетчик evt_cnt=0; }
interrupt [EXT_INT0] void ext_int0_isr(void) { //Внешнее прерывание if (evt_cnt==0) TCCR0=4; //Если первое событие включаем счетчик, 15.625КГц if (evt_cnt==1&&(TCNT0<130||TCNT0>150)) tmr_reset(); //Второе событие, если импульс не входит в интервал, выключаем счетчик if (evt_cnt==2) { if (TCNT0<60||TCNT0>80) { //Проверка на удержание клавиши tmr_reset(); if (TCNT0<60&&pvk[2]!=0) keypress(pvkc,pvk[1]); //Вызываем функцию удержания клавиши }else{ //Если первое нажатие сбрасываем значения pvkc=0; pvk[0]=0; pvk[1]=0; pvk[2]=0; } } if (TCCR0!=0) { //Если счетчик включен if (evt_cnt>3&&evt_cnt<67&&(evt_cnt&1)==0) { if (evt_cnt<36) { if (TCNT0>21) pvkc|=1<<(17-(evt_cnt>>1)); //Собираем по биту CUSTOM code }else if(evt_cnt<52) { if (TCNT0>21) pvk[1]|=1<<(25-(evt_cnt>>1)); //DATA code }else{ if (TCNT0>21) pvk[0]|=1<<(33-(evt_cnt>>1)); //invert DATA code } } evt_cnt++; //Инкриминируем счетчик событий if (evt_cnt>67) { tmr_reset(); //Выключам счетчик if (pvk[1]==(pvk[0]^0xff)) { //Проверяем DATA code pvk[2]=1; //Значит Ок keydown(pvkc,pvk[1]); //Вызываем функцию нажатия клавиши } } TCNT0=0; //Сбрасываем счетчик } }
interrupt [TIM0_OVF] void timer0_ovf_isr(void) { tmr_reset(); //Если счетчик переполнился, сбрасываем его }
void main(void) { DDRD=0; PORTD=4; TIMSK=1; //Разрешаем прерывание для таймера //Разрешаем внешнее прерывание INT0, реагирует на любое изменение GICR=0x40; MCUCR=0x01; GIFR=0x40; tmr_reset(); //Инициализируем UART, 19200 бод 8 бит UCSRA=0x00; UCSRB=0x18; UCSRC=0x86; UBRRH=0x00; UBRRL=0x0C; //Выводим строку putsf("TEST NEC RC:\r"); //Разрешаем прерывания #asm("sei") }
|