📄 ds1307.c
字号:
#include <reg51.h>
#include <intrins.h>
/*********************************LCD定义部分********************************/
//输入方式设置
#define LCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一
#define LCD_AC_AUTO_DECREASE 0x04 //数据读、写操作后,AC自动减一
#define LCD_MOVE_ENABLE 0x05 //数据读、写操作,画面平移
#define LCD_MOVE_DISENABLE 0x04 //数据读、写操作,画面不动
#define LCD_GO_HOME 0x02 //AC=0,光标、画面回HOME位
//设置显示、光标及闪烁开、关
#define LCD_DISPLAY_ON 0x0C //显示开
#define LCD_DISPLAY_OFF 0x08 //显示关
#define LCD_CURSOR_ON 0x0A //光标显示
#define LCD_CURSOR_OFF 0x08 //光标不显示
#define LCD_CURSOR_BLINK_ON 0x09 //光标闪烁
#define LCD_CURSOR_BLINK_OFF 0x08 //光标不闪烁
//光标、画面移动,不影响DDRAM
#define LCD_LEFT_MOVE 0x18 //LCD显示左移一位
#define LCD_RIGHT_MOVE 0x1C //LCD显示右移一位
#define LCD_CURSOR_LEFT_MOVE 0x10 //光标左移一位
#define LCD_CURSOR_RIGHT_MOVE 0x14 //光标右移一位
//工作方式设置
#define LCD_DISPLAY_DOUBLE_LINE 0x38 //两行显示
#define LCD_DISPLAY_SINGLE_LINE 0x30 //单行显示
#define LCD_CLEAR_SCREEN 0X01 //清屏
/***********************LCD1602地址相关******************************/
#define LINE1_HEAD 0x80 // 第一行DDRAM起始地址
#define LINE2_HEAD 0xc0 // 第二行DDRAM起始地址
#define LINE1 0 //第一行
#define LINE2 1 //第二行
#define LINE_LENGTH 16 //每行的最大字符长度
/***********************LCD1602接线引脚定义**************************
**********************可根据实际电路改变*******************************/
#define LCDIO P2 //定义P2口与LCD1602的数据口相接
sbit LCD_RS=P1^4;
sbit LCD_RW=P1^3;
sbit LCD_EN=P1^2;
sbit LCD_BUSY=LCDIO^7;
/**********************另外相关的定义*********************************/
#define HIGH 1
#define LOW 0
#define TURE 1
#define FALSE 0
#define uchar unsigned char
#define uint unsigned int
/*************************以下是函数的申明部分*************************/
void LCD_init(void); //LCD1602初始化
void LCD_send_command(uchar command); //
void LCD_send_data(uchar dat);
void LCD_write_char(uchar x,uchar y,uchar dat);
void LCD_write_string(uchar x,uchar y,char *Data);
void delay_ms(uint n);
void LCD_check_busy(void);
/*********************结束***********************************************/
/***************************DS1307开始*****************************************************************/
#define Wait1us _nop_();
#define Wait2us {_nop_();_nop_();}
#define Wait4us {Wait2us;Wait2us;}
#define Wait8us {Wait4us;Wait4us;}
#define Wait10us {Wait8us;Wait2us;}
#define WRITEDS1307 0xD0
#define READDS1307 0xD1
#define WRITE2402 0xa0
#define READ2402 0xa1
sbit SDA=P1^4; //DS1307 Serial-Data Input pin 5
sbit SCL=P1^3; //DS1307 Serial-Clock Input pin 6
/************************************************************/
void I2C_start(void);//I2C start function
void I2C_stop(void);//I2C stop function
//void I2C_send_ack(void);//I2C send responsion function
void I2C_send_noack(void);
unsigned char I2C_write_byte(unsigned char IIC_data);//I2C bus write byte function
unsigned char I2C_read_byte(void);//I2C bus read byte function
/***********************************************************************/
void Write1307(unsigned char add,unsigned char dat);//write information to ds1307
unsigned char Read1307(unsigned char add);//read information from ds1307
void Read_RTC(void);//read RTC
void Set_RTC(void);//set RTC
/***********************************************************************/
unsigned char set_rtc_code[7];
code unsigned char rtc_address[7]={0x00,0x01,0x02,0x03,0x04,0x05,0x06};
code unsigned char *day[7]={"Mon","Tue","Wen","Thu","Fri","Sat","Sun"};
unsigned char read_rtc_code[7];
/***********************************************************************/
void Initial(void);//system initize function
void Display(void);//RTC display function
/***********************************************************************/
/***********************************************************************/
/***********************************************************************/
/*void Initial(void)
{
Set_RTC();
}*/
/***********************************************************************/
void I2C_start(void)
{
SDA=1;
SCL=1;
Wait8us;
SDA=0;
Wait8us;
SCL=0;
}
/***********************************************************************/
void I2C_stop(void)
{
SDA=0;
SCL=1;
Wait8us;
SDA=1;
Wait4us;
SCL=0;
}
void I2C_send_noack(void)
{
SDA=1;
SCL=1;
Wait4us;
SCL=0;
}
/***********************************************************************/
unsigned char I2C_write_byte(unsigned char IIC_data)
{
unsigned char i;
for(i=0;i<8;i++)
{
SCL=0;
if((IIC_data<<i) & 0x80)
SDA=1; //判断发送位
else
SDA=0;
Wait2us;
SCL=1;
Wait4us;
SCL=0;
}
Wait4us;
SDA=1; //发送完8bit,释放总线准备接收应答位
Wait2us;
SCL=1;
Wait4us; //sda上数据即是从应答位
if (SDA==1)
{
SCL=0; //不考虑从应答位 但要控制好时序
return 1;
}
else
{
SCL=0; //不考虑从应答位 但要控制好时序
return 0;
}
}
/***********************************************************************/
unsigned char I2C_read_byte(void)
{
unsigned char i,dat;
dat=0;
SDA=1;
for (i=0;i<8;i++)
{
dat=dat<<1;
SCL=1;
Wait2us;
if(SDA==1)
{
dat++;
}
SCL=0;
}
return (dat);
}
/***********************************************************************/
/******************************** DS1307 PART START ****************/
void Write1307(unsigned char add,unsigned char dat)
{
I2C_start();
I2C_write_byte(WRITEDS1307);
I2C_write_byte(add);
I2C_write_byte(dat);
I2C_stop();
}
/***********************************************************************/
unsigned char Read1307(unsigned char add)
{
unsigned char dat;
I2C_start();
I2C_write_byte(WRITEDS1307);
I2C_write_byte(add);
I2C_start();
I2C_write_byte(READDS1307);
dat=I2C_read_byte();
I2C_send_noack();
I2C_stop();
return (dat);
}
/****************************读DS1307的寄存器*******************************************/
void Read_RTC(void)
{
unsigned char i,*p;
p=rtc_address;
for(i=0;i<7;i++)
{
read_rtc_code[i]=Read1307(*p);
p++;
}
}
/***************************DS1307的初始化********************************************/
void Set_RTC(void)
{
unsigned char i;
// p=rtc_address;
Write1307(0,0x81);
for(i=8;i>1;i--)
{
Write1307((i-2),set_rtc_code[i-2]);
}
}
void Write2402(unsigned char add,unsigned char dat)
{
I2C_start();
I2C_write_byte(WRITE2402);
I2C_write_byte(add);
I2C_write_byte(dat);
I2C_stop();
}
/***********************************************************************/
unsigned char Read2402(unsigned char add)
{
unsigned char dat;
I2C_start();
I2C_write_byte(WRITE2402);
I2C_write_byte(add);
I2C_start();
I2C_write_byte(READ2402);
dat=I2C_read_byte();
I2C_send_noack();
I2C_stop();
return (dat);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -