微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > DS1302控制代码

DS1302控制代码

时间:12-01 来源:互联网 点击:
两天的成果,

/*************************************/

#include

#define uint unsigned int

#define uchar unsigned char

uchar year,month,day,week,hours,minutes,seconds;

uchar flag1302,cnt;

/*************************************

控制按键

*************************************/

sbit K1=P1^0;

sbit K2=P1^2;

sbit K3=P1^4;

/*************************************

控制LCD液晶显示

*************************************/

sbit lcdwrite=P2^5;

sbit lcddatecommand=P2^6;

sbit lcde=P2^7;

/*************************************

控制DS1302时钟

*************************************/

sbit SCK=P3^6;

sbit RST=P3^5;

sbit SDA=P3^4;

/*************************************

延时子函数

*************************************/

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

{

for(y=0;y<=112;y++)

{

}

}

}

/*************************************

LCD写命令函数

*************************************/

void write_command(uchar command)

{

lcddatecommand=0; //开启写命令

lcdwrite=0; //只写不读

P0=command;

delay(1);

lcde=1; //形成使能E高脉冲

delay(1);

lcde=0; //使能E拉低

}

/*************************************

LCD写数据函数

*************************************/

void write_date(uchar date)

{

lcddatecommand=1; //开启写数据

lcdwrite=0; //只写不读

P0=date;

delay(1);

lcde=1; //形成使能E高脉冲

delay(1);

lcde=0; //使能E拉低

}

/*************************************

LCD屏幕初始化

*************************************/

void lcdInit()

{

lcde=0;

write_command(0x38);//设置16*2显示,5*7点阵,8位数据接口

write_command(0x0c);//设置开显示,不显示光标

write_command(0x06);// 写一个字符后地址指针加1

write_command(0x01);//显示清0,数据指针清0

}

/*************************************

DS1302写字节函数

*************************************/

void write_1302byte(uchar date)

{

uchar i;

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

{

SCK=0;

SDA=date&0x01;

date=date>>1;

SCK=1;//将电平置为已知状态

}

}

/*************************************

DS1302读字节函数

*************************************/

uchar read_1302byte(uchar address)

{

uchar i,temp;

temp=0x00;

RST=0;

delay(1);

SCK=0;

delay(1);

RST=1;

delay(1);

write_1302byte(address);

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

{

if(SDA==1)

{

temp=temp|0x80; //每次传输低字节

}

temp=temp>>1;

SCK=1;

delay(1);

SCK=0;

delay(1);

}

return temp;

}

/*************************************

往DS1302中写数据

*************************************/

void write_1302(uchar address,uchar date)

{

RST=0;

delay(1);

SCK=0;

delay(1);

RST=1;

delay(1);

write_1302byte(address);

write_1302byte(date);

RST=0;

}

/*************************************

往DS1302中读取数据

*************************************/

uchar read_1302(uchar address)

{

uchar date;

RST=0;

SCK=0;

RST=1;

write_1302byte(address);

date=read_1302byte(address);

SCK=1;

RST=0;

return date;

}

/*************************************

初始化时间

*************************************/

void Init_1302()

{

write_1302(0x8e,0x00); //写入不保护指令

write_1302(0x80,(14/10)<4|(14%10));//14秒钟

write_1302(0x82,(7/10)<4|(7%10)); //7分钟

write_1302(0x84,(3/10)<4|(3%10)); //3小时

write_1302(0x86,(6/10)<4|(6%10)); //6日

write_1302(0x88,(6/10)<4|(6%10)); //6月

write_1302(0x8A,(4/10)<4|(4%10)); //周四

write_1302(0x8C,(13/10)<4|(13%10));//13年

write_1302(0x90,0xa5); //打开充电功能,选择2K电阻充电方式

write_1302(0x8e,0x80); //写保护

}

/*************************************

时钟显示

*************************************/

void DisplayHours(uchar hours)

{

uchar shi,ge;

shi=hours/10;

ge=hours%10;

write_command(0x06);

write_command(0x80+0x40);

write_date(shi+48);

write_date(ge+48);

write_date(:);

}

/*************************************

分钟显示

*************************************/

void DisplayMinutes(uchar minutes)

{

uchar shi,ge;

shi=minutes/10;

ge=minutes%10;

write_command(0x06);

write_command(0x80+0x43);

write_date(shi+48);

write_date(ge+48);

write_date(:);

}

/*************************************

秒钟显示

*************************************/

void DisplaySeconds(uchar seconds)

{

uchar shi,ge;

shi=seconds/10;

ge=

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top