BASIC4MCU | AVR 따라하기 | 2015년 강좌 | 106 - [타이머인터럽트-19] 누른시간 & 뗀시간 & 더블클릭 체크
페이지 정보
작성자 키트 작성일2017-08-23 16:48 조회4,032회 댓글0건본문
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 //--------------------------------------------------------// CVAVR// [타이머인터럽트-19] 누른시간 & 뗀시간 & 더블클릭 체크//--------------------------------------------------------#include <mega128.h>#include <delay.h>//bit flag=0;unsigned char old_ON_mode=0,ON_mode=0,old_OFF_mode=0,OFF_mode=0;unsigned int ON_cnt=0,OFF_cnt=0;//interrupt [TIM1_COMPA] void timer1_compa_isr(void){ // 100msif(!PINE.0){ // 키를 눌렀고if(flag==0){ // 처음 키를 눌렀다면old_OFF_mode=OFF_mode; // OFF_mode 저장if(OFF_cnt>=10)OFF_mode=2; // 1초 이상else OFF_mode=1; // 1초 미만flag=1; ON_cnt=0; OFF_cnt=0; // flag=1, 카운터 초기화}else{ // 계속 키를 누르고 있는 상태라면if(ON_cnt<30)ON_cnt++; // 3초까지 ON_cnt 증가}}else{ // 키를 누르지 않았고if(flag){ // 누르고 있는 상태에서 처음 키를 뗏다면old_ON_mode=ON_mode; // ON_mode 저장if(ON_cnt>=10)ON_mode=2; // 1초 이상else ON_mode=1; // 1초 미만flag=0; ON_cnt=0; OFF_cnt=0; // flag=0, 카운터 초기화}else{ // 계속 키를 누르지 않고 있는 상태라면if(OFF_cnt<30)OFF_cnt++; // 3초까지 ON_cnt 증가}}}//void main(void){PORTE=0xFF; DDRA=0xFF;TCCR1B=0x0B; OCR1A=24999; TIMSK=0x10; //100msSREG|=0x80;while(1){if((old_ON_mode==1)&&(OFF_mode==1)&&(ON_mode==1)){ PORTA=0xFF; } // 더블클릭else{if(ON_mode ==2){ PORTA=(PORTA&0x0F)|0x30; } // 길게 누른 경우if(ON_mode ==1){ PORTA=(PORTA&0x0F)|0x10; } // 짧게 누른 경우if(OFF_mode==2){ PORTA=(PORTA&0xF0)|0x03; } // 길게 뗀 경우if(OFF_mode==1){ PORTA=(PORTA&0xF0)|0x01; } // 짧게 뗀 경우}}}//--------------------------------------------------------// AVRStudio// [타이머인터럽트-19] 누른시간 & 뗀시간 & 더블클릭 체크//--------------------------------------------------------#define F_CPU 16000000UL // 16 MHz#include <avr/io.h>#include <avr/interrupt.h>#include <util/delay.h>//volatile unsigned char flag=0,old_ON_mode=0,ON_mode=0,old_OFF_mode=0,OFF_mode=0;volatile unsigned int ON_cnt=0,OFF_cnt=0;//ISR(TIMER1_COMPA_vect){ // 100msif(!(PINE&1)){ // 키를 눌렀고if(flag==0){ // 처음 키를 눌렀다면old_OFF_mode=OFF_mode; // OFF_mode 저장if(OFF_cnt>=10)OFF_mode=2; // 1초 이상else OFF_mode=1; // 1초 미만flag=1; ON_cnt=0; OFF_cnt=0; // flag=1, 카운터 초기화}else{ // 계속 키를 누르고 있는 상태라면if(ON_cnt<30)ON_cnt++; // 3초까지 ON_cnt 증가}}else{ // 키를 누르지 않았고if(flag){ // 누르고 있는 상태에서 처음 키를 뗏다면old_ON_mode=ON_mode; // ON_mode 저장if(ON_cnt>=10)ON_mode=2; // 1초 이상else ON_mode=1; // 1초 미만flag=0; ON_cnt=0; OFF_cnt=0; // flag=0, 카운터 초기화}else{ // 계속 키를 누르지 않고 있는 상태라면if(OFF_cnt<30)OFF_cnt++; // 3초까지 ON_cnt 증가}}}//int main(void){PORTE=0xFF; DDRA=0xFF;TCCR1B=0x0B; OCR1A=24999; TIMSK=0x10; //100msSREG|=0x80;while(1){if((old_ON_mode==1)&&(OFF_mode==1)&&(ON_mode==1)){ PORTA=0xFF; } // 더블클릭else{if(ON_mode ==2){ PORTA=(PORTA&0x0F)|0x30; } // 길게 누른 경우if(ON_mode ==1){ PORTA=(PORTA&0x0F)|0x10; } // 짧게 누른 경우
댓글 0
조회수 4,032등록된 댓글이 없습니다.