ds1302是一個(gè)時(shí)鐘芯片,和avr沒關(guān)系,這里用mega32操作該芯片,關(guān)于這個(gè)芯片網(wǎng)上資料很多,我簡單說一下,通信方式是SPI模式,芯片內(nèi)部有幾個(gè)寄存器存放年月日時(shí)分秒,還有寫保護(hù)等。
*****************************************************************
//CPU:mega32
//編譯器:iar
//DS1302
//main函數(shù)中調(diào)用lcd顯示函數(shù)
#include <ioavr.h>
#include "lcd.h"
void Write1302 ( unsigned char addr,unsigned char dat );
unsigned char Read1302 ( unsigned char addr );
void ds1302_init(void);
//寄存器宏定義
#define SECOND 0x80
#define MINUTE 0x82
#define HOUR 0x84
#define DAY 0x86
#define MONTH 0x88
#define YEAR 0x8C
#define PROTECT 0x8E
//管腳定義
#define CE PORTD_Bit5 //讀寫使能
#define SCLK PORTD_Bit6 //時(shí)鐘
#define TIO PORTD_Bit7 //數(shù)據(jù)輸出
#define RIO PIND_Bit7 //數(shù)據(jù)輸入
#define CE_D DDRD_Bit5 //CE方向
#define SCLK_D DDRD_Bit6 //SCLK方向
#define IO_D DDRD_Bit7 //IO方向 void main(void)
{
ds1302_init();
lcd_init();
while(1)
{
delay(10000);
clear();
display_string(num2str(Read1302(YEAR)),0,0);display_string("YEAR",0,16);display_string(num2str(Read1302(MONTH)),0,64);display_string("MONTH",0,80);
display_string(num2str(Read1302(DAY)),2,0);display_string("DAY",2,16);display_string(num2str(Read1302(HOUR)),2,64);display_string("HOUR",2,80);
display_string(num2str(Read1302(MINUTE)),4,0);display_string("MIN",4,16);display_string(num2str(Read1302(SECOND)),4,64);display_string("SECOND",4,80);
}
}
//地址、數(shù)據(jù)發(fā)送子程序
void Write1302 ( unsigned char addr,unsigned char data )
{
unsigned char i;
IO_D = 1;
CE = 0; //CE 引腳為低,數(shù)據(jù)傳送中止
SCLK = 0; //清零時(shí)鐘總線
CE = 1; //CE 引腳為高,邏輯控制有效
//發(fā)送地址
for ( i=8; i>0; i-- ) //循環(huán)8次移位
{
SCLK = 0;
TIO = (addr&0x01); //每次傳輸?shù)妥止?jié)
addr >>= 1; //右移一位
SCLK = 1;
}
//發(fā)送數(shù)據(jù)
for ( i=8; i>0; i-- )
{
SCLK = 0;
TIO = (data&0x01);
data >>= 1;
SCLK = 1;
}
CE = 0;
}
//數(shù)據(jù)讀取子程序
unsigned char Read1302 ( unsigned char addr )
{
unsigned char i,data=0,temp;
addr = addr | 1;//變?yōu)樽x地址
IO_D = 1;
CE=0;
SCLK=0;
CE = 1;
//發(fā)送地址
for ( i=8; i>0; i-- ) //循環(huán)8次移位
{
SCLK = 0;
TIO = (addr&0x01); //每次傳輸?shù)妥止?jié)
addr >>= 1; //右移一位
SCLK = 1;
}
IO_D = 0;
//讀取數(shù)據(jù)
for ( i=0; i<8; i++ )
{
SCLK = 1;
SCLK = 0;
data |= RIO<<i;
}
CE=0;
// data = data/16*10 + data&0x0f ; 為什么不對(duì)
temp = data>>4;
data &= 0x0f;
data = temp*10 + data;
return (data);
}
//初始化DS1302
void ds1302_init(void)
{
CE_D = 1 ; //CE 輸出
SCLK_D = 1 ; //SCLK 輸出
Write1302 (PROTECT,0X00); //禁止寫保護(hù)
Write1302 (SECOND ,0x30); //秒位初始化
Write1302 (MINUTE ,0x05); //分鐘初始化
Write1302 (HOUR ,0x6); //小時(shí)初始化
Write1302 (DAY ,0x14); //日位初始化
Write1302 (MONTH ,0x12); //月鐘初始化
Write1302 (YEAR ,0x88); //年初始化
Write1302 (PROTECT,0x80); //允許寫保護(hù)
}
******************************************************************
|