아트메가/활용

아트메가를 사용한 세그먼트 점수판

원원 2016. 11. 19. 23:52

제목 : 세그먼트 점수판

하는 역할 : 점수판을 보여준다

사용한 재료 : Atmega128,4세그먼트, LED, 버튼,케페시터, 만능기판,저항



부품을 적절한곳에 배치한다.


열심히 납땜한다.


아트메가와 납땜한 것을 연결해서 제대로 동작하나 확인한다.


아트메가를 만능기판 뒤에 고정시키고

건전지(1.5V)*3를 연결한다음에 만능기판에 고정시킨다



세그먼트가 총 4조각 있는데두 팀의 점수를 표시해주는 것이다. 그냥 점수를 99까지 표시하는 모드가있고(모드1)

 목표 점수를 설정해놓은 다음에 그 점수가 되면 부저가 울리고 LED가 켜지는 모드가 있다. (모드2)

PB1,PB2 현재 모드를 나타낸다

모드1일때 PD3,PD2,PD1,PD0-세그먼트 점수올리기 PE4 점수초기화

모드2일때 - - : 0 0 이 화면에서 PD1,PD0으로 점수를 설정해주고 설정이 완료되었으면 PD3(확인)버튼을 누르고 점수를 다시 설정하려면PD2버튼을 누른다. 그러고나면 00:00화면이 된다음에, 점수를 올릴수 있다. 점수를 올리고 해당 점수가 되면 그 위치에 맞는 PB3,PB4 LED가켜진다.


작동동영상



소스코드

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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
 
#define F_CPU 16000000UL  
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <string.h>
#include <stdlib.h>
 
volatile int ATeam1,ATeam2,BTeam1,BTeam2;  //점수 변수
volatile int modeFlag,battleFlag;
volatile int goalScore,curAScore,curBScore ;
unsigned char num[10= {0x40,0x79,0x24,0x30,0x19,0x12,0x03,0x78,0x00,0x10}; // num0~9  0xbf = -
 
void initScore() //점수 초기화
{
    ATeam1 = 0;
    ATeam2 = 0;
    BTeam1 = 0;
    BTeam2 = 0;
    goalScore=0;
    battleFlag=0;
    curAScore=0;
    curBScore=0;
    PORTB &=0xe7;
}
void initScore2()
{
    ATeam1 = 0;
    ATeam2 = 0;
    BTeam1 = 0;
    BTeam2 = 0;
    curAScore=0;
    curBScore=0;
    PORTB &=0xe7;
}
 
void init() //설정 함수
{
 
    PORTD=0xff//풀업 설정
    DDRD=0x00//포트가 버튼으로 사용하겟다(1~5, 1~4번 자릿수 더하기 5번 초기화)
 
    PORTE=0xff//풀업 설정
    DDRE=0x00// 5번 버튼임
 
    DDRC=0xff// 팀 자릿수
    DDRA=0xff;//세그먼트 자릿수
 
    DDRB=0xff// PB0 부저 PB1 LED1 PB2 LED2
    //인터럽트 설정
    EICRA=0xaa;   // 외부인터럽트INT0~3 하강엣지 인터럽트 트리거
    EICRB=0x0a;  // 외부인터럽트INT4,5 하강엣지 인터럽트 트리거
 
    EIMSK=0x3f// 외부인터럽트 ENABLE해주기
    //EIFR=0x1f; // 외부 인터럽트 플레그 레지스터 지금은 그냥 클리어시키기(상관있나없나 테스트해보기)
    SREG |=0x80;// 전역변수 인터럽트 ENABLE시키기
    //
}
void segmentNum(int dis) //세그먼트 숫자
{   
   PORTA=num[dis];
}
 
void displayNum()
{
            
            PORTC=0x18;
            segmentNum(ATeam1);
            _delay_us(40);
 
            PORTC=0x14;
            segmentNum(ATeam2);
            _delay_us(30);
 
            PORTC=0x12;
            segmentNum(BTeam1);
            _delay_us(20);
   
                PORTC=0x11;
            segmentNum(BTeam2);
            _delay_us(10);
}
 
void displayNum2()
{
            
            PORTC=0x18;
            segmentNum(ATeam1);
            _delay_us(40);
 
            PORTC=0x14;
            segmentNum(ATeam2);
            _delay_us(30);
 
            PORTC=0x12;
            PORTA=0xbf;
            _delay_us(20);
   
               PORTC=0x11;
            PORTA=0xbf;
            _delay_us(10);
}
 
void sound_on(int sound)
{
    PORTB |=0x01;
    _delay_ms(sound);
    PORTB &=0xfe;
    _delay_ms(sound);
}
 
 
 
 
void sumABScore()
{
    if(goalScore)
    {
        if(curAScore >= goalScore)
        {
            PORTB |= 0x10;
            sound_on(100);
            goalScore=100//한번만 실행되게하기
        }
        else if(curBScore >= goalScore)
        {
            PORTB |= 0x08;
            sound_on(100);
            goalScore=100//한번만 실행되게하기
        }
        else
        {
            curAScore=ATeam1 + ATeam2*10;
            curBScore=BTeam1 + BTeam2*10;
        }
    }
}
 
 
SIGNAL(SIG_INTERRUPT0)  
{
    ATeam1++;    
    if(ATeam1 == 10)
    {
        ATeam2++;
        ATeam1=0;
    }
}
 
SIGNAL(SIG_INTERRUPT1)
{
    ATeam2++;
    if(ATeam2==10)
    {
        ATeam2=0;
    }
 
}
 
 
SIGNAL(SIG_INTERRUPT2) //이거 취소버튼
{
    if(modeFlag || battleFlag)
    {
        BTeam1++;
        if(BTeam1 == 10)
        {
            BTeam2++;
            BTeam1=0;
        }
    }
    else if(!modeFlag)
    {
        sound_on(10);
        initScore2();
    }
}
 
SIGNAL(SIG_INTERRUPT3) //이거 확인 버튼 
{
    if(modeFlag || battleFlag)
    {
        BTeam2++;
        if(BTeam2==10)
        {
            BTeam2=0;
        }
    }
    else if(!modeFlag)
    {
        goalScore = ATeam1+ATeam2*10;
        if(goalScore)
        {
            sound_on(10);
            battleFlag=1//점수 정해짐
            initScore2();
        }
    }
    
}
 
 
SIGNAL(SIG_INTERRUPT4)
{
    initScore();
    sound_on(10);
}
 
 
SIGNAL(SIG_INTERRUPT5) //select mode..
{
    modeFlag ^=1;
    initScore();
}
 
 
 
 
int main(void)
{
    init();
    initScore();
    modeFlag = 1//0 모드 점수 카운팅모드 , 1모드 점수 설정모드 최대 99점  - - 0 0 가 초기값 
 
   while(1)
    {
 
          
 
 
        if(modeFlag)
        {
            PORTB = 0x02;
            displayNum();
 
        }
        else if(!modeFlag && !battleFlag) //모드1 , 확인버튼 안눌렀을때
        {    
            PORTB =0x04;        
            displayNum2();
            // - - 0 0 출력
 
        }
        else if(!modeFlag && battleFlag) //모드1 , 확인버튼 눌럿을때
        {
            PORTB |=0x04;
            displayNum();
            sumABScore();
        }
        
    }
 
}
   
   
 
 
cs