历史上的今天
返回首页

历史上的今天

今天是:2025年06月22日(星期日)

2018年06月22日 | PIC单片机(PIC16F877A)DS1302芯片程序

2018-06-22 来源:eefocus

#include  

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)  

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);  

  

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  

    }  

  

}  

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));//写秒,同时启动时钟  

}  

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;  

    }  

}  

uchar BCDtoDex(uchar dat)//BCD码转十进制  

{  

    uchar i;  

    i=dat/16;  

    dat%=16;  

    i=i*10+dat;  

    return i;  

}  

uchar DextoBCD(uchar dat)//十进制转BCD码  

{  

    uchar i;  

    i=dat/10;  

    dat%=10;  

    i=i*16+dat;  

    return i;  

}  

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;  

}  

void Ds1302Write(uchar add,uchar dat)  

{  

    rst_l;  

    sck_l;  

    rst_h;  

    WriteByte(add);//最低位置0表示写  

    WriteByte(dat);  

    rst_l;  

}  

uchar Ds1302Read(uchar add)  

{  

    uchar dat;  

    rst_l;  

    sck_l;  

    rst_h;  

    WriteByte(add+1);//地址最低位置1表示读  

    dat=ReadByte();  

    rst_l;  

    return dat;  

}  

void delayms(uint x) //8M晶振下,延时1ms  

{  

    uint y,z;  

    for(y=x;y>0;y--)  

        for(z=220;z>0;z--);  

}  

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);  

}  

void lcd_com(uchar com)//向LCD1602写命令  

{  

    rs_l;  

    rw_l;  

    PORT=com;  

    delayms(1);  

    en_h;  

    delayms(1);   

    en_l;  

}  

void lcd_dat(uchar dat)//向LCD1602写数据  

{  

    rs_h;  

    rw_l;  

    PORT=dat;  

    delayms(1);  

    en_h;  

    delayms(1);  

    en_l;  

}  

void lcd_write(uchar c,uchar r,uchar dat)//向LCD1602指定行、指定列、写数据  

{  

    lcd_com(0x80+0x40*c+r);  

    lcd_dat(dat);  

    delayms(1);  

}  

推荐阅读

史海拾趣

弘凯光电(BRIGHTEK)公司的发展小趣事

弘凯光电一直致力于技术创新和产品升级。公司拥有一支高效、创新的技术团队,通过对产品技术的深入研究和持续创新,不断推出具有竞争力的新产品。例如,公司的iCLed系列产品,凭借其独特的设计和卓越的性能,在智能座舱设计领域获得了广泛应用。这种对技术创新的不断追求,使得弘凯光电在电子行业中始终保持领先地位。

Cantec Electronic Co Ltd公司的发展小趣事

为了进一步提升自身的竞争力,Cantec Electronic Co Ltd积极寻求与国际知名企业的合作。经过多次洽谈,公司成功与一家国际电子巨头签订了战略合作协议。通过技术共享和市场互通,公司的产品线得到了极大的丰富,同时也打开了国际市场的大门。这一合作不仅提升了公司的品牌知名度,也为公司的长远发展奠定了坚实的基础。

Bussmann (Eaton)公司的发展小趣事

随着电子技术的快速发展,对电路保护的要求也越来越高。为了满足市场需求,Bussmann于1992年开始研发芯片保险丝。这款新型保险丝将可熔性材料沉降到陶瓷基底上,具有体积小、安装方便等优点,能够广泛应用于印刷电路板等电子设备中。芯片保险丝的推出不仅进一步提升了Bussmann的技术实力,也为其在电子行业打开了新的市场空间。

芯源半导体(CW)公司的发展小趣事

在电子行业的激烈竞争中,芯源半导体(CW)公司凭借其卓越的技术创新能力,成功在市场中脱颖而出。公司创始人李博士带领研发团队,针对当时市场上半导体产品的不足,开发出了一款高性能、低功耗的芯片产品。这款产品凭借其卓越的性能和稳定性,迅速获得了市场的认可,为芯源半导体(CW)公司的初期发展奠定了坚实基础。

