만들기가 쉽지 않았던 LED 도트 매트릭스 시계 + 온도계 > DIY / 자작사진

본문 바로가기

쇼핑몰 검색

회원메뉴

즐겨찾기 추가

회원로그인

감사합니다


만들기가 쉽지 않았던 LED 도트 매트릭스 시계 + 온도계

페이지 정보

작성자 miscellany 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일12-11-25 15:32 조회17,391회 댓글6건

본문

제작에 사용된 것은 만물상에서 파는 32*16 도트매트릭스 2개와 온도 센서 입니다.



집에 있는 아날로그 벽시계들이 하나 둘씩 맛이 가기 시작한지가 좀 되네요.
여기 저기 있는 시계들이 지네들 혼자서 놀기 시작하더니 시계라는 기능을 상실한지 오래 되었습니다.
제 나이보다 오래 된, 아버지께서 외항 선원일적에 배에서 사용하던 선박용 세이코 시계.
모든 시계들이 1~2년이면 맛이 가기 시작할때도 배 시계답게 30여년을 정확하게 지키던 이 세이코 시계도 슬 상태가 나빠지기 시작합니다.
그리고 자다가 시간을 봐야 할 경우, 휴대폰을 켜는 방법 말고는 쉽게 확인 할 방법이 없네요.

그래서 전자 시계를 살까 했지만, 역시나 살 필요가 있나 싶었습니다.

왜냐면 어둘울때 시간을 볼수 있는 시계들은 대부분 전기를 사용하는 시계들인데 하루 종일 전기를 꽂아두어야 한다는거죠.
전 출근 때 멀티탭으로 모둔 전기를 다 꺼버리고, 집에 오면 켜거든요.
보통 전기 시계들은 한두시간은 내장 배터리로 버틸지 모르겠지만 매일 12시간 이상이 꺼져있어야 한다면, 이런 기준에 맞는 시계가 있을지 모르겠거든요.
그래서 만들기로 했습니다.

LED 나 FND 는 숫자를 키우는데 한계가 있기 때문에 조작하기 쉽고, 정보 표현력이 다양한 LED 도트 매트릭스를 사용하고, 새 제품일 경우 내장된 배터리로 10년간은 동작을 하는 RTC를 사용하는거죠.
그리고 이왕이면 온도계까지.

