J 창고

[Atmega128] 4Digit FND Count 본문

컴퓨터/Firmware

[Atmega128] 4Digit FND Count

JSFamily 2015. 1. 4. 14:30








회로도는


에 있으며 저기에 더 추가해서 총 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


Comments