APC (APC by Schneider Electric)公司的发展小趣事

APC的产品和服务在全球范围内赢得了广泛认可。其InfraStruXure产品线因其集成式的电力、制冷、机架、管理和服务实现了一种开放、具有适应性且集成化的解决方案,赢得了近20个奖项。此外,APC还因其卓越的产品和业务表现,在多个年份赢得了全球100多个奖项。这些奖项不仅证明了APC在电子行业中的领先地位,也反映了其对于创新和质量的不懈追求。

ACCUTEK公司的发展小趣事

随着产品质量的不断提升和市场份额的逐步扩大,ACCUTEK公司开始将目光投向国际市场。公司积极参加国际电子展会和技术交流活动,与全球多家知名企业建立了合作关系。同时,公司还在海外设立了多个分支机构,以便更好地服务当地客户。这些举措不仅提升了公司的国际影响力,也为公司的长远发展注入了新的活力。

问答坊 | AI 解惑

【转】如何用keil在C中嵌入汇编

本帖最后由 paulhyde 于 2014-9-15 03:44 编辑 有时候用到需要精确延时之类的子程序时,用C语言比较难控制,这时候就可以在C中嵌入汇编 比较常用的keil中嵌入汇编的方法如下所示: 如图一,在C文件中要嵌入汇编的地方用#pragma asm和#pragma end ...…

查看全部问答>

关于DDK开发中的Build SoftICE Symbols的问题,我编译的工程生成了.sys文件,但没有生成.nms等用于调试的文件,不知是否和下面的出错信息

以下是出错的内容,我不明白“Matching PDB file not found.”是什么意思,是不是说生成的.sys文件里面没有编译信息? --------------------Configuration: RepSample - Win32 Free-------------------- Compiling resources with DDK resource c ...…

查看全部问答>

linux内核移植到2440问题

按照网上的教程交叉编译了一个linux的内核,在下载到arm2440上运行不了。显示的输出信息为: Read chip id = ec76 Nand flash status = c0, NandAddr=1 buf address :0x30008000 Set boot params = root=/dev/mtdblock2  load_ramdis ...…

查看全部问答>

关于I/O的困惑!

因为想写一只关于SATA I/O的程序,这几天一直混在www.t13.org,但通读了ATA-1,并没有发现命令寄存器与端口(1f0-1f7)的对应关系.(文档中只解释了每个寄存器的含义)。根本没提及端口(1f0-1f7),只提到了针脚37对应的CS1FX。而CS1FX是什么东东 ...…

查看全部问答>

LPC2366的几个问题

1. LPC2366的三个VDD(DCDC)(3V3)引脚是否一定要接3.3V电源?周立功的资料说这三个引脚不使用可以悬空。。。但是当这三个引脚悬空时整个单片机根本就没有工作,H-JTAG无法识别芯片,ISP也无法连接,说明这三个脚应该是给内部某些关键模块供电的 ...…

查看全部问答>

LPC2214 擦除问题

请问在擦除前是不是要用串口线把板子和主机相连. 第一次做,有点不明白,请高手指点一下. 怎么确实板子和主机已经连接成功了,成功又该怎么做. 谢谢!!…

查看全部问答>

ARM的相关问题

我刚接触单片机,能不能请各位高手解释一下ARM和单片机的关系。…

查看全部问答>

ST-LINK2进行STM32FLASH调试偶尔不能进入调试(有图)

                                 我使用ST-link2进行FLASH调试,前一段时间偶尔出现不能进入调试界面,给板子断电,然后关闭IAR,重新打开IAR又可以 ...…

查看全部问答>

【急聘】华为公司杭州研究所急聘:软硬件工程师

因杭研所发展迅速,急需大量人才,待遇优厚(硕士应届毕业8K),现有很多内部推荐名额,有兴趣的TX把简历发到我邮箱hyliu86@163.com, 合适的话我会联系你。 研发类岗位(软件,硬件,测试,操作系统等)   岗位要求:   1.学士学位及 ...…

查看全部问答>