📄 2402and1307.c
字号:
#include<reg51.h>
#include <intrins.h>
/*-------------------------------------*/
//LCD数据控制口定义
/*-------------------------------------*/
#define LCD_DATA P0 //LCD的数据口
sbit LCD_BUSY=LCD_DATA^7; //LCD忙型号位
sbit LCD_RS=P1^4; //LCD积存器选择
sbit LCD_RW=P1^3; //LCD读写控制
sbit LCD_EN=P1^2; //LCD使能信号
/*-------------------------------------*/
#define LCD_GO_HOME 0X02 //光标复位,光标返回到地址00H
//输入方式设置
#define LCD_AC_AUTO_INCREASEMENT 0X06 //数据读写操作后,AC自动增一
#define LCD_AC_AUTO_DECREASEMENT 0x04 // 减一
#define LCD_MOVE_ENABLE 0X05 //数据读写操作后,画面平移
#define LCD_MOVE_DISABLE 0X04 // 不动
//设置显示,光标及闪烁开关
#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 0XO8 //光标不闪烁
//光标,画面移动,不影响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_SIGLE_LINE 0X30 //一行显示
void LCD_write_data(unsigned char);
void LCD_inital(void);
void LCD_set_position(unsigned char);
void LCD_printc(unsigned char);
void LCD_prints(unsigned char *);
//========================================================================
//延时程序
void TimeDelay(int Time)
{
int i;
while(Time > 0)
{
for(i = 0;i < 800;i++)
{
_nop_();
}
Time --;
}
}
/*------------------------------------------*/
void LCD_check_busy(void)
{
while(1)
{
LCD_EN=0;
LCD_RS=0;
LCD_RW=1;
LCD_DATA=0XFF;
LCD_EN=1;
if(!LCD_BUSY)break;
}
LCD_EN=0;
}
/*----------可以不要--------------------------------*/
void LCD_cls(void)
{
LCD_check_busy();
LCD_RS=0;
LCD_RW=0;
LCD_DATA=1;
LCD_EN=1;
LCD_EN=0;
}
/*------------------------------------------*/
void LCD_write_instruction(unsigned char LCD_instruction)
{
LCD_check_busy();
LCD_RS=0;
LCD_RW=0;
LCD_EN=1;
LCD_DATA=LCD_instruction;
LCD_EN=0;
}
/*------------------------------------------*/
void LCD_write_data(unsigned char LCD_data)
{
LCD_check_busy();
LCD_RS=1;
LCD_RW=0;
LCD_EN=1;
LCD_DATA=LCD_data;
LCD_EN=0;
}
/*------------------------------------------*/
void LCD_set_position(unsigned char x)
{
LCD_write_instruction(0x80+x);
}
/*------------------------------------------*/
void LCD_go_home(void)
{
LCD_write_instruction(LCD_GO_HOME);
}
/*------------------------------------------*/
void LCD_printc (unsigned char LCD_data)
{
LCD_write_data(LCD_data);
}
/*------------------------------------------*/
void LCD_prints (unsigned char *lcd_string)
{
unsigned char i=0;
while(lcd_string[i]!=0x00)
{
LCD_write_data(lcd_string[i]);
i++;
}
}
/*------------------------------------------*/
/***************************I2C开始*****************************************************************/
#define Wait1us _nop_();
#define Wait2us {_nop_();_nop_();}
#define Wait4us {Wait2us;Wait2us;}
#define Wait8us {Wait4us;Wait4us;}
#define Wait10us {Wait8us;Wait2us;}
#define WRITE2402 0xA0
#define READ2402 0xA1
#define WRITEDS1307 0xD0
#define READDS1307 0xD1
sbit SDA=P1^7; // Serial-Data Input pin 5
sbit SCL=P1^6; // 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);
void I2C_write_byte(unsigned char);//I2C bus write byte function
unsigned char I2C_read_byte(void);//I2C bus read byte function
/***********************************************************************/
void Write(unsigned char,unsigned char,unsigned char);//write information to I2C
unsigned char Read(unsigned char,unsigned char,unsigned char);//read information from I2C
void Read_RTC(unsigned char,unsigned char,unsigned char *,unsigned char *);//read RTC
void Set_RTC(unsigned char,unsigned char,unsigned char *,unsigned char *);//set RTC
/***********************************************************************/
code unsigned char set_1307_code[7]={0x02,0x03,0x17,0x03,0x9,0x04,0x08};//初始化秒,分,时,星期,日,月,年
code unsigned char DS1307_address[7]={0x00,0x01,0x02,0x03,0x04,0x05,0x06};//寄存器地址
code unsigned char *days[7]={"Mon","Tue","Wen","Thu","Fri","Sat","Sun"};
unsigned char read_1307_code[7];
unsigned char read_1307_code1[14];
/***********************************************************************/
code unsigned char set_2402_code[7]={0x02,0x02,0x03,0x05,0x7,0x08,0x08};//存入的数据
code unsigned char AT2402_address[7]={0x00,0x01,0x02,0x03,0x04,0x05,0x06};//存储器地址
unsigned char read_2402_code[7];
/***********************************************************************/
void I2C_start(void)
{
SDA=1;
SCL=1;
Wait4us;
SDA=0;
Wait4us;
SCL=0;
SDA=1;
}
/***********************************************************************/
void I2C_stop(void)
{
SDA=0;
SCL=1;
Wait4us;
SDA=1;
Wait4us;
SCL=0;
}
void I2C_send_ack(void)
{
SDA=0;
SCL=1;
Wait4us;
SCL=0;
SDA=1;
}
void I2C_send_noack(void)
{
SDA=1;
SCL=1;
Wait4us;
SCL=0;
}
/***********************************************************************/
void 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;//2改为5
SCL=1;
Wait4us;
SCL=0;
}
Wait4us;
SDA=1; //发送完8bit,释放总线准备接收应答位
//Wait4us;
I2C_send_ack();
}
/***********************************************************************/
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);
}
/***********************************************************************/
/******************************** I2C PART START ****************/
void Write(unsigned char WRITE,unsigned char add,unsigned char dat)
{
I2C_start();
I2C_write_byte(WRITE);//写器件地址
I2C_write_byte(add);
I2C_write_byte(dat);
I2C_stop();
}
/***********************************************************************/
unsigned char Read(unsigned char WRITE,unsigned char add,unsigned char READ)
{
unsigned char dat;
I2C_start();
I2C_write_byte(WRITE);
I2C_write_byte(add);
I2C_start();
I2C_write_byte(READ);
dat=I2C_read_byte();
I2C_send_noack();
I2C_stop();
return (dat);
}
/****************************读AT2402/DS1307的寄存器或地址内容*******************************************/
void Read_RTC(unsigned char WRITE,unsigned char READ,unsigned char *address,unsigned char *i2c_data)
{
unsigned char i,*p;
p=address;
for(i=0;i<7;i++)
{
i2c_data[i]=Read(WRITE,*p,READ);
p++;
}
}
/***************************AT2402/DS1307的初始化********************************************/
void Set_RTC(unsigned char WRITE,unsigned char num,unsigned char *address,unsigned char *i2c_code)
{
unsigned char i,*p;
p=address;
for(i=0;i<num;i++)
{
Write(WRITE,*p,i2c_code[i]);
p++;
TimeDelay(1);
}
}
/****************************LCD初始化*******************************************/
void LCD_inital(void)
{
LCD_write_instruction(LCD_AC_AUTO_INCREASEMENT|LCD_MOVE_DISABLE);
LCD_write_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF);
LCD_write_instruction(LCD_DISPLAY_DOUBLE_LINE);
LCD_cls();
}
/*------------------------------------------*/
void main()
{
unsigned char i,j;
LCD_inital();
Set_RTC(WRITEDS1307,7,DS1307_address,set_1307_code);
Set_RTC(WRITE2402,7,AT2402_address,set_2402_code);
TimeDelay(10);
while(1)
{
Read_RTC(WRITEDS1307,READDS1307,DS1307_address,read_1307_code);
j=0;
for(i=0;i<7;i++)
{
read_1307_code1[i+j]=(read_1307_code[i]>>4)+ 0x30;
read_1307_code1[i+j+1]=(read_1307_code[i]&0x0f)+ 0x30;
j++;
}
LCD_set_position(1);
LCD_prints("2");
LCD_set_position(2);
LCD_prints("0");
LCD_set_position(3);
LCD_printc(read_1307_code1[12]);
LCD_set_position(4);
LCD_printc(read_1307_code1[13]);
LCD_set_position(5);
LCD_prints("-");
LCD_set_position(6);
LCD_printc(read_1307_code1[10]);
LCD_set_position(7);
LCD_printc(read_1307_code1[11]);
LCD_set_position(8);
LCD_prints("-");
LCD_set_position(9);
LCD_printc(read_1307_code1[8]);
LCD_set_position(10);
LCD_printc(read_1307_code1[9]);
LCD_set_position(12);
LCD_prints(days[read_1307_code[3]]);
LCD_set_position(0x40);
LCD_printc(read_1307_code1[4]);
LCD_set_position(0x41);
LCD_printc(read_1307_code1[5]);
LCD_set_position(0x42);
LCD_prints(":");
LCD_set_position(0x43);
LCD_printc(read_1307_code1[2]);
LCD_set_position(0x44);
LCD_printc(read_1307_code1[3]);
LCD_set_position(0x45);
LCD_prints(":");
LCD_set_position(0x46);
LCD_printc(read_1307_code1[0]);
LCD_set_position(0x47);
LCD_printc(read_1307_code1[1]);
Read_RTC(WRITE2402,READ2402,AT2402_address,read_2402_code);
for(i=0;i<7;i++)
{
read_2402_code[i]=read_2402_code[i] + 0x30;
}
LCD_set_position(0x49);
LCD_prints(read_2402_code);
TimeDelay(100);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -