본문 바로가기
코스웨어/16년 스마트컨트롤러

20160315_김도관_업무일지_7Segment_스위치제어

by 알 수 없는 사용자 2016. 3. 17.
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 = 030000>uiCnt ; ++uiCnt);
    uiState = 1;
    
    return;
}
 
void __vector_2(void
{    
    volatile unsigned int uiCnt;
     for(uiCnt = 030000>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