이미 차량용 후방 메시지 장비(http://http://www.dudals.net/3026)를 통해 LED 도트 매트릭스는 사용을 해봤고, RTC로 사용을 해봤고, 온도계가 남았는데.... 여기서 문제입니다.
디지탈로 출력하는 비싼 걸 사용할건지, 싸구려 센서로 사용할건지.

집에 돌고 도는 온도 센서가 있는데 모델명도 몰라요, 사용법도 몰라요.... -_-;;
그래서 찾아다녔습니다. 박막 센서, 센서 와이어.... 고생 끝에 써미스터 라는건 알았고, 이게 온도에 따른 저항 감소형(NTC)/증가형(PTC)가 있다네요.
사용법도 쉽지가 않아요. 온도에 따른 저항 값이 로그 곡선을 그린다고...

누구는 온도 측정용 수조를 만들어 직접 측정를 해서 엑셀 테이블로 만들어 소스 코드에 계산식이 아닌 테이블을 넣는 방법을 구현하더군요. 오죽 쉬운게 아니면..
이래 저래 찾아 결국은 공식을 찾았습니다.
그리고 만들었죠.

와~ 원하던 기능이 다 들어간 디지탈 시계가 되었습니다.
근데 그 기쁨도 잠시 실수로 소스를 날려버린거죠. -_-;;

그래서 위에서 하던 모든 과정을 처음부터 다시 했습니다. 무려 한달동안요.

2개를 만들었습니다.

하나는 제 방에. 하나는 어머니 방에..

좀 아쉬운게 있다면 광센서를 하나 달아서 어두워지면 밝기가 좀 낮아지도록 했으면 하는게 200원짜리 CDS를 인터넷에서 구매하기엔 너무 배송비가 비싸서... 아직 그냥 있네요.
사설이 길었는데 이제 사진이랑 소스가 올라갑니다.

소스를 보면 회로 구성은 어렵지 않을겁니다. 저도 회로도가 없어요.. ^_^;;

ATMEGA128 + RTC(DS12C887) + NTC 온도 센서 2개 사용 입니다.
원래 온도는 실내/실외로 할려고 했었죠.

/*
    -Wl,-u,vfprintf -lprintf_flt -lm
    -Wl,-u,vfscanf -lscanf_flt -lm
    퓨즈 비트 ff cf ff
    */
   
    #include <avr/io.h>
    #include "delay.h"
    #include "math.h"
    #include "stdio.h"
   
    #define F_CPU 16000000UL
   
    #define SetBit(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
    #define ClearBit(ADDRESS,BIT)     (ADDRESS &= ~(1<<BIT))
    #define CheckBit(ADDRESS,BIT)     (ADDRESS & (1<<BIT))
   
    #define LDM_ADDR_PORT PORTA
    #define LDM_ADDR_DDR DDRA
    //#define LDM_R_BIT      3
    //#define LDM_ADDR_WRITEMODE() LDM_ADDR_DDR |= 0x0f
    #define LDM_ADDR_INIT() LDM_ADDR_DDR = 0x0f
   
    #define LDM_R_PORT PORTB
    #define LDM_R_DDR DDRB
    #define LDM_R_BIT      3
    #define LDM_R_INIT() SetBit(LDM_R_DDR,LDM_R_BIT)
    #define LDM_R_LOW() ClearBit(LDM_R_PORT,LDM_R_BIT)
    #define LDM_R_HIGH() SetBit(LDM_R_PORT,LDM_R_BIT)
   
    #define LDM_G_PORT PORTB
    #define LDM_G_DDR DDRB
    #define LDM_G_BIT      4
    #define LDM_G_INIT() SetBit(LDM_G_DDR,LDM_G_BIT)
    #define LDM_G_LOW() ClearBit(LDM_G_PORT,LDM_G_BIT)
    #define LDM_G_HIGH() SetBit(LDM_G_PORT,LDM_G_BIT)
   
    #define LDM_LT_PORT PORTB
    #define LDM_LT_DDR DDRB
    #define LDM_LT_BIT      5
    #define LDM_LT_INIT() SetBit(LDM_LT_DDR, LDM_LT_BIT)
    #define LDM_LT_LOW() ClearBit(LDM_LT_PORT, LDM_LT_BIT)
    #define LDM_LT_HIGH() SetBit(LDM_LT_PORT, LDM_LT_BIT)
   
    #define LDM_nOE_PORT PORTB
    #define LDM_nOE_DDR DDRB
    #define LDM_nOE_BIT      6
    #define LDM_nOE_INIT() SetBit(LDM_nOE_DDR, LDM_nOE_BIT)
    #define LDM_nOE_LOW() ClearBit(LDM_nOE_PORT,LDM_nOE_BIT)
    #define LDM_nOE_HIGH() SetBit(LDM_nOE_PORT, LDM_nOE_BIT)
   
    #define LDM_CLK_PORT PORTB
    #define LDM_CLK_DDR DDRB
    #define LDM_CLK_BIT      7
    #define LDM_CLK_INIT() SetBit(LDM_CLK_DDR, LDM_CLK_BIT)
    #define LDM_CLK_LOW() ClearBit(LDM_CLK_PORT,LDM_CLK_BIT)
    #define LDM_CLK_HIGH() SetBit(LDM_CLK_PORT, LDM_CLK_BIT)
   
    #define LDM_INIT() LDM_ADDR_INIT(); LDM_R_INIT(); LDM_G_INIT(); LDM_LT_INIT(); LDM_nOE_INIT(); LDM_CLK_INIT()
   
    #define DS12C887_DATA_PIN PIND
    #define DS12C887_DATA_PORT PORTD
    #define DS12C887_DATA_DDR DDRD
    #define DS12C887_DATA_WRITEMODE() DS12C887_DATA_DDR = 0xff
    #define DS12C887_DATA_READMODE() DS12C887_DATA_DDR = 0x00
   
    #define DS12C887_AS_PORT PORTE
    #define DS12C887_AS_DDR DDRE
    #define DS12C887_AS_BIT      4
    #define DS12C887_AS_INIT() SetBit(DS12C887_AS_DDR, DS12C887_AS_BIT)
    #define DS12C887_AS_LOW() ClearBit(DS12C887_AS_PORT, DS12C887_AS_BIT)
    #define DS12C887_AS_HIGH() SetBit(DS12C887_AS_PORT, DS12C887_AS_BIT)
   
    #define DS12C887_DS_PORT PORTE
    #define DS12C887_DS_DDR DDRE
    #define DS12C887_DS_BIT        5
    #define DS12C887_DS_INIT() SetBit(DS12C887_DS_DDR, DS12C887_DS_BIT)
    #define DS12C887_DS_LOW() ClearBit(DS12C887_DS_PORT, DS12C887_DS_BIT)
    #define DS12C887_DS_HIGH() SetBit(DS12C887_DS_PORT, DS12C887_DS_BIT)
   
    #define DS12C887_RW_PORT PORTE
    #define DS12C887_RW_DDR DDRE
    #define DS12C887_RW_BIT      6
    #define DS12C887_RW_INIT() SetBit(DS12C887_RW_DDR, DS12C887_RW_BIT)
    #define DS12C887_RW_LOW() ClearBit(DS12C887_RW_PORT,DS12C887_RW_BIT)
    #define DS12C887_RW_HIGH() SetBit(DS12C887_RW_PORT, DS12C887_RW_BIT)
   
    #define DS12C887_nCS_PORT PORTE
    #define DS12C887_nCS_DDR DDRE
    #define DS12C887_nCS_BIT      7
    #define DS12C887_nCS_INIT() SetBit(DS12C887_nCS_DDR, DS12C887_nCS_BIT)
    #define DS12C887_nCS_LOW() ClearBit(DS12C887_nCS_PORT, DS12C887_nCS_BIT)
    #define DS12C887_nCS_HIGH() SetBit(DS12C887_nCS_PORT, DS12C887_nCS_BIT)
   
    #define DS12C887_INIT() DS12C887_DATA_READMODE(); DS12C887_AS_INIT(); DS12C887_DS_INIT(); DS12C887_RW_INIT(); DS12C887_nCS_INIT()
   
    #define RTC_Sec                        0x00
    #define RTC_SEC_ALM                    0x01
    #define RTC_Min                        0x02
    #define RTC_MIN_ALM                    0x03
    #define RTC_Hour                        0x04
    #define RTC_Hour_ALM                    0x05
    #define RTC_WEEKDay                    0x06
    #define RTC_Day                        0x07
    #define RTC_Mon                        0x08
    #define RTC_Year                        0x09
    #define RTC_A                          0x0A
    #define RTC_B                          0x0B
    #define RTC_C                          0x0C
    #define RTC_D                          0x0D
    //#define RTC_10Year0x32 // 세기년도
   
    struct TimeBase {
        uint8_t Year;
        uint8_t Mon;
        uint8_t Day;
        uint8_t Hour;
        uint8_t Min;
        uint8_t Sec;
    } CurDate,SetDate;
   
    uint8_t DrawBuffer[16][8]= // 화면에 그려질 실제 데이터
    {
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
    };
   
    uint8_t Font8x16[13][16]=
    {
    { 0x00, 0x00, 0x1C, 0x36, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00, 0x00 }, // 0
    { 0x00, 0x00, 0x0C, 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x00, 0x00 }, // 1
    { 0x00, 0x00, 0x3E, 0x63, 0x63, 0x03, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x60, 0x7F, 0x00, 0x00 }, // 2
    { 0x00, 0x00, 0x3E, 0x63, 0x63, 0x03, 0x03, 0x3E, 0x03, 0x03, 0x03, 0x63, 0x63, 0x3E, 0x00, 0x00 }, // 3
    { 0x00, 0x00, 0x0E, 0x0E, 0x1E, 0x1E, 0x36, 0x36, 0x66, 0x66, 0xFF, 0x06, 0x06, 0x06, 0x00, 0x00 }, // 4
    { 0x00, 0x00, 0x7F, 0x60, 0x60, 0x60, 0x7E, 0x63, 0x03, 0x03, 0x03, 0x63, 0x63, 0x3E, 0x00, 0x00 }, // 5
    { 0x00, 0x00, 0x3E, 0x63, 0x63, 0x60, 0x60, 0x7E, 0x63, 0x63, 0x63, 0x63, 0x63, 0x3E, 0x00, 0x00 }, // 6
    { 0x00, 0x00, 0x7F, 0x7F, 0x06, 0x06, 0x0C, 0x0C, 0x0C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00 }, // 7
    { 0x00, 0x00, 0x3E, 0x63, 0x63, 0x63, 0x63, 0x3E, 0x63, 0x63, 0x63, 0x63, 0x63, 0x3E, 0x00, 0x00 }, // 8
    { 0x00, 0x00, 0x3E, 0x63, 0x63, 0x63, 0x63, 0x63, 0x3F, 0x03, 0x03, 0x63, 0x63, 0x3E, 0x00, 0x00 }, // 9
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // .
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }  // -
    };
   
    uint8_t Font8x8[13][8]=
    {
    { 0x3e, 0x22, 0x22, 0x22, 0x22, 0x22, 0x3e, 0x00 }, // 0
    { 0x18, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3e, 0x00 }, // 1
    { 0x3e, 0x02, 0x02, 0x3e, 0x20, 0x20, 0x3e, 0x00 }, // 2
    { 0x3e, 0x02, 0x02, 0x3e, 0x02, 0x02, 0x3e, 0x00 }, // 3
    { 0x22, 0x22, 0x22, 0x3e, 0x02, 0x02, 0x02, 0x00 }, // 4
    { 0x3e, 0x20, 0x20, 0x3e, 0x02, 0x02, 0x3e, 0x00 }, // 5
    { 0x3e, 0x20, 0x20, 0x3e, 0x22, 0x22, 0x3e, 0x00 }, // 6
    { 0x3e, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00 }, // 7
    { 0x3e, 0x22, 0x22, 0x3e, 0x22, 0x22, 0x3e, 0x00 }, // 8
    { 0x3e, 0x22, 0x22, 0x3e, 0x02, 0x02, 0x3e, 0x00 }, // 9
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // .
    { 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00 }  // -
    };
   
    uint8_t RTCTime[4];
    uint16_t Temperature[2];
    uint8_t PreviousSec;
   
    void RTC_Write(uint8_t Address, uint8_t Data)
    {
        DS12C887_DATA_WRITEMODE();
   
        DS12C887_nCS_LOW();
   
        DS12C887_DATA_PORT = Address;
   
        DS12C887_AS_HIGH();
   
        DS12C887_AS_LOW();
   
        DS12C887_DATA_PORT = Data;
   
        DS12C887_RW_LOW();
   
        DS12C887_RW_HIGH();
   
        DS12C887_nCS_HIGH();
   
        DS12C887_DATA_READMODE();
   
    // DelayMs(1);
    };
   
    uint8_t RTC_Read(uint8_t Address)
    {
        uint8_t Data = 0;
   
        DS12C887_DATA_WRITEMODE();
   
        DS12C887_nCS_LOW();
   
        DS12C887_DATA_PORT = Address;
   
        DS12C887_AS_HIGH();
   
        DS12C887_AS_LOW();
   
        DS12C887_DATA_READMODE();
   
        DS12C887_DS_LOW();
   
        DS12C887_DS_HIGH();
   
        DS12C887_nCS_HIGH();
   
    //DelayMs(1);
        Data = DS12C887_DATA_PIN;
   
        return Data;
    };
   
    void Init_Time(void)
    {
        CurDate.Year = 9;
        CurDate.Mon = 5;
        CurDate.Day = 0x20;
   
        CurDate.Hour = 0x12;
        CurDate.Min = 0;
   
        Save_Time();
    }
   
    uint16_t ConvertADCToThermister(uint16_t ADCValue)
    {
    double Temp;
   
    Temp = log(((10240000/ADCValue) - 10000));
    Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp );
    Temp = Temp - 273.15;            // Convert Kelvin to Celcius
    //Temp = (Temp * 9.0)/ 5.0 + 32.0; // Convert Celcius to Fahrenheit
   
    return (uint16_t) (Temp  * 10);
    }
   
    void CheckTemperature(uint8_t Channel)
    {
    uint16_t ADCValue;
   
    // ADCSRA = 0xC7;
    // DelayMs(1);
   
    // ADCSRA |= 0x08;
    //ADCSRA |= 0x40;
   
    while ((ADCSRA & 0x40) == 0x40);
   
    ADCValue = ADCL + (ADCH * 256);
   
    switch(Channel) // 반드시 ADCL 부터 읽어야 함
    {
    case 0:
    Temperature[0] = ConvertADCToThermister(ADCValue);
   
    // ADMUX = 0x41;
    break;
    case 1:
    Temperature[1] = ConvertADCToThermister(ADCValue);
   
    // ADMUX = 0x40;
    break;
    }
   
    // ADCSRA = 0x00;
    // ADCSRA = 0x87;
    ADCSRA = 0x10;
    }
   
    void Get_Time(void)
    {
    /*
        CurDate.Year= RTC_Read(RTC_Year);
   
        CurDate.Mon = RTC_Read(RTC_Mon);
        CurDate.Day = RTC_Read(RTC_Day);
   
    */
        CurDate.Hour= RTC_Read(RTC_Hour);
        CurDate.Min = RTC_Read(RTC_Min);
   
        CurDate.Sec = RTC_Read(RTC_Sec);
   
    sprintf(RTCTime,"%2d%02d",CurDate.Hour,CurDate.Min);
   
    if (PreviousSec != CurDate.Sec)
    {
    PreviousSec = CurDate.Sec;
   
    switch(PreviousSec % 2)
    {
    case 0:
    ADCSRA = 0x00;
    ADMUX = 0x40;
   
    ADCSRA = 0x87;
    ADCSRA |= 0x50;
    CheckTemperature(0);
    ADMUX = 0x00;
    break;
    case 1:
    ADCSRA = 0x00;
    ADMUX = 0x41;
    ADCSRA = 0x87;
    ADCSRA |= 0x50;
    CheckTemperature(1);
    ADMUX = 0x00;
    break;
    case 4:
    break;
    }
   
    MergeTemperature();
   
    /*
    if (PreviousSec < 30)
    {
    DrawBuffer[0][0] = 0x40 >> (CurDate.Sec);
    DrawBuffer[0][1] = 0x100 >> (CurDate.Sec - 6);
    DrawBuffer[0][2] = 0x100 >> (CurDate.Sec - 14);
    DrawBuffer[0][3] = 0x100 >> (CurDate.Sec - 22);
    }
    else
    {
    DrawBuffer[0][3] = (0x01 << (CurDate.Sec - 29)) >> 1;
    DrawBuffer[0][2] = (0x01 << (CurDate.Sec - 37)) >> 1;
    DrawBuffer[0][1] = (0x01 << (CurDate.Sec - 45)) >> 1;
    DrawBuffer[0][0] = (0x01 << (CurDate.Sec - 53)) >> 1;
    }
    */
    }
    }
   
    void MergeTime(void)
    {
    uint8_t LoopCount,Row,Col;
    uint8_t temp;
    uint8_t FontIndex;
   
    // sprintf(RTCTime,"%02d%02d%02d%02d",8,9,10,11);
   
    for (LoopCount=0;LoopCount<4;LoopCount++)
    {
    temp = RTCTime[LoopCount];
   
    if (temp == ' ')
    {
    FontIndex = 10;
    }
    else if (temp == '.')
    {
    FontIndex = 11;
    }
    else if (temp == '-')
    {
    FontIndex = 12;
    }
    else
    FontIndex = temp - 0x30;
   
    for(Row=1;Row<16;Row++)
    {
    DrawBuffer[Row][LoopCount] = Font8x16[FontIndex][Row];
    }
   
    }
    }
   
    void MergeTemperature(void)
    {
    uint8_t LoopCount,Row,Col;
    uint8_t temp0;
    uint8_t temp1;
    uint8_t FontIndex0;
    uint8_t FontIndex1;
   
    uint8_t Temperature0[4];
    uint8_t Temperature1[4];
   
    sprintf(Temperature0,"%4d",Temperature[0]);
    sprintf(Temperature1,"%4d",Temperature[1]);
   
    for (LoopCount=0;LoopCount<4;LoopCount++)
    {
    temp0 = Temperature0[LoopCount];
    temp1 = Temperature1[LoopCount];
   
    if (temp0 == ' ')
    {
    FontIndex0 = 10;
    }
    else if (temp0 == '.')
    {
    FontIndex0 = 11;
    }
    else if (temp0 == '-')
    {
    FontIndex0 = 12;
    }
    else
    FontIndex0 = temp0 - 0x30;
   
    if (temp1 == ' ')
    {
    FontIndex1 = 10;
    }
    else if (temp1 == '.')
    {
    FontIndex1 = 11;
    }
    else if (temp1 == '-')
    {
    FontIndex1 = 12;
    }
    else
    FontIndex1 = temp1 - 0x30;
   
    for(Row=0;Row<8;Row++)
    {
    DrawBuffer[Row][LoopCount+4] = Font8x8[FontIndex0][Row];
    DrawBuffer[Row+8][LoopCount+4] = Font8x8[FontIndex1][Row];
    }
    }
   
    DrawBuffer[6][7] |= 0x80;
    DrawBuffer[14][7] |= 0x80;
    }
   
    //==============================================================================================
    void Save_Time(uint8_t year,uint8_t mon,uint8_t day,uint8_t hour,uint8_t min,uint8_t sec)
    {
        RTC_Write(RTC_A,0xA0);
        RTC_Write(RTC_B,0x62);
   
        RTC_Write(0x0A, 0x2F);  // A 레지스터 선택, A 레지스터에 데이터 전송, 오실레이터를 on 시키고,
        RTC_Write(0x0B, 0x80);
   
    RTC_Write(RTC_Year,year);
        RTC_Write(RTC_Mon,mon);
   
        RTC_Write(RTC_Day, day);
        RTC_Write(RTC_Hour,hour);
   
        RTC_Write(RTC_Min, min);
        RTC_Write(RTC_Sec, sec);
   
        RTC_Write(RTC_A,0x20);
        RTC_Write(RTC_B,0x04);
    }
   
    void DrawDotMatrix(void)
    {
        uint8_t ROW,BLOCK = 0;
        uint8_t font;
        int COL;
   
    switch(PreviousSec % 2)
    {
    case 0:
    DrawBuffer[6][2] |= 0x80;
    DrawBuffer[9][2] |= 0x80;
    break;
    case 1:
    DrawBuffer[6][2] &= 0x7F;
    DrawBuffer[9][2] &= 0x7F;
    break;
    }
   
    LDM_R_LOW();
   
        LDM_nOE_LOW();
   
        for (ROW = 0; ROW < 16; ROW++)
        {
            for (BLOCK = 0; BLOCK < 8; BLOCK++)
            {
                font = DrawBuffer[ROW][BLOCK];
   
    //font = 0x7e;
   
                for (COL = 0; COL < 8; COL ++)
                {
                    if (font & 0x80)
                    {
    LDM_G_HIGH();
                    }
                    else
                    {
          LDM_G_LOW();
                    }
   
                    font = font << 1; // 다음 도트의 데이터를 검출하기 위해 한 비트 shift
   
                    LDM_CLK_HIGH();
                    LDM_CLK_LOW();
                }
            }
   
            LDM_nOE_HIGH();
            LDM_LT_HIGH();
            LDM_LT_LOW();
            LDM_ADDR_PORT = ROW;
            LDM_nOE_LOW();
        }
        LDM_nOE_HIGH();
    }
   
    void main(void)
    {
   
   
        PORTA = 0xFF; // LDM_ADDR_PORT
        PORTB = 0xFF; // LDM_CONTROL_PORT
        PORTC = 0xFF;
        PORTD = 0xFF; // DS12C887_DATA_PORT
        PORTE = 0xFF; // DS12C887_CONTROL_PORT
        PORTF = 0x00; // ADC
   
        DDRA = 0x00; // LDM_ADDR_PORT
        DDRB = 0x00; // LDM_CONTROL_PORT
        DDRC = 0x00;
        DDRD = 0x00; // DS12C887_DATA_PORT
        DDRE = 0x00; // DS12C887_CONTROL_PORT
        DDRF = 0x00; // ADC
   
    LDM_INIT();
    DS12C887_INIT();
   
    // RTC_Write(RTC_B,0x06);
    // DelayS(1);
    // RTC_Write(RTC_B,0x02);
      RTC_Write(RTC_A,0x20);
    // RTC_Write(RTC_B,0x02);
   
    DelayS(1);
    // RTC_Write(RTC_B,0x86);
   
    //Save_Time(01,10,14,13,57,00);
    // RTC_Write(0x0b,0x06);  //초기 시간입력시는 SETBIT,DM,24HOUR비트 설정할것
   
    /*
      RTC_Write(0X09,0x00);    //year
      RTC_Write(0X08,0x1);    //월
      RTC_Write(0X07,0x1);    //일
      RTC_Write(0X04,0x20);    //시
      RTC_Write(0x02,0x57);    //분
      RTC_Write(0X00,0x00);    //초
      RTC_Write(0x06,0x0);    //분
      RTC_Write(0X50,0x20);    //year
    */
    RTC_Write(RTC_B,0x06);
   
    ADCSRA = 0x00; //disable adc
   
    while(1)
    {
    Get_Time();
    MergeTime();
    DrawDotMatrix();
    }
    }

댓글목록

SECURED BY RapidSSL

회사명 선인만물 주소 경기도 시흥시 수인로2979번길 40
사업자 등록번호 140-02-91346 대표 김원규 전화 010-5253-7691/031-315-8691 팩스 031-315-8692
통신판매업신고번호 시흥 제 2007-4호 개인정보관리책임자 김원규
Copyright © 2001-2013 선인만물. All Rights Reserved.

모바일버전 보기 상단으로