728x90
반응형
작업 :
0~99까지 7Segment에 연속적으로 반복될때
버튼을 누르면 멈추기
개요 : 11일에 만들었던 7segment를 응용해서 버튼으로 동작 제어
main.c
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 | #include "main.h" volatile unsigned int uiState; //int 버스에 최적화된 타입 int main(void) { volatile unsigned int uiCnt; volatile unsigned int uiLoop; uiCnt = 0; Init(); uiState = 1; while(1){ sleep(); PORTA = ((uiCnt / 10) << 4)|(uiCnt % 10); for ( uiLoop = 0; uiLoop < 60000; ++uiLoop); //딜레이 if( uiState == 1) { ++uiCnt; } if(uiCnt > 99) //99이상일때 값을 강제로 0으로 { uiCnt = 0; } } return 0; } void Init (void) { Port_Init(); INT_Init(); } void Port_Init(void) // 포트세팅 { DDRA = 0xFF; PORTA = 0x00; } void INT_Init(void) // 인터럽트 { EICRA = (3 << ISC1)|(3 << ISC0); // ISC0 == INT0 EIMSK = (1 << INT1)|(1 << INT0); //EIMSK의 비트 1값들어감 임베디드에서 자주쓰는것 EIMSK = 1 동일 SREG = SREG|(1 << INT7); //다른값건드리면 안됨 //sei(); 와 동일 // 인트럽트활성화 } void __vector_1(void) { volatile unsigned int uiCnt; for(uiCnt = 0; 30000>uiCnt ; ++uiCnt); uiState = 1; return; } void __vector_2(void) { volatile unsigned int uiCnt; for(uiCnt = 0; 30000>uiCnt ; ++uiCnt); uiState = 0; return; } | cs |
1번 : main.h 불러오기
10번 : Init 함수 실행
13번 : 인터럽트 초기화 대기모드가 됨
15 ~24번 : 기존 7Segment 숫자 카운트
17번 : uiState 가 1일때만 uiCnt의 값은 계속 증가함
31번 : Init 함수 - Port_Init 와 INT_Init 함수를 실행시킴
37번 : Port_Init 함수 - 포트에 관련된 값을 세팅
43번 : INT_Init 함수 - 인터럽트 세팅
45번 : EICRA 상승엣지일때 인터럽트 요청...사람이 기계만큼 정확히 누르기는 불가능(실제 여러번 미세하게 누르는상태)
46번 : EIMSK 값이 1
47번 : SREG 인트럽트 활성화
49번 : vector 1 에 uiState값 1을 줘서 누르지 않은 상태 를 저장
58번 : vector 2 에 uiState값 0을 줘서 누르는 상태 를 저장
main.h
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 | #ifndef __MAIN_H__ #define __MAIN_H__ #define DDRA (*((volatile unsigned char *)0x21)) #define PORTA (*((volatile unsigned char *)0x22)) #define PINA (*((volatile unsigned char *)0x20)) #define EICRA (*((volatile unsigned char *)0x69)) #define EICRB (*((volatile unsigned char *)0x6A)) #define EIMSK (*((volatile unsigned char *)0x3D)) #define SREG (*((volatile unsigned char *)0x5F)) #define INT7 7 #define INT6 6 #define INT5 5 #define INT4 4 #define INT3 3 #define INT2 2 #define INT1 1 #define INT0 0 #define ISC7 6 #define ISC6 4 #define ISC5 2 #define ISC4 0 #define ISC3 6 #define ISC2 4 #define ISC1 2 #define ISC0 0 #define sei() __asm__ __volatile__ ("sei" ::) #define sleep() __asm__ __volatile__ ( "sleep" "\n\t" :: ) void Init (void); void Port_Init(void); void INT_Init(void); void __vector_1 (void) __attribute__((signal, used, externally_visible)); void __vector_2 (void) __attribute__((signal, used, externally_visible)); #endif //__MAIN_H_ | cs |
12~19번 : 인터럽트 값
21~28번 : ISC 값
33번 : Init 함수원형
35번 : Port_Init 함수원형
37번 : INT_Init 함수원형
39번 : vector_1 함수원형
40번 : vector_2 함수원형
J19에서 7Segment 출력
J16으로 스위치 제어
728x90
'코스웨어 > 16년 스마트컨트롤러' 카테고리의 다른 글
구글 입사문제 (0) | 2016.03.17 |
---|---|
16.03.16 조승현 업무일지ATmega _lcd 지연문과 문자열에 관해 (4) | 2016.03.17 |
201603016_정일모_업무일지_기억장치 (0) | 2016.03.17 |
20160316_김가연_업무일지_LCD출력 (0) | 2016.03.17 |
20160316_정일모_업무일지_인터렙트 (0) | 2016.03.17 |
20160316_정일모_업무일지_변수 (0) | 2016.03.17 |
ms 마인크래프트를 인공지능에 활용 (3) | 2016.03.17 |
20160315_김도관_업무일지_C언어_if문_전역변수,지역변수 (0) | 2016.03.17 |