完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
`会刷新,但显示乱码,芯片stc89c52,LCD1602,DS1302,请问这是什么情况? 代码如下: #include "DS1302.h" #include "LCD1602.h" #include ***it SCLK = P1^0;//时钟线 ***it IO = P1^1; //数据输/入输出线 ***it RST = P1^2; //复位脚 unsigned char now_date[] = { 0 }; unsigned char old_date[] = { 19, 40, 14, 16, 12, 19 }; void delay_ms(unsigned int time) { unsigned int a, b; for (a = time; a > 0; a--) for (b = 114; b > 0; b--); } void main() { DS1302_write(0x8e, 0);//关闭写保护 DS1302_write(0x80, data_to_BCD(old_date[0]));//sec DS1302_write(0x82, data_to_BCD(old_date[1]));//min DS1302_write(0x84, data_to_BCD(old_date[2]));//hour DS1302_write(0x86, data_to_BCD(old_date[3]));//day DS1302_write(0x88, data_to_BCD(old_date[4]));//month DS1302_write(0x8c, data_to_BCD(old_date[5]));//year DS1302_write(0x8e, 0x80);//开启写保护 LCD1602_init();//LCD1602初始化 LCD1602_write_string("Date:20", 7); LCD1602_write_cmd(0x80 | 0x40);//第一行第一格开始写 LCD1602_write_string("Time:", 5); while (1) { DS1302_write(0x8e, 0);//关闭写保护 now_date[0] = BCD_to_data(DS1302_read(0x81)); now_date[1] = BCD_to_data(DS1302_read(0x83)); now_date[2] = BCD_to_data(DS1302_read(0x85)); now_date[3] = BCD_to_data(DS1302_read(0x87)); now_date[4] = BCD_to_data(DS1302_read(0x89)); now_date[5] = BCD_to_data(DS1302_read(0x8D)); DS1302_write(0x8e, 0x80);//开启写保护 LCD1602_write_cmd(0x80 | 0x08); LCD1602_write_data('0' + now_date[5]); LCD1602_write_data('-'); LCD1602_write_data('0' + now_date[4]); LCD1602_write_data('-'); LCD1602_write_data('0' + now_date[3]); LCD1602_write_cmd(0x80 | 0x46); LCD1602_write_data('0' + now_date[2]); LCD1602_write_data(':'); LCD1602_write_data('0' + now_date[1]); LCD1602_write_data(':'); LCD1602_write_data('0' + now_date[0]); delay_ms(500); } } void DS1302_write_byte(unsigned char dat)//写一个字节数据 { unsigned char i; for (i = 0; i < 8; i++) { SCLK = 0; //为下次产生上升沿做准备 IO = dat & 0x01;//从最低位开始读 SCLK = 1; //产生上升沿,读走数据 dat >>= 1; //露出屁股让它读 } } unsigned char DS1302_read_byte()//读取一个字节数据 { unsigned char i, dat; for (i = 0; i < 8; i++)//先写命令 { SCLK = 0; //为下次产生上升沿做准备 dat >>= 1; if (IO) dat |= 0x80;//先写到最高位,然后再移过去 SCLK = 1; //产生上升沿,读走数据 } return dat; } void DS1302_write(unsigned char cmd, unsigned char dat) { RST = 0; SCLK = 0; RST = 1;//开始 DS1302_write_byte(cmd);//写命令 DS1302_write_byte(dat);//写数据 SCLK = 1; RST = 0; } unsigned char DS1302_read(unsigned cmd) { unsigned char dat; RST = 0; SCLK = 0; RST = 1;//开始 DS1302_write_byte(cmd);//写命令 dat = DS1302_read_byte();//读取数据 SCLK = 1; RST = 0; return dat; } unsigned char data_to_BCD(unsigned char dat)//数据转BCD码 { unsigned char temp; temp = dat / 10; dat %= 10; dat = dat + temp * 16; return dat; } unsigned char BCD_to_data(unsigned char dat)//BCD码转数据 { unsigned char temp; temp = dat / 16; dat %= 16; dat = dat + temp * 10; return dat; } ` |
|
相关推荐
3个回答
|
|
你的BCD转换先除16再乘以10啥意思呀,我看是不对的,比如你转换一个0x0f,大概应该等于15,你试试能得到正确的结果吗
|
|
|
|
把对DS1302操作时的时钟频率降低一些,有的DS1302如果数据时钟频率高了,会数据错误的
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》第三十五章 摄像头实验
632 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第三十章 DHT11数字温湿度传感器
671 浏览 0 评论
772 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
1340 浏览 0 评论
1166 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12057 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 23:49 , Processed in 0.455004 second(s), Total 47, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号