ds1302-DS1302主电源断开再打开时间初始化了

问题描述

DS1302主电源断开再打开时间初始化了

/*时钟显示1602
独立键盘(P1口)设置时钟(K1设置时分秒星期年月日,K2加一,K3减一) */

#include
#include
#define uchar unsigned char
#define uint unsigned int

//DS1302控制端口定义
sbit CE=P1^6;
sbit SDA=P1^5;
sbit SCLK=P1^4;

//LCD1602控制端口定义
sbit LCD_RS = P3^5;

sbit LCD_RW = P3^6;

sbit LCD_EN = P3^4;

//独立按键定义
sbit K1=P1^0; //功能键
sbit K2=P1^1; //增大键
sbit K3=P1^2; //减小键
sbit K4=P1^3;

bit k=0;

//屏幕初始化图标
uchar code table1[]={" 20 - - "};
uchar code table2[]={" : : "};

//星期LOGO
uchar code table3[]={"MON TUE WED THU FRI SAT SUN"};

//初始化 年 月 日 星期 时 分 秒
char year_h,year_l,month_h,month_l,day_h,day_l,hour_h,hour_l,min_h,min_l,sec_h,sec_l,date=1;
uchar year=1,month=1,day=1,hour=1,min=1,sec=1;

uchar K1num=0;

//声明延时函数毫秒级
void delay1ms(uint ms);

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

  • 以下为DS1302驱动程序 *
    *******************************************************************************************/

/***********************************/
/* 延时程序 /
/
**********************************/

void delayus()
{
;

;

;
}

uchar DS1302_Read(uchar address)
{

uchar i,temp=0x00;
CE=0;
SDA=1;
SCLK=0;
CE=1;

for (i=0;i<8;i++)       //循环8次 写入地址数据
{
    SCLK=0;
    SDA=address&0x01;       //每次传输低字节
    address>>=1;        //右移一位
    SCLK=1;
}
delay1ms(1);
if(SDA)
    temp|=0x80;         //每次传输低字节
SCLK=0;
temp>>=1;
for (i=0;i<7;i++)       //循环8次 读取数据
{
    SCLK=0;
    if(SDA)
        temp|=0x80;         //每次传输低字节
    SCLK=1;
    temp>>=1;           //右移一位
} 

SCLK=1;
CE=0;
SDA=0;
return temp;            //返回

}

void DS1302_Write(uchar address,uchar dat)
{

uchar i;
CE=0;
SCLK=0;
CE=1;   

for (i=0;i<8;i++)       //循环8次 写入地址数据
{
    SCLK=0;
    _nop_();
    SDA=address&0x01;       //每次传输低字节
    address>>=1;        //右移一位
    SCLK=1;
    _nop_();
}
for (i=0;i<8;i++)       //循环8次 写入数据
{
    SCLK=0;
    _nop_();
    SDA=dat&0x01;       //每次传输低字节
    dat>>=1;        //右移一位      DSCLK=1
    SCLK=1;
    _nop_();
}
CE=0;
_nop_();

}

void DS1302_initW() //初始化时间设置(写)
{
DS1302_Write(0x8e,0x00); //写保护关
DS1302_Write(0x80,sec); //秒
DS1302_Write(0x82,min); //分
DS1302_Write(0x84,hour); //时
DS1302_Write(0x86,day); //日
DS1302_Write(0x88,month); //月
DS1302_Write(0x8a,date); //周
DS1302_Write(0x8c,year); //年
DS1302_Write(0x8e,0x80); //写保护开
}

void DS1302_initR()
{
sec=DS1302_Read(0x81); //读秒数据
min=DS1302_Read(0x83); //读分钟数据
hour=DS1302_Read(0x85); //读小时数据
date=DS1302_Read(0x8b); //读星期数据
day=DS1302_Read(0x87); //读日数据
month=DS1302_Read(0x89); //读月数据
year=DS1302_Read(0x8d); //读年数据
}

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

  • 以上为DS1302驱动程序 *
    *******************************************************************************************/

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

  • 以下为LCD1602驱动显示程序 *
    *******************************************************************************************/
    void delay1ms(uint ms) //延时程序1ms
    {
    uint i,j;
    for(i=ms;i>0;i--)
    for(j=110;j>0;j--);
    }

void LCD_writecom(uchar com) //写命令
{
LCD_RS=0;
LCD_RW=0;
LCD_EN=1;
delay1ms(2);
P0=com;
LCD_EN=0;
delay1ms(2);

}

void LCD_writedat(uchar dat) //写数据
{
LCD_RS=1;
LCD_RW=0;
LCD_EN=1;
delay1ms(2);
P0=dat;
LCD_EN=0;
delay1ms(2);

}

void init()
{
LCD_EN=0;
LCD_writecom(0x38); //工作方式设置(8位数据接口;两行显示;5*7点阵字符)
LCD_writecom(0x06); //输入方式设置(数据读写操作后AC自动加1;数据读写操作后画面不移动)
LCD_writecom(0x0C); //显示开关控制(开显示,关光标,关闪烁)
LCD_writecom(0x01); //清屏
}

void display1() //初始化屏幕 格式: 20 - -

{ // : :

uchar num;
init();
LCD_writecom(0x80);
for(num=0;num<12;num++)
{
LCD_writedat(table1[num]);
delay1ms(2);

}
LCD_writecom(0x80+0x40);
for(num=0;num<15;num++)
{
LCD_writedat(table2[num]);
delay1ms(2);

}
}

void display2(uchar date)
{
uchar num;
LCD_writecom(0x80+12);
if(date==1) //星期一
{
for(num=0;num<3;num++)
{
LCD_writedat(table3[num]);
delay1ms(2);

}
}
if(date==2) //星期二
{
for(num=4;num<7;num++)
{
LCD_writedat(table3[num]);
delay1ms(2);

}
}
if(date==3) //星期三
{
for(num=8;num<11;num++)
{
LCD_writedat(table3[num]);
delay1ms(2);

}
}
if(date==4) //星期四
{
for(num=12;num<15;num++)
{
LCD_writedat(table3[num]);
delay1ms(2);

}
} //星期五
if(date==5)
{
for(num=16;num<19;num++)
{
LCD_writedat(table3[num]);
delay1ms(2);

}
}
if(date==6) //星期六
{
for(num=20;num<23;num++)
{
LCD_writedat(table3[num]);
delay1ms(2);

}
} //星期日
if(date==7)
{
for(num=24;num<27;num++)
{
LCD_writedat(table3[num]);
delay1ms(2);

}
}
}

void write_sfm(uchar add,char date) //时分秒写入显示
{
char shi,ge;
shi=date/16;
ge=date%16;
LCD_writecom(0x80+0x40+add);
LCD_writedat(0x30+shi);
LCD_writedat(0x30+ge);
}

void write_nyrx(uchar add,char date) //年月日星期写入显示
{
char shi,ge;
shi=date/16;
ge=date%16;
LCD_writecom(0x80+add);
LCD_writedat(0x30+shi);
LCD_writedat(0x30+ge);
}

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

  • 以上为LCD1602驱动显示程序 *
    *******************************************************************************************/

void display3() //时间显示程序
{
if(k==0) //时间显示停止控制标志

{
DS1302_initR();
write_sfm(10,sec);
write_sfm(7,min);
write_sfm(4,hour);
write_nyrx(3,year);
write_nyrx(6,month);
write_nyrx(9,day);
display2(date);
}
}

void keyscan() //键盘扫描
{
display3();
if(K1==0)
{
delay1ms(5);
if(K1==0)
{
K1num++; //K1按键计数
while(!K1);
k=1;
DS1302_Write(0x8e,0x00); //写保护关

        switch(K1num)
        {
            case 1:LCD_writecom(0x80+0x40+11);
                        LCD_writecom(0x0f);
                        k=1;                      //时间暂停显示
                        break;
            case 2:LCD_writecom(0x80+0x40+8);

                        break;
            case 3:LCD_writecom(0x80+0x40+5);

                        break;
            case 4:LCD_writecom(0x80+14);

                        break;
            case 5:LCD_writecom(0x80+10);

                        break;
            case 6:LCD_writecom(0x80+7);

                        break;
            case 7:LCD_writecom(0x80+4);

                        break;
            case 8:LCD_writecom(0x0c);
                        K1num=0;                      //K1按键计数清零
                        k=0;                          //时间继续走

                        write_sfm(10,sec);
                        write_sfm(7,min);
                        write_sfm(4,hour);
                        write_nyrx(3,year);
                        write_nyrx(6,month);
                        write_nyrx(9,day);
                        display2(date);
                        DS1302_initW();                 //将设置的时间日期等写入DS1302中
                        DS1302_Write(0x8e,0x80);        //写保护开
                        break;
        }

    }
}
if(K1num!=0)                            //如果K1按下进行以下操作
{
    if(K2==0)                           //K1按下进行K2按键检测
    {
        delay1ms(5);
        if(K2==0)
        {
            while(!K2);
            switch(K1num)
            {                                                   //秒++
                case 1:     DS1302_initW();
                            sec_h=sec/16;
                            sec_l=sec%16;
                            sec_l++;
                            if(sec_l==10)
                            {
                                sec_l=0;
                                sec_h++;
                            }
                            if(sec_h==6)
                                sec_h=0;
                            sec=sec_h*16+sec_l;
                            write_sfm(10,sec);
                            LCD_writecom(0x80+0x40+11);

                            break;

                case 2:     min_h=min/16;                        //分++
                            min_l=min%16;
                            min_l++;
                            if(min_l==10)
                            {
                                min_l=0;
                                min_h++;
                            }
                            if(min_h==6)
                                min_h=0;
                            min=min_h*16+min_l;
                            write_sfm(7,min);
                            LCD_writecom(0x80+0x40+8);
                            break;

                case 3:     hour_h=hour/16;
                            hour_l=hour%16;                       //时++

                            if(hour_h==2)
                            {
                                if(hour_l>3)
                                {

                                    hour_h=0;
                                    hour_l=0;
                                }
                            }
                            hour_l++;
                            if(hour_l==10)
                            {
                                hour_l=0;
                                hour_h++;
                            }
                            if((hour_h==2)&&(hour_l>3))
                            {
                                hour_h=0;
                                hour_l=0;
                            }
                            hour=hour_h*16+hour_l;
                            write_sfm(4,hour);
                            LCD_writecom(0x80+0x40+5);
                            break;

                case 4:     date++;
                            if(date==8)
                                date=1;
                            display2(date);
                            LCD_writecom(0x80+14);
                            break;

                case 5:     day_h=day/16;
                            day_l=day%16;

                            if(day_h==3)
                            {
                                if(day_l>1)
                                {

                                    day_h=0;
                                    day_l=1;
                                }
                            }
                            day_l++;
                            if(day_l==10)
                            {
                                day_l=0;
                                day_h++;
                            }
                            if((day_h==3)&&(day_l>1))
                            {
                                day_h=0;
                                day_l=1;
                            }
                            day=day_h*16+day_l;
                            write_nyrx(9,day);
                            LCD_writecom(0x80+10);
                            break;

                case 6:     month_h=month/16;                         //月++
                            month_l=month%16;                         

                            if(month_h==1)
                            {
                                if(month_l>2)
                                {

                                    month_h=0;
                                    month_l=1;
                                }
                            }
                            month_l++;
                            if(month_l==10)
                            {
                                month_l=0;
                                month_h++;
                            }
                            if((month_h==1)&&(month_l>2))
                            {
                                month_h=0;
                                month_l=1;
                            }
                            month=month_h*16+month_l;
                            write_nyrx(6,month);
                            LCD_writecom(0x80+7);
                            break;

                case 7:     year_h=year/16;
                            year_l=year%16;
                            year_l++;
                            if(year_l==10)
                            {
                                year_l=0;
                                year_h++;
                            }
                            if(year_h==6)
                                year_h=0;
                            year=year_h*16+year_l;
                            write_nyrx(3,year);
                            LCD_writecom(0x80+4);
                            break;

                case 8:     LCD_writecom(0x0c);
                            K1num=0;
                            k=0;
                            display2(date);
                            display3();
                            DS1302_Write(0x8e,0x80);        //写保护开
                            break;
            }
        }
    }
    if(K3==0)                       //K1按下进行K3按键检测
    {
        delay1ms(5);
        if(K3==0)
        {
            while(!K3);
            switch(K1num)
            {
                case 1:     sec_h=sec/16;
                            sec_l=sec%16;
                            sec_l--;
                            if(sec_l==-1)
                            {
                                sec_l=9;
                                sec_h--;
                            }
                            if(sec_h==-1)
                                sec_h=5;
                            sec=sec_h*16+sec_l;
                            write_sfm(10,sec);
                            LCD_writecom(0x80+0x40+11);

                            break;

                case 2:     min_h=min/16;
                            min_l=min%16;
                            min_l--;
                            if(min_l==-1)
                            {
                                min_l=9;
                                min_h--;
                            }
                            if(min_h==-1)
                                min_h=5;
                            min=min_h*16+min_l;
                            write_sfm(7,min);
                            LCD_writecom(0x80+0x40+8);
                            break;

                case 3:     hour_h=hour/16;
                            hour_l=hour%16;
                            hour_l--;
                            if(hour_l==-1)
                            {
                                hour_l=9;
                                hour_h--;
                            }
                            if(hour_h==-1)
                            {
                                hour_h=2;
                                hour_l=3;
                            }
                            hour=hour_h*16+hour_l;
                            write_sfm(4,hour);
                            LCD_writecom(0x80+0x40+5);
                            break;

                case 4:     date--;
                            if(date==0)
                                date=7;
                            display2(date);
                            LCD_writecom(0x80+14);
                            break;

                case 5:     day_l--;
                            if(day_l==-1)
                            {
                                day_l=9;
                                day_h--;
                            }
                            if(day_h==-1)
                            {
                                day_h=3;
                                day_l=1;
                            }
                            if((day_h==0)&&(day_l==0))
                            {
                                day_h=3;
                                day_l=1;
                            }
                            day=day_h*16+day_l;
                            write_nyrx(9,day);
                            LCD_writecom(0x80+10);
                            break;

                case 6:     month_l--;
                            if(month_l==-1)
                            {
                                month_l=9;
                                month_h--;
                            }
                            if(month_h==-1)
                            {
                                month_h=1;
                                month_l=2;
                            }
                            if((month_h==0)&&(month_l==0))
                            {
                                month_h=1;
                                month_l=2;
                            }
                            month=month_h*16+month_l;
                            write_nyrx(6,month);
                            LCD_writecom(0x80+7);
                            break;

                case 7:     year_h=year/16;
                            year_l=year%16;
                            year_l--;
                            if(year_l==-1)
                            {
                                year_l=9;
                                year_h--;
                            }
                            if(year_h==-1)
                                year_h=5;

                            year=year_h*16+year_l;
                            write_nyrx(3,year);
                            LCD_writecom(0x80+4);
                            break;

                case 8:     LCD_writecom(0x0c);
                            K1num=0;
                            k=0;
                            DS1302_initW();
                            display2(date);
                            display3();
                            DS1302_Write(0x8e,0x80);        //写保护开
                            break;
            }
        }
    }
}

}

void main()
{
display1(); //初始化屏幕显示
DS1302_initW(); //初始化时间日期
DS1302_initR(); //读取时间日期
while(1)
{

    keyscan();
}

}

时间: 2024-04-19 03:28:39

ds1302-DS1302主电源断开再打开时间初始化了的相关文章

c# winform 最小化长时间不动,再打开点刷新会卡住10秒左右,后面就不会再卡了

问题描述 c#winform开发的程序,最小化长时间不动,再打开点刷新会卡住10秒左右,后面就不会再卡了,这是什么原因?有人说是因为软件睡眠了,再打开会有个重新编译的过程,是不是这个原因呢,该怎么解决,求大神帮忙解答. 解决方案 解决方案二:都春天了,还睡眠个屁啊.超过10毫秒的睡眠都是假睡,可能的软件在走私.解决方案三:引用1楼sp1234的回复: 都春天了,还睡眠个屁啊.超过10毫秒的睡眠都是假睡,可能的软件在走私. 走私,啥意思呢解决方案四:走私嘛,就是非法的做事噻解决方案五:大家都没碰到

肖俊:网站诊断之影响页面打开时间的三大毒瘤

搞网站的都知道网站用户体验很重要,这在我们做SEO里面也是重中之重在多次强调的核心因素,而且搜索引擎也在不断的调整在往这方面做进一步的改 进,都是希望能够给用户一个很好的浏览体验,而对我们网站来说能够影响浏览体验的第一要素则是页面打开时间的问题.一个页面在5~8秒左右还没能打开,我 想大家都没耐心再等下去了,直接关闭了事,这样也增加了跳出率,也是用户体验不好的表现,那么我们如何分析出我们网站的打开时间和访问速度呢,网上有很多 在线测速工具,我这里要介绍的是百度统计自带的网站速度诊断功能. 我网站

Windows系统任务管理器打开时间长该怎么办

  Windows系统任务管理器打开时间长该怎么办 1.使用"WIN+R"组合键或单击"开始"菜单把运行窗口打开,在里面输入"gpedit.msc",再单击确定; 2.依次展开下面的选项:"用户配置"."管理模板"."系统"."Ctrl+Alt+Del选项",然后在右边双击"删除任务管理器"猛将气更改成未配置就可以了.

Windows任务管理器打开时间长该怎么办

  通过Windows任务管理器能够查看到系统进程和应用程序等方面信息,而任务管理器有多种打开方式,比较常用的就是在任务栏上右键点击"启用任务管理器"选项,也可以使用"ctrl+alt+esc"组合键来打开.但有部分用户反映在打开任务管理器过程中需要将长的时间,甚至有时候都打不开,出现这种现象很有可能是本地组策略配置删除"任务管理器"了,我们可以按照以下方式来取消. 解决方法/步骤: 1.使用"WIN+R"组合键或单击&quo

rownumberer-Extjs4 tabpanel 一个页面关闭后再打开报错

问题描述 Extjs4 tabpanel 一个页面关闭后再打开报错 去年毕业,在公司一直做C/S的软件,最近工作不是很忙,就自己学习了下Extjs4 问题如标题所示.报错信息: TypeError: Argument 1 of Node.insertBefore is not an object. 我是用的desktop + Extjs提供的mvc 做的. 下面贴出部分代码 controller init:function(){ var self=this; coreApp=self; this

c++-运行一个C++程序进行文件操作时 打开文件 总会把文件先变为空的 再打开 这是为什么呢?求解

问题描述 运行一个C++程序进行文件操作时 打开文件 总会把文件先变为空的 再打开 这是为什么呢?求解 int main() { system("color 31"); ofstream file("同学录系统.txt",ios::out); if(!file) { system("color 35"); cout<<"对不起,文件打开失败!"< abort(); //程序异常终止进程 } cout int

笔记本我设置的是“关闭盖子时”, “不采取任何操作”,然后再打开就不能用了。这种情况怎么解决?求指导

问题描述 笔记本我设置的是"关闭盖子时", "不采取任何操作",然后再打开就不能用了.这种情况怎么解决?求指导 我设置的是"关闭盖子时", "不采取任何操作",然后再打开就不能用了.一定要重启才能用.这种情况怎么解决?求大神指导.谢谢. 解决方案 确定你保存了并且设置正确了, 否则就是你的电脑和你的系统并不匹配 解决方案二: 看下你的主板电源驱动有没有装对.特别是一些山寨盗版,电源驱动不对,会出现各种问题.

Windows xp 如何在记事本中自动记录文件打开时间

在记事本中,我们可以记录每次打开某个文本文件的时间,具体操作如下:   1.桌面空白处点击鼠标[右键],选择[新建]-[文本文档],设置名称后打开.     2.打开文档后,在该文件的第一行输入"[.LOG](注意:必须大写!),然后换行开始正文.     3.选择[保存].     4.再打开会看到记录时间.  

如何让win7系统的电脑记录自己上次的打开时间

我们登录QQ的时候,通常都会提示我们上路登录的时间,如果我们电脑也能这样设置,那么有谁使用过我们电脑我们就能一目了然.这样当我们开电脑的时候就会知道有没有人碰过自己的电脑. 1 点击开始,在搜索框里面输入:编辑组,然后就能找到编辑组策略.双击进入组策略. 2 然后定位到:计算机配置/管理模板/Windows组件/Windows登录选项 3 然后在右边找到用户登录期间显示有关以前登录的信息项,并把该功能启动就行了. 其他方面你参考着设置.这些设置要自己根据自己想要的进行设置. 以上是关于如何让wi