完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include
#include //定义DS1302使用的端口 ***it DSIO=P3^4; ***it SCLK=P3^6; ***it CE=P3^5; //定义LCD使用的端口 ***it LCD_E=P2^7; ***it LCD_RW=P2^5; ***it LCD_RS=P2^6; #define LCDIO P0 unsigned char code ds1302readaddr[7]={0x8B,0x81,0x83,0x85,0x87,0x89,0x8D};//读寄存器地址 unsigned char code ds1302writeaddr[7]={0x8A,0x80,0x82,0x84,0x86,0x88,0x8C};//写寄存器地址 unsigned char time[7]={0x01,0,0,0,0x14,0x08,0x17};//星期 秒 分 时 日 月 年 //初始时间2017年8月3日00点00分00秒星期四 BCD码表示 void lcddisplay(); void ds1302write(unsigned char addr,unsigned char dat); unsigned char ds1302read(unsigned char addr); void ds1302init(); void ds1302readtime(); void lcd1602writecom(unsigned char com); void lcd1602writedata(unsigned char dat); void lcdinit(); void delayms(unsigned char c); void main() //主程序,显示时间 { lcdinit();//初始化LCD ds1302init();//初始化ds1302 while(1) { ds1302readtime();//读取ds1302的数据 lcddisplay();//lcd显示ds1302的数据 } } void lcddisplay() { lcd1602writecom(0x80);//在第一行显示 lcd1602writedata('0'+Time[3]/16); lcd1602writedata('0'+(Time[3]&0x0f)); //时 lcd1602writedata(':'); lcd1602writedata('0'+Time[2]/16); lcd1602writedata('0'+(Time[2]&0x0f)); //分 lcd1602writedata(':'); lcd1602writedata('0'+Time[1]/16); lcd1602writedata('0'+(Time[1]&0x0f)); //秒 lcd1602writecom(0xc0); lcd1602writedata('2'); lcd1602writedata('0'); lcd1602writedata('0'+Time[6]/16); //年十位 lcd1602writedata('0'+(Time[6]&0x0f)); //年个位 lcd1602writedata('-'); lcd1602writedata('0'+Time[5]/16); //月十位 lcd1602writedata('0'+(Time[5]&0x0f)); //月个位 lcd1602writedata('-'); lcd1602writedata('0'+(Time[4]/16)); //日十位 lcd1602writedata('0'+(Time[4]&0x0f)); //日个位 lcd1602writedata('-'); lcd1602writedata('0'+(Time[0]&0x07)); //周 } //DS1302程序段 //写入地址和数据 void ds1302write(unsigned char addr,unsigned char dat) { unsigned char n; CE=0; SCLK=0; CE=1; for(n=0;n<8;n++) //写入地址码 { DSIO=addr&0x01; addr>>=1; SCLK=1; SCLK=0; } for(n=0;n<8;n++) //写入数据码 { DSIO=dat&0x01; dat>>=1; SCLK=1; SCLK=0; } CE=0; } unsigned char ds1302read(unsigned char addr)//读取数据 { unsigned char n,dat1,dat; CE=0; SCLK=0; CE=1; for(n=0;n<8;n++) { DSIO=addr&0x01; addr>>=1; SCLK=1; SCLK=0; } _nop_(); for(n=0;n<8;n++) { dat1=DSIO&0x01; dat1=dat1<<7; dat=(dat>>1)|(dat1); SCLK=1; SCLK=0; } CE=0; _nop_(); SCLK=1; _nop_(); DSIO=0; _nop_(); DSIO=1; _nop_(); return dat; } void ds1302init() //初始化DS1302 { unsigned char n; ds1302write(0x8E,0x00); //关闭写保护 for(n=0;n<7;n++) { ds1302write(ds1302writeaddr[n],Time[n]); } ds1302write(0x8E,0x80); //开启写保护 } void ds1302readtime() //读取时钟信息 { unsigned char n; for(n=0;n<7;n++) { Time[n]=ds1302read(ds1302readaddr[n]); } } //LCD程序段 void lcd1602writecom(unsigned char com) //lcd1602写命令程序 { LCD_E=0; //使能端为0 LCD_RS=0; //数据命令端为0,代表命令 LCD_RW=0; //读写端为0,代表写入 LCDIO=com; //输入端输入一个命令字节 delayms(4); //延迟40ns LCD_E=1; delayms(15); //使能端至少延迟150ns LCD_E=0; //复位 } void lcd1602writedata(unsigned char dat) //lcd1602写数据程序 { LCD_E=0; //使能端为0 LCD_RS=1; //数据命令端为1,代表数据 LCD_RW=0; //读写端为0,代表写入 LCDIO=dat; //输入端输入一个命令字节 delayms(4); //延迟40ns LCD_E=1; delayms(15); //使能端至少延迟150ns LCD_E=0; //复位 } void lcdinit() //初始化LCD1602 { lcd1602writecom(0x38); lcd1602writecom(0x0c); lcd1602writecom(0x06); lcd1602writecom(0x01); lcd1602writecom(0x80); } void delayms(unsigned char c) //误差 0us { unsigned char a,b; for (; c>0; c--) { for (b=199;b>0;b--) { for(a=1;a>0;a--); } } } |
|
相关推荐
3 个讨论
|
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
205 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1253 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
848 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
853 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1073 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12010 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 21:05 , Processed in 0.371635 second(s), Total 39, Slave 32 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号