MAX7219 Clock (WinAVR)

  • 1 Replies
  • 2998 Views
*

Offline JENG

  • *****
  • 808
  • รู้ทุกเรื่องเว้นเรื่องจริง
    • View Profile
MAX7219 Clock (WinAVR)
« on: May 09, 2013, 03:22:16 pm »
ว่างๆเลยจับมารวมกัน ครับ แสดงเวลาสลับกับวันเดือนปี ง่ายๆเป็นเบสิค ...   ;D
1.Arduino Mega8
2.DS1307
3.ET-DSP8


MAIN.C
Code: [Select]
/*
Program     :max7219 clock (DS1307)
Author      :Somlak Mangnimit
Date        :09/05/2013
MCU         :ATmega8A
Xtal        :16Mhz
Compiler    :WinAVR20100110
Version     :-
Note        :-
*/

//build in library
#define     use_swi2c

#define     SDA_pinx            analog_4
#define     SCL_pinx            analog_5
#define     SDA_pin             pin_analog_4
#define     SDA_ddr             ddr_analog_4
#define     SCL_ddr             ddr_analog_5

//build in library
#define     use_pause

//library
#include    "../m8lib.c"
#include    "max7219.h"

//rtc equ name
#define     rtc_id              0xd0
#define     rtc_sec_addr        0x00
#define     rtc_min_addr        0x01
#define     rtc_hour_addr       0x02
#define     rtc_date_addr       0x04
#define     rtc_month_addr      0x05
#define     rtc_year_addr       0x06

uint8_t table[] PROGMEM = {

    0b01111110,    //0
    0b00110000,    //1
    0b01101101,    //2
    0b01111001,    //3
    0b00110011,    //4
    0b01011011,    //5
    0b00011111,    //6
    0b01110000,    //7
    0b01111111,    //8
    0b01110011,    //9
 
    0b00000010,    //' = 10
    0b00000101,    //r = 11
    0b00110111,    //H = 12
    0b01000011     //c = 13
 
};

//write rtc
void write_rtc(void){

    swi2c_write_byte(rtc_id,rtc_sec_addr,0x00);
    swi2c_write_byte(rtc_id,rtc_min_addr,0x59);
    swi2c_write_byte(rtc_id,rtc_hour_addr,0x23);

    swi2c_write_byte(rtc_id,rtc_date_addr,0x09);
    swi2c_write_byte(rtc_id,rtc_month_addr,0x05);
    swi2c_write_byte(rtc_id,rtc_year_addr,0x13);

}

//main
int main(void){

    uint8_t ds1,ds2,ds3,cnt=0,c=0;

    maxInitial();
    write_rtc();
    pause_ms(1000);
 
    for(;;){

        if(!c){//time

            ds1 = swi2c_read_byte(rtc_id,rtc_hour_addr);
            ds2 = swi2c_read_byte(rtc_id,rtc_min_addr);
            ds3 = swi2c_read_byte(rtc_id,rtc_sec_addr);

            if(cnt++>10){
                c = 1;
                cnt = 0;
            }

        }

        if(c){//date

            ds1 = swi2c_read_byte(rtc_id,rtc_date_addr);
            ds2 = swi2c_read_byte(rtc_id,rtc_month_addr);
            ds3 = swi2c_read_byte(rtc_id,rtc_year_addr);

            if(cnt++>5){
                c = 0;
                cnt = 0;
            }

        }

        maxSend(8,pgm_read_byte(&table[(ds1>>4)&0x0f]));
        maxSend(7,pgm_read_byte(&table[ds1&0x0f]));
        maxSend(6,pgm_read_byte(&table[10]));
        maxSend(5,pgm_read_byte(&table[(ds2>>4)&0x0f]));
        maxSend(4,pgm_read_byte(&table[ds2&0x0f]));
        maxSend(3,pgm_read_byte(&table[10]));
        maxSend(2,pgm_read_byte(&table[(ds3>>4)&0x0f]));
        maxSend(1,pgm_read_byte(&table[ds3&0x0f]));

        pause_ms(1000);

    }

    return 0;

}

MAX7219.H
Code: [Select]
#ifndef _MAX7219_H_
#define _MAX7219_H_

#include    "../m8lib.c"

#define dataIn  digital_2
#define load    digital_3
#define clock   digital_4

#define HIGH    1
#define LOW     0

#define writeBit(p,b) p=b

#define max7219_reg_noop         0x00
#define max7219_reg_digit0       0x01
#define max7219_reg_digit1       0x02
#define max7219_reg_digit2       0x03
#define max7219_reg_digit3       0x04
#define max7219_reg_digit4       0x05
#define max7219_reg_digit5       0x06
#define max7219_reg_digit6       0x07
#define max7219_reg_digit7       0x08

#define max7219_reg_decodeMode   0x09
#define max7219_reg_intensity    0x0a
#define max7219_reg_scanLimit    0x0b
#define max7219_reg_shutdown     0x0c
#define max7219_reg_displayTest  0x0f

void putByte(uint8_t data);
void maxSend(uint8_t reg, uint8_t col);
void maxInitial(void);

#endif

MAX7219.C
Code: [Select]
#include    "max7219.h"

void putByte(uint8_t data){

    uint8_t i;
 
    for(i=0;i<8;i++){

        writeBit(dataIn,LOW);
        if(data&0x80){writeBit(dataIn,HIGH);}
        writeBit(clock,HIGH);
        writeBit(clock,LOW);
        data <<= 1;

    }
 
}


void maxSend(uint8_t reg, uint8_t col){   
 
    writeBit(load,LOW);   
    putByte(reg);
    putByte(col);
    writeBit(load,HIGH);

}


void maxInitial(void){

    uint8_t i;

    ddr_digital_2 = _output;
    ddr_digital_3 = _output;
    ddr_digital_4 = _output;
   
    //initiation of the max 7219
    maxSend(max7219_reg_scanLimit, 0x07);     
    maxSend(max7219_reg_decodeMode, 0x00);
    maxSend(max7219_reg_shutdown, 0x01);
    maxSend(max7219_reg_displayTest, 0x00);

    for (i=1;i<=8;i++){
        maxSend(i, 0);
    }

    maxSend(max7219_reg_intensity, 0x0f);
 
}
สามารถติดตาม electoday ได้ที่

Facebook
www.facebook.com/groups/coopmicro

Google+
https://plus.google.com/communities/103482067769375459277

☺☺☺ความรู้ และความฉลาด ไม่ใช่สิ่งเดียวกัน จะมีประโยชน์อะไร ถ้าฉลาดแต่อยู่ในกะลา☺☺☺

Re: MAX7219 Clock (WinAVR)
« Reply #1 on: February 27, 2016, 11:46:40 am »
ขอบคุณครับ เดี๋ยวลองทำตามดู