상위 2digit은 sec, 하위 2digit 은 microsec로
FND 카운트가 60.00 sec 가 넘어가면 리셋되는 방식으로
(분 카운트도 하고 싶지만 74HC595가 부족해서... ㅠㅠ)
시계 구현..
이제 Externel Interrupt 를 이용해서 스탑워치를 셋팅 예정.
Prescaler = 64
OCR0 = 249
16Mhz / 64 / (1+249) = 1000Hz
1000Hz => 1ms
1ms 단위로 인터럽트 발생하고
발생할 때마다 count++ 하고
count = 10 이 초시계 msec++ 하여 초시계 작동
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 | /* * StopWatch.c * * Created: 2015-01-04 오후 1:46:41 * Author: user * DATA DS <-----> PORTA.0 CLOCK SHCP <-----> PORTA.2 LATCH STCP <-----> PORTA.1 Digit 4,3 = Common Cathode Type FND Digit 2,1 = Common Anode Type FND */ #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> volatile unsigned char count = 1; volatile unsigned int msec = 0; void HC595write(unsigned char); void HC595write_4byte(unsigned int); ISR(TIMER0_COMP_vect){ count --; if (count == 0){ HC595write_4byte(msec++); if(msec >= 6000) msec = 0; count=10; PORTD = ~PORTD; } } void HC595write(unsigned char udata){ unsigned char i; i = 0; while(i<=7){ PORTA = ( udata >> i) & 0x01; // DATA PORTA |= 0b00000100; // SHIFT 1 PORTA &= 0b11111011; // SHIFT 0 i++; } } void HC595write_4byte(unsigned int udata){ unsigned char digit_common_cathode[10] = { 0b11111100, //0 0b01100000, //1 0b11011010, //2 0b11110010, //3 0b01100110, //4 0b10110110, //5 0b00111110, //6 0b11100100, //7 0b11111110, //8 0b11100110 //9 }; PORTA &= 0b11111110; // DATA 0 PORTA &= 0b11111011; // SHIFT 0 PORTA &= 0b11111101; // LATCH 0 unsigned char d1000 = digit_common_cathode[udata/1000]; unsigned char d100 = digit_common_cathode[(udata%1000)/100]; unsigned char d10 = digit_common_cathode[(udata%100)/10]; unsigned char d1 = digit_common_cathode[udata%10]; HC595write(d1000); HC595write(d100); HC595write(~d10); HC595write(~d1); PORTA |= 0b00000010; // LATCH 0 PORTA &= 0b11111101; // LATCH 1 } int main(void){ DDRA = 0xFF; DDRD = 0x01; PORTA = 0x00; PORTD = 0x01; TCCR0 = (1<<WGM01) | (1<<CS02); OCR0 = 0xF9; // OCR0 = 249 TIMSK |= 0x02; sei(); while(1){ } } | cs |