标题: DS1302和液晶1602中显示时钟,为什么不走,显示是时间也是错误的 [打印本页]

作者: 陌路狂花    时间: 2017-11-21 17:33
标题: DS1302和液晶1602中显示时钟,为什么不走,显示是时间也是错误的
# include <reg52.h>
# define uchar unsigned char
# define uint unsigned int


sbit lcden = P3^4;
sbit rs = P3^5;
sbit wr = P3^6;

sbit rst = P1^0;
sbit io = P1^1;
sbit sclk  = P1^2;

uchar code dage[] = "2017-11-17   FRI";
uchar code dage1[] = "     :   :  ";


uchar miao, fen, shi, i;
/*  ***  函数声明 ****/
void display();
void write_sfm(uchar, uchar);
void Send_595(uchar);
void delay(uint);
void write_com(uchar);
void write_date(uchar);
void write_byte(uchar);
void init_lcd();
void set_ds1302();
uchar read_ds1302(uchar);
uchar read_byte();


void main()
{
        init_lcd();
        set_ds1302();
        while(1)
        {
                display();
        }
}

void delay(uint z)
{
        uint x, y;
        for(x=z; x>0; x--)
           for(y=110; y>0; y--);
}
/****** 往1602液晶 写入指令 ****/

void write_com(uchar com)
{
        rs = 0;
        P0 = com;
        delay(5);
        lcden = 1;
        delay(5);
        lcden = 0;
}
/*****  1602液晶 初始化  ******/
void init_lcd()
{
        /*Send_595(0xff);
        Send_595(0x00);
        P_HC595_RCLK = 0;
        P_HC595_RCLK = 1;*/
       
        wr = 0;
        lcden = 0;
       
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
       
        for(i=0; i<16; i++)
        {
        write_date(dage[i]);
        delay(5);
        }

        write_com(0x80+0x40);
       
        for(i=0; i<13; i++)
        {
                write_date(dage1[i]);
                delay(5);
        }
}
/*  *****往1602液晶写入数据 ****** */
void write_date(uchar date)
{
        rs = 1;
        P0 = date;
        delay(5);
        lcden = 1;
        delay(5);
        lcden = 0;
}

       

/****** DS1302 中写入一个字节 ***/
void write_byte(uchar date)
{
        uchar i, temp;
        temp = date;
        for(i=0; i<8; i++)
        {
                if((temp&0x01) == 1)
                        io = 1;
                else
                        io = 0;
                sclk = 1;
                sclk = 0;
                temp >>= 1;
        }
}
/*****′ ***/
uchar read_byte()
{
        uchar i, temp;
        for(i=0; i<8; i++)
        {
                temp>>=1;
                if(io == 1)
                        temp|=0x80;
                 sclk = 1;
                 sclk = 0;       
        }
        return temp;
}
       
/***** Ö¸¶¨Î»ÖÃD′ ****/
void write_ds1302(uchar addr, uchar date)
{
        rst = 0;
        sclk = 0;
        rst = 1;
       
        write_byte(addr);
        write_byte(date);
       
        sclk = 1;
        rst = 0;
}
/****** Ö¸¶¨Î»Ööá ***/
uchar read_ds1302(uchar addr)
{
        uchar date;
        rst = 0;
        sclk = 0;
        rst = 1;
        write_byte(addr);
        date = read_byte();
        sclk = 1;
        rst = 0;
       
  return date;
}
/******  3õê¼»ˉDS1302  *****/
void set_ds1302()
{
        write_ds1302(0x8e, 0x00);
       
        write_ds1302(0x80, 0x00);
        write_ds1302(0x82, 0x00);
        write_ds1302(0x84, 0x00);
       
        write_ds1302(0x8e, 0x80);       
}
/****** ê±£¬·Ö£¬Ãë £¬·Öàë¸ö£¬ ê®Î»  ****/
void write_sfm(uchar addr, uchar date)
{
        uchar shi, ge;
        shi = date/10;
        ge = date%10;
        write_com(0x80+0x40+addr);
        write_date(0x30+shi);
        write_date(0x30+ge);
}

/****** íù1602ÖDÏÔê¾êy¾Y ****/
void display()
{
        uchar d;
        write_ds1302(0x8e, 0x00);
       
        d = read_ds1302(0x81);
        miao = (d/16)*10 + d%16;
  write_sfm(11, miao);       
       
        d = read_ds1302(0x83);
        miao = (d/16)*10 + d%16;
  write_sfm(7, fen);       
       
        d = read_ds1302(0x85);
        miao = (d/16)*10 + d%16;
  write_sfm(3, shi);       
       
        write_ds1302(0x8e, 0x80);
}


IMG_20171121_170928.jpg (3.78 MB, 下载次数: 53)

IMG_20171121_170928.jpg

JW-51开发板.pdf

99.63 KB, 下载次数: 3


作者: ziuny    时间: 2017-11-21 18:26
最好把DS1302的各个寄存器的功能贴出来就好了,
作者: gaohan130    时间: 2017-11-22 20:57
计时的功能都没有,怎么让时间加?
作者: zl2168    时间: 2017-11-22 21:22
好像给你介绍过一个正确有效案例,仔细去研读啊!
作者: 陌路狂花    时间: 2017-11-26 15:23
gaohan130 发表于 2017-11-22 20:57
计时的功能都没有,怎么让时间加?

DS1302有自动计时的功能,不用计时器

作者: csar    时间: 2017-11-27 10:53
建议去共享区下载一个现成的,吃透的再改,看完看懂这个程序时间足够吃透一个正确的程序了,




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1