회로도는
에 있으며 저기에 더 추가해서 총 4 Digit으로 구성했다
다만 상위 2 Digit은 Common Cathode 이고
하위 2 Digit은 Common Anode 이다
그래서 하위 2 Digit을 HC595write 함수에 전달할 때 반전 시켜준다.
배선은
PORTA.0 <========> DS (DATA)
PORTA.1 <========> STCP (LATCH)
PORTA.2 <========> SHCP (CLOCK)
로 구성했다.
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 | /* * 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> 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; unsigned int num_buf = 0; while(1){ HC595write_4byte(num_buf); _delay_ms(10); num_buf++; if(num_buf>9999) num_buf = 0; } } | cs |