[学习资料]

PIC单片机(PIC16F877A)DS1302芯片程序(转载)

[复制链接]
639|16
手机看帖
扫描二维码
随时随地手机跟帖
zljiu|  楼主 | 2019-6-21 13:01 | 显示全部楼层 |阅读模式
#include<pic.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define rs_h PORTC|=0x01
#define rs_l PORTC&=0xfe
#define rw_h PORTC|=0x02
#define rw_l PORTC&=0xfd
#define en_h PORTC|=0x04
#define en_l PORTC&=0xfb
#define rst_h PORTC|=0x08
#define rst_l PORTC&=0xf7
#define sck_h PORTC|=0x10
#define sck_l PORTC&=0xef
#define io_h PORTC|=0x20
#define io_l PORTC&=0xdf
#define SECADD 0X80//秒寄存器地址
#define MINADD 0x82
#define HRADD 0x84
#define DATEADD 0x86
#define MONTHADD 0x88
#define DAYADD 0x8a
#define YEARADD 0x8c
#define CONTROLADD 0x8e
#define PORT (PORTB)


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 13:02 | 显示全部楼层
void delayms(uint x);
void lcd_com(uchar com);
void lcd_dat(uchar dat);
void lcd_write(uchar c,uchar r,uchar dat);
void lcd_init(void);
void Ds1302Init(void);
void WriteByte(uchar dat);
uchar ReadByte(void);
uchar BCDtoDex(uchar dat);
uchar DextoBCD(uchar dat);
uchar ReadByte(void);
void Ds1302Write(uchar add,uchar dat);
uchar Ds1302Read(uchar add);


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 13:02 | 显示全部楼层
void main(void)
{
        uchar sec,min,hr,date,month,day,year;
        TRISB=0x00;
        TRISC&=0xc0;
        lcd_init();
        Ds1302Init();
        while(1)
        {
                sec=Ds1302Read(SECADD);
                min=Ds1302Read(MINADD);
                hr=Ds1302Read(HRADD);
                date=Ds1302Read(DATEADD);
                month=Ds1302Read(MONTHADD);
                day=Ds1302Read(DAYADD);
                year=Ds1302Read(YEARADD);

                sec=BCDtoDex(sec);
                min=BCDtoDex(min);
                hr=BCDtoDex(hr);
                date=BCDtoDex(date);
                month=BCDtoDex(month);
                day=BCDtoDex(day);
                year=BCDtoDex(year);

                lcd_write(0,1,0x32);
                lcd_write(0,2,0x30);
                lcd_write(0,3,0x30+year/10);
                lcd_write(0,4,0x30+year%10);
                lcd_write(0,6,0x30+month/10);
                lcd_write(0,7,0x30+month%10);
                lcd_write(0,9,0x30+date/10);
                lcd_write(0,10,0x30+date%10);
                lcd_write(0,14,0x30+day);
                lcd_write(1,4,0x30+hr/10);
                lcd_write(1,5,0x30+hr%10);
                lcd_write(1,7,0x30+min/10);
                lcd_write(1,8,0x30+min%10);
                lcd_write(1,10,0x30+sec/10);
                lcd_write(1,11,0x30+sec%10);
                delayms(1005);//1ms
        }

}


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 13:03 | 显示全部楼层
void Ds1302Init(void)
{
        rst_l;
        sck_l;
        Ds1302Write(CONTROLADD,0);//关闭写保护
        Ds1302Write(MINADD,DextoBCD(06));
        Ds1302Write(HRADD,DextoBCD(19));
        Ds1302Write(DATEADD,DextoBCD(20));
        Ds1302Write(MONTHADD,DextoBCD(5));
        Ds1302Write(DAYADD,DextoBCD(7));
        Ds1302Write(YEARADD,DextoBCD(12));
        Ds1302Write(SECADD,DextoBCD(30));//写秒,同时启动时钟
}


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 13:03 | 显示全部楼层
void WriteByte(uchar dat)//上升沿输出
{
        uchar i;
        TRISC&=0xdf;
        for(i=8;i>0;i--)
        {
                sck_l;//低电平时数据线可变
                if(dat&0x01)
                        io_h;
                else
                        io_l;
                sck_h;
                dat>>=1;
        }
}


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 13:03 | 显示全部楼层
uchar BCDtoDex(uchar dat)//BCD码转十进制
{
        uchar i;
        i=dat/16;
        dat%=16;
        i=i*10+dat;
        return i;
}



使用特权

评论回复
zljiu|  楼主 | 2019-6-21 13:04 | 显示全部楼层
uchar DextoBCD(uchar dat)//十进制转BCD码
{
        uchar i;
        i=dat/10;
        dat%=10;
        i=i*16+dat;
        return i;
}


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 13:04 | 显示全部楼层
uchar ReadByte(void)//下降沿输出
{
        uchar i;
        uchar dat;
        TRISC|=0x20;
        for(i=8;i>0;i--)//要考虑之前写完后的状态,第一次进入此循环体即有下降沿
        {
                dat>>=1;
                sck_l;
                if(PORTC&0x20)
                        dat|=0x80;
                sck_h;       
        }
        return dat;
}

使用特权

评论回复
zljiu|  楼主 | 2019-6-21 13:04 | 显示全部楼层

void Ds1302Write(uchar add,uchar dat)
{
        rst_l;
        sck_l;
        rst_h;
        WriteByte(add);//最低位置0表示写
        WriteByte(dat);
        rst_l;
}

使用特权

评论回复
zljiu|  楼主 | 2019-6-21 13:06 | 显示全部楼层
uchar Ds1302Read(uchar add)
{
        uchar dat;
        rst_l;
        sck_l;
        rst_h;
        WriteByte(add+1);//地址最低位置1表示读
        dat=ReadByte();
        rst_l;
        return dat;
}


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 13:06 | 显示全部楼层
void delayms(uint x) //8M晶振下,延时1ms
{
        uint y,z;
        for(y=x;y>0;y--)
                for(z=220;z>0;z--);
}



使用特权

评论回复
zljiu|  楼主 | 2019-6-21 13:06 | 显示全部楼层
void lcd_init(void)//LCD1602初始化
{
        lcd_com(0x38);
        lcd_com(0x0c);
        lcd_com(0x06);
        lcd_write(0,5,0xb0);
        lcd_write(0,8,0xb0);
        lcd_write(1,6,0x3a);
        lcd_write(1,9,0x3a);
}

使用特权

评论回复
zljiu|  楼主 | 2019-6-21 13:07 | 显示全部楼层
void lcd_com(uchar com)//向LCD1602写命令
{
        rs_l;
        rw_l;
        PORT=com;
        delayms(1);
        en_h;
        delayms(1);        
        en_l;
}

使用特权

评论回复
zljiu|  楼主 | 2019-6-21 13:07 | 显示全部楼层
void lcd_dat(uchar dat)//向LCD1602写数据
{
        rs_h;
        rw_l;
        PORT=dat;
        delayms(1);
        en_h;
        delayms(1);
        en_l;
}


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 13:07 | 显示全部楼层
void lcd_write(uchar c,uchar r,uchar dat)//向LCD1602指定行、指定列、写数据
{
        lcd_com(0x80+0x40*c+r);
        lcd_dat(dat);
        delayms(1);
}

使用特权

评论回复
zljiu|  楼主 | 2019-6-21 13:08 | 显示全部楼层
521025d0c6632855e2.png

使用特权

评论回复
mjs0528| | 2019-10-6 20:03 | 显示全部楼层
感谢分享,感谢楼主!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

3319

帖子

3

粉丝