4.用DS1302与12864LCD设计的可调式中文电子日历(3)

2019-02-15 17:35

作者 张小波

void Write_Byte_TO_DS1302(uchar X) // 向DS1302写入一个字节 {

uchar i;

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

SDA=X&1; CLK=1; CLK=0; X>>=1; } }

//*--------读字节函数,从DS1302读取一个字节--------*//

uchar Read_Byte_FROM_DS1302() //从DS1302中读取一个字节 {

uchar i,byte,t; for(i=0;i<8;i++) {

byte>>=1; t=SDA;

byte|=t<<7; CLK=1; CLK=0; }

//BCD码转换

return byte/16*10+byte; }

//------------------------------------------------------------- //从DS1302指定位置读取数据 , 读数据

//---------------------------------------------------------------

uchar Read_Data_FROM_DS1302(uchar addr) //从DS1302指定位置读取数据 {

uchar dat; RST=0; CLK=0; RST=1;

Write_Byte_TO_DS1302(addr); //向DS1302写入一个地址

dat=Read_Byte_FROM_DS1302(); //在上面写入的地址中读取数据 CLK=1; RST=0;

return dat; }

//------------------------------------------------------------- //向DS1302指定位置写入数据, 写数据

//---------------------------------------------------------------

, 读数据 作者 张小波

void Write_Data_TO_DS1302(uchar addr,uchar dat) // 向DS1302指定位置写入数据, 写数据 {

CLK=0; RST=1;

Write_Byte_TO_DS1302(addr); Write_Byte_TO_DS1302(dat); CLK=1; RST=0; }

//----------------------------------------------------------- // 设置时间

//--------------------------------------------------------- void SET_DS1302() // 设置时间 {

uchar i;

Write_Data_TO_DS1302(0x8E,0x00); //写控制字,取消写保护 // 分,时,日,月,年依次写入 for(i=1;i<7;i++) {

// 分的起始地址是10000010(0x82),后面依次是时,日,月,周,年,写入地址每次递增2 Write_Data_TO_DS1302(0x80+2*i,(DateTime[i]/10<<4)|(DateTime[i])); }

Write_Data_TO_DS1302(0x8E,0x80); //写控制字,加写保护 }

//-------------------------------------------------------- // 读取当前时间

//------------------------------------------------------- void GetTime() // 读取当前时间 {

uchar i;

for(i=0;i<7;i++) {

DateTime[i]=Read_Data_FROM_DS1302(0x81+2*i); } }

//------------------------------------------------------------------- // 判断是否为闰年

//------------------------------------------------------------------- uchar Is_Leapyear(uint year) {

return (year%4==0&&year0!=0)||(year@0==0) ; }

//------------------------------------------------------------------ // 求自2000.1.1开始的任何一天是星期几?

作者 张小波

//---------------------------------------------------------------------- void Refresh_Week_Day() {

uint i,d,w=5; //已知1999年12.31是星期五 for(i=2000;i<2000+DateTime[6];i++) {

d=Is_Leapyear(i)?366:365; w=(w+d)%7; } d=0;

for (i=1;i

//保存星期,0-6表示星期日,星期一至星期六,为了与DS1302的星期格式匹配,返回值需要加1 DateTime[5]=(w+d)%7+1; }

//------------------------------------------------- //年,月,日和时,分++/--

//---------------------------------------------------- void Datetime_Adjust(char X) {

switch(Adjust_Index) {

case 6: //年调整,00-99

if(X==1&&DateTime[6]<99) {

DateTime[6]++; }

if(X==-1&&DateTime[6]>0) {

DateTime[6]--; }

//获取2月天数

MonthsDays[2]=Is_Leapyear(2000+DateTime[6])?29:28; //如果年份变化后当前月份的天数大于上限则设为上限 if(DateTime[3]>MonthsDays[DateTime[4]]) {

DateTime[3]=MonthsDays[DateTime[4]]; }

Refresh_Week_Day(); //刷新星期 break;

case 4: //月调整 01-12

if(X==1&&DateTime[4]<12) {

作者 张小波

DateTime[4]++; }

if(X==-1&&DateTime[4]>1) {

DateTime[4]--; }

//获取2月天数

MonthsDays[2]=Is_Leapyear(2000+DateTime[6])?29:28; //如果年份变化后当前月份的天数大于上限则设为上限 if(DateTime[3]>MonthsDays[DateTime[4]]) {

DateTime[3]=MonthsDays[DateTime[4]]; }

Refresh_Week_Day(); //刷新星期 break;

case 3: // 日调整00-28或00-29或00-30或00-31

//调节之前首先根据当前年份得出该年中2月的天数 MonthsDays[2]=Is_Leapyear(2000+DateTime[6])?29:28; //根据当前月份决定调节日期的上限

if(X==1&&DateTime[3]

DateTime[3]++; }

if(X==-1&&DateTime[3]>0) {

DateTime[3]--; }

Refresh_Week_Day(); //刷新星期 break;

case 2: // 时调整

if(X==1&&DateTime[2]<23) {

DateTime[2]++; }

if(X==-1&&DateTime[4]>0) {

DateTime[2]--; } break;

case 1: // 分调整

if(X==1&&DateTime[1]<59) {

DateTime[1]++; }

作者 张小波

if(X==-1&&DateTime[4]>0) {

DateTime[1]--; } break;

case 0: // 秒调整

if(X==1&&DateTime[1]<59) {

DateTime[0]++; }

if(X==-1&&DateTime[4]>0) {

DateTime[0]--; } break; } }

3、 字符汉字显示程序

//------------------------------------------------- // 与本程序有关的数字和汉字的点阵编码 DotMatrix.c // ----------------------------------------------- #include #include #include

#define uchar unsigned char #define uint unsigned int

//年、月、日、星期、时、分、秒等汉字点阵(16×16) uchar code DATE_TIME_WORDS[]={

0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00, //年 0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,//月 0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x01,0x01,0x21,0x41,0x3F,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,//日 0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,//星 0x00,0x48,0x46,0x41,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x49,0x41,0x40,0x00, 0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,//期 0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00, 0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,//时 0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00, 0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,0x83,0x84,0x98,0x30,0x60,0xC0,0x40,0x00,//分 0x00,0x80,0x40,0x20,0x10,0x0F,0x00,0x00,0x20,0x40,0x3F,0x00,0x00,0x00,0x00,0x00, 0x12,0x12,0xD2,0xFE,0x91,0x11,0xC0,0x38,0x10,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,//秒 0x04,0x03,0x00,0xFF,0x00,0x83,0x80,0x40,0x40,0x20,0x23,0x10,0x08,0x04,0x03,0x00


4.用DS1302与12864LCD设计的可调式中文电子日历(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:四年级美术下册第3课《五谷作画》教案人教版

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: