单片机/MCUwilliam hill官网
直播中

a7857281

8年用户 327经验值
私信 关注
[问答]

DS1302时钟1602显示

为什么我程序下载后,1602液晶显示的不是我输进去的数值,而且关掉电源再开还有存储功能,还从刚才断电的地方继续走。
如图所示:

程序如下:
#include
#include"LCD1602.h"
#define uchar unsigned char
#define uint unsigned int
***it TSCLK=P1^0;
***it tiO=P1^1;
***it TEN=P1^2;
uchar Year,Month,Day,Hour,Min,Sec;
void delayms(uint z)   //延时函数ms
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=114;y>0;y--);
}
void Write_1302date(uchar com,uchar dat)        //DS1302写数据
{
        uchar i;
        TEN=0;
        TSCLK=0;
        TEN=1;
        for(i=0;i<8;i--)
        {
                TSCLK=0;
                TIO=com&0x01;
                TSCLK=1;
                com>>=1;
        }
        for(i=0;i<8;i--)
        {
                TSCLK=0;
                TIO=dat&0x01;
                TSCLK=1;
                dat>>=1;       
        }
}
uchar Read_1302date(uchar com)                 //DS1302读数据
{
        uchar i,dat;
        TEN=0;
        TSCLK=0;
        TEN=1;
        for(i=0;i<8;i++)
        {
                TSCLK=0;
                TIO=com&0x01;
                TSCLK=1;
                com>>=1;
        }
        for(i=0;i<8;i++)
        {
                TSCLK=0;
                dat>>=1;
                if(TIO)         dat|=0x80;          //如果TIO为高电平写1 否则写0
                TSCLK=1;
        }
        return dat;
}
uchar date_BCD(uchar dat)  //数据转BCD
{
        uchar dat1,dat2;
        dat1=dat/10;
        dat2=dat%10;
        dat2=dat2+dat1*16;
        return dat2;
}
uchar BCD_date(uchar dat)         //BCD转数据
{
        uchar dat1,dat2;
        dat1=dat/16;
        dat2=dat%16;
        dat2=dat2+dat1*10;
        return dat2;
}
void main()
{       
        init();
        Write_1302date(0x8e,0);//关闭写保护
        Write_1302date(0x80,date_BCD(30)); //秒
        Write_1302date(0x82,date_BCD(15)); //分
        Write_1302date(0x84,date_BCD(5)); //时
        Write_1302date(0x86,date_BCD(30)); //日
        Write_1302date(0x88,date_BCD(9));  //月
        Write_1302date(0x8c,date_BCD(17));;//年
        Write_1302date(0x8e,0x80);//开启写保护
        while(1)
        {
                Write_1302date(0x8e,0);//关闭写保护
                Sec=BCD_date(Read_1302date(0x81));
                Min=BCD_date(Read_1302date(0x83));
                Hour=BCD_date(Read_1302date(0x85));
                Day=BCD_date(Read_1302date(0x87));
                Month=BCD_date(Read_1302date(0x89));
                Year=BCD_date(Read_1302date(0x8d));
                Write_1302date(0x8e,0x80);//开启写保护
                ONE_Write_sfm(7,Year);
                ONE_Write_sfm(10,Month);
                ONE_Write_sfm(13,Day);
                TWO_Write_sfm(6,Hour);
                TWO_Write_sfm(9,Min);
                TWO_Write_sfm(12,Sec);       
        }
}

1602.h程序如下:
#define uchar unsigned char
#define uint unsigned int
***it lcden=P3^4;  //使能端
***it lcdrs=P3^5;  //数据命令选择端
***it lcdrw=P3^6;  //读写控制端
***it dula=P2^6;
***it wela=P2^7;
uchar code table3[]="Date:20  -  -  ";
uchar code table4[]="Time:   -  -   ";
void delay(uint z)   //延时函数ms
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=114;y>0;y--);
}
void Write_1602com(uchar com) //1602写命令
{
        lcdrs=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void Write_1602date(uchar dat)
{
        lcdrs=1;
        P0=dat;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void ONE_Write_sfm(uchar add,uchar date)
{
        uchar shi,ge;
        shi=date/10;
        ge=date%10;
        Write_1602com(0x80+add);
        Write_1602date(0x30+shi);
        Write_1602date(0x30+ge);
}
void TWO_Write_sfm(uchar add,uchar date)
{
        uchar shi,ge;
        shi=date/10;
        ge=date%10;
        Write_1602com(0x80+0x40+add);
        Write_1602date(0x30+shi);
        Write_1602date(0x30+ge);
}
void init()
{
        uchar num;
        dula=0;
        wela=0;
        lcden=0;
        lcdrw=0;
        Write_1602com(0x38);
        Write_1602com(0x01);
        Write_1602com(0x0c);
        Write_1602com(0x06);
        Write_1602com(0x80);
        for(num=0;num<15;num++)
        {
                Write_1602date(table3[num]);
                delay(5);
        }
        Write_1602com(0x80+0x40);
        for(num=0;num<15;num++)
        {
                Write_1602date(table4[num]);
                delay(5);
        }               
}


  • QQ截图20170226164344.png

回帖(10)

a7857281

2017-2-26 16:49:03
哈哈哈  我是新手   程序写的不好  莫见怪
举报

杨有国

2017-2-26 17:53:51
是不是因为你1302没有断电,所以继续走
举报

王栋春

2017-2-26 20:33:39
是否采用后备电池的问题            
举报

a7857281

2017-2-27 10:49:08
引用: 王栋春 发表于 2017-2-26 20:33
是否采用后备电池的问题

没有啊  而且上面显示跟我想设置的初值不一样  
举报

a7857281

2017-2-27 10:49:36
引用: yygkqzh 发表于 2017-2-26 17:53
是不是因为你1302没有断电,所以继续走

没有  而且上面显示初值跟我设定不一样 我不知道出了什么问题
举报

王栋春

2017-2-27 19:42:13
引用: a7857281 发表于 2017-2-27 10:49
没有啊  而且上面显示跟我想设置的初值不一样

要不就是你软件里面没有设置上电瞬间清零的功能
举报

NUIST_XKFYT

2017-3-6 03:00:49
数据与期望值不一致应该是BCD和十进制没有正确转换或写入的格式不对造成的。
举报

a7857281

2017-3-8 17:00:46
引用: NUIST_XKFYT 发表于 2017-3-6 03:00
数据与期望值不一致应该是BCD和十进制没有正确转换或写入的格式不对造成的。

写入格式是什么意思?不会吖 我跟我教程做的   BCD好像也是  我看看
举报

NUIST_XKFYT

2017-3-8 20:40:40
引用: a7857281 发表于 2017-3-8 17:00
写入格式是什么意思?不会吖 我跟我教程做的   BCD好像也是  我看看

就是BCD格式写入还是十进制格式写入
举报

a7857281

2017-3-9 12:54:24
引用: NUIST_XKFYT 发表于 2017-3-8 20:40
就是BCD格式写入还是十进制格式写入

没有啊    你帮我看看我BCD转换哪错了
举报

更多回帖

发帖
×
20
完善资料,
赚取积分