AVR 따라하기 > 106 - [타이머인터럽트-19] 누른시간 & 뗀시간 & 더블클릭 체크

TODAY381 TOTAL312,466
사이트 이용안내
Login▼/회원가입
포럼 동영상강좌 회원가입


구글 플레이 스토어에서
Basic4mcu를 검색해보세요

▼ BASIC4MCU 후원업체 신제품 정보 ▼

▲ BASIC4MCU 후원업체 신제품 정보 ▲

BASIC4MCU | AVR 따라하기 | 2015년 강좌 | 106 - [타이머인터럽트-19] 누른시간 & 뗀시간 & 더블클릭 체크

페이지 정보

작성자 키트 작성일2017-08-23 16:48 조회680회 댓글0건

본문

	
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//--------------------------------------------------------
// 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){ // 100ms
    if(!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//100ms
    SREG|=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){ // 100ms
    if(!(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//100ms
    SREG|=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

조회수 680

등록된 댓글이 없습니다.

AVR 따라하기HOME > AVR 따라하기 > 전체 목록

AVR 따라하기 목록
제목 작성자 작성일 조회
현재글 2015년 강좌 106 - [타이머인터럽트-19] 누른시간 & 뗀시간 & 더블클릭 체크 키트 17-08-23 681
170 2015년 강좌 105 - [타이머인터럽트-18] 스위치 누르는 시간 & 스위치 누르지 않는 시간 체크 댓글[3] 키트 17-08-23 1003
169 2015년 강좌 WS2812B [1개]- 테스트 - AVRstudio 키트 17-08-23 478
168 2015년 강좌 delay_us()보다 더 짧은 딜레이 함수 - 2 키트 17-08-23 700
167 2015년 강좌 delay_us()보다 더 짧은 딜레이 함수 - 1 키트 17-08-23 732
166 2015년 강좌 104 - [부저] 회로내장형 키트 17-08-23 802
165 2015년 강좌 103 - [타이머인터럽트-17] 스위치 누르는 시간 체크 키트 17-08-23 826
164 2015년 강좌 102 - [타이머인터럽트-16] 스위치 누를 때마다 1칸씩 좌우시프트 키트 17-08-23 878
163 2015년 강좌 101 - [타이머인터럽트-15] 스위치 8개 SRAM에 읽어서 LED에 출력 키트 17-08-23 547
162 2015년 강좌 100 - [타이머인터럽트-14] 스위치 8개 읽어서 LED에 출력 (포트 다이렉트) 키트 17-08-23 666
161 2015년 강좌 099 - [타이머인터럽트-13] 스위치 1개 SRMA에 읽어서 LED에 출력 키트 17-08-23 394
160 2015년 강좌 098 - [타이머인터럽트-12] 스위치 1개 읽어서 LED에 출력 키트 17-08-23 563
159 2015년 강좌 096 - [타이머 CTC 토글-3] 스위치 8개 피아노 키트 17-08-23 519
158 2015년 강좌 095 - [타이머 CTC 토글-2] Sound Test 키트 17-08-23 430
157 2015년 강좌 094 - [타이머 CTC 토글-1] Freq. Test 키트 17-08-23 466
게시물 검색

Privacy Policy
MCU BASIC ⓒ 2017