📄 ds1302main.c
字号:
//2007.6.01 19:46
//designed by lianghongzhi
#include"reg52.h"
#include"intrins.h"
sbit LCD1602_RS=P0^7; //data command select 1 data 0 command pin 4
sbit LCD1602_RW=P0^6; //read write select 1 read 0 write pin 5
sbit LCD1602_EN=P0^5; //LCD enable signal pin 6
sbit T_CLK=P1^0;
sbit T_IO=P1^2;
sbit T_RST=P1^4;
#define LCDIO P2
//lcd part
#define LINE1 0
#define LINE2 1
#define LINE1_HEAD 0x80
#define LINE2_HEAD 0xc0
#define LCD_DELAY_TIME 40
#define DATA_MODE 0x38
#define OPEN_SCREEN 0x0c
#define DISPLAY_ADDRESS 0x80
#define CLEARSCREEN LCD_en_command(0x01)
#define COMMAND_SLOT LCD1602_RS=LOW; LCD1602_RW=LOW;LCD1602_EN=LOW
#define DATA_SLOT LCD1602_RS=HIGH;LCD1602_RW=LOW;LCD1602_EN=LOW
//common part
#define HIGH 1
#define LOW 0
#define TRUE 1
#define ZERO 0
#define MSB 0x80
#define LSB 0x01
code unsigned char *day[7]={"Mon","Tue","Wen","Thu","Fri","Sat","Sun"};
//Write
#define Time_sec_W(dat) v_W1302(0x80,(dat)) //write second
#define Time_min_W(dat) v_W1302(0x82,(dat)) //write minute
#define Time_hou_W(dat) v_W1302(0x84,(dat)) //write hour
#define Time_dat_W(dat) v_W1302(0x86,(dat)) //write date
#define Time_mon_W(dat) v_W1302(0x88,(dat)) //write month
#define Time_yea_W(dat) v_W1302(0x8c,(dat)) //write year
#define Time_wee_W(dat) v_W1302(0x8a,(dat)) //write week
//Read
#define Time_sec_R() uc_R1302(0x81) //read second
#define Time_min_R() uc_R1302(0x83) //read minute
#define Time_hou_R() uc_R1302(0x85) //read hour
#define Time_dat_R() uc_R1302(0x87) //read date
#define Time_mon_R() uc_R1302(0x89) //read month
#define Time_yea_R() uc_R1302(0x8d) //read year
#define Time_wee_R() uc_R1302(0x8b) //read week
//unsigned char ucCurtime[7];
//code unsigned char set_1302_code[7]={0x00,0x30,0x18,0x04,0x16,0x06,0x05};
void v_RTInputByte(unsigned char ucDa) //写入一字节数据
{
unsigned char i;
for(i=0;i<8;i++)
{
T_IO=(bit)(ucDa&0x01);
T_CLK=1;
T_CLK=0; //数据写入必须上升沿,
ucDa>>=1;
}
}
unsigned char uc_RTOutputByte() //读取一字节数据
{
unsigned char i;
unsigned char ucDa=0x00;
for(i=8;i>0;i--)
{
ucDa>>=1;
T_CLK=0;
if(T_IO) ucDa|=0x80;
T_CLK=1;
}
return(ucDa);
}
void v_W1302(unsigned char ucAddr,unsigned char ucDa) //往DS1302写入数据
{
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(ucAddr); //地址,命令
v_RTInputByte(ucDa); //写一字节数据
T_CLK=1;
T_RST=0;
}
unsigned char uc_R1302(unsigned char ucAddr) //读取DS1302某地址的数据
{
unsigned char ucDa,ucDa_Dat;
T_RST=0;
T_CLK=0;
T_RST=1;
//T_CLK=0;
v_RTInputByte(ucAddr); //地址,命令
ucDa=uc_RTOutputByte(); //读一字节数据
// T_CLK=1;
T_RST=0;
ucDa_Dat=ucDa/16;
ucDa=ucDa%16;
ucDa=ucDa+ucDa_Dat*10;
return(ucDa);
}
/*void v_BurstW1302T(uchar *pSecDa) //往DS1302写入时钟数据(多字节方式)
{
uchar i;
v_W1302(0x8e,0x00); //控制命令,WP=0,写操作?
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(0xbe); //时钟多字节写命令
for(i=8;i>0;i--) //7字节时钟数据+一字节控制
{
v_RTInputByte(*pSecDa); //写一字节数据
pSecDa++;
}
T_CLK=1;
T_RST=0;
}
void v_BurstR1302T(uchar *pSecDa) //读取DS1302时钟数据
{
uchar i;
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(0xbf); //时钟多字节读命令
for(i=8;i>0;i--)
{
*pSecDa=uc_RTOutputByte(); //读一字节数据
pSecDa++;
}
T_CLK=1;
T_RST=0;
}
void v_BurstW1302R(uchar *pReDa) //往DS1302寄存器写入数据(寄存器多字节方式)
{
uchar i;
v_W1302(0x8e,0x00); //控制命令,WP=0,写操作?
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(0xfe); // 时钟多字节写命令
for(i=31;i>0;i--)
{
v_RTInputByte(*pReDa); //写一字节数据
pReDa++;
}
T_CLK=1;
T_RST=0;
}
void v_BurstR1302R(uchar *pReDa) //读取DS1302寄存器数据
{
uchar i;
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(0xff); //时钟多字节读命令
for(i=31;i>0;i--)
{
*pReDa=uc_RTOutputByte();
pReDa++;
}
T_CLK=1;
T_RST=0;
}*/
/*void v_Set1302(void) //设置初始时间
{
uchar i;
uchar ucAddr=0x80;
//控制命令,WP=0,写操作?
for(i=0;i<7;i++)
{
v_W1302(ucAddr,set_1302_code[i]); //秒 分 时 日 月 星期 年
ucAddr+=2;
}
//控制命令,WP=1,写保护?
}
void v_Get1302(void) //读取DS1302当前时间
{
uchar i;
uchar ucAddr=0x81;
for(i=0;i<7;i++)
{
ucCurtime[i]=uc_R1302(ucAddr); //格式为: 秒 分 时 月 星期 年
ucAddr+=2;
}
}*/
/******************** LCD PART *************************************/
void LCD_delay(void)
{
unsigned char i;
for(i=LCD_DELAY_TIME;i>ZERO;i--);//be sure lcd reset
}
/********************************************************************/
void LCD_en_command(unsigned char command)
{
LCDIO=command;
COMMAND_SLOT;
LCD_delay();
LCD1602_EN=HIGH;
}
/********************************************************************/
void LCD_en_dat(unsigned char dat)
{
LCDIO=dat;
DATA_SLOT;
LCD_delay();
LCD1602_EN=HIGH;
}
/********************************************************************/
void LCD_set_xy( unsigned char x, unsigned char y )
{
unsigned char address;
if (y == LINE1)
address = LINE1_HEAD + x;
else
address = LINE2_HEAD + x;
LCD_en_command(address);
}
/********************************************************************/
void LCD_write_char( unsigned x,unsigned char y,unsigned char dat)
{
LCD_set_xy( x, y );
LCD_en_dat(dat);
}
/********************************************************************/
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
{
LCD_set_xy( X, Y ); //set address
while (*s) // write character
{
LCDIO=*s;
LCD_en_dat(*s);
s ++;
}
}
/********************************************************************/
void LCD_init(void)
{
CLEARSCREEN;//clear screen
LCD_en_command(DATA_MODE);//set 8 bit data transmission mode
LCD_en_command(OPEN_SCREEN);//open display (enable lcd display)
LCD_en_command(DISPLAY_ADDRESS);//set lcd first display address
CLEARSCREEN;//clear screen
}
void main()
{
unsigned char key,sec,min,hour;
unsigned char year,mon,dat;
LCD_init();
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(0x8e);
v_RTInputByte(0x00);
T_RST=0;
Time_sec_W(0x10); //write second
Time_min_W(0x59); //write minute
Time_hou_W(0x23); //write hour
Time_dat_W(0x30); //write date
Time_mon_W(5); //write month
Time_yea_W(0x07); //write year
Time_wee_W(3); //write week*/
for(;;)
{
sec=Time_sec_R() ;
key=sec%10;
LCD_write_char(0x0f,LINE2,key|0x30);
key=sec/10;
LCD_write_char(0x0e,LINE2,key|0x30);
min=Time_min_R() ;
key=min%10;
LCD_write_char(0x0c,LINE2,key|0x30);
key=min/10;
LCD_write_char(0x0b,LINE2,key|0x30);
hour=Time_hou_R() ;
key=hour%10;
LCD_write_char(0x09,LINE2,key|0x30);
key=hour/10;
LCD_write_char(0x08,LINE2,key|0x30);
year=Time_yea_R() ;
key=year%10;
LCD_write_char(0x03,LINE1,key|0x30);
key=year/10;
LCD_write_char(0x02,LINE1,key|0x30);
mon=Time_mon_R() ;
key=mon/10;
LCD_write_char(0x05,LINE1,key|0x30);
key=mon%10;
LCD_write_char(0x06,LINE1,key|0x30);
dat=Time_dat_R() ;
key=dat/10;
LCD_write_char(0x08,LINE1,key|0x30);
key=dat%10;
LCD_write_char(0x09,LINE1,key|0x30);
LCD_write_string(0x00,LINE1,"20");
LCD_write_string(0x04,LINE1,"-");
LCD_write_string(0x07,LINE1,"-");
LCD_write_string(0x0d,LINE2,":");
LCD_write_string(0x0a,LINE2,":");
LCD_write_string(0x0b,LINE1,day[2]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -