제목 : 세그먼트 점수판
하는 역할 : 점수판을 보여준다
사용한 재료 : 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 |
'아트메가 > 활용' 카테고리의 다른 글
아트메가를 이용한 스마트 세그먼트 (0) | 2018.01.22 |
---|---|
아트메가를 사용한 디지털 온도계 (3) | 2017.07.07 |
아트메가를 사용한 디지털 도어락 (2) | 2017.01.18 |
아트메가를 사용한 블루투스 스피커 무드등 (22) | 2016.12.16 |
아트메가를 이용한 메트로놈 LED (1) | 2016.11.19 |