找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1272|回复: 0
打印 上一主题 下一主题
收起左侧

对自己在使用LCD12864显示1302时钟过程的总结 附单片机程序

[复制链接]
跳转到指定楼层
楼主
单片机:89c51Rc 晶振:11.0592MHZ

错误记录:
        1.误把 &0x1f(11111)写成 &11111 ,0x1f是二进制,11111是十进制
        2.再进行显示的时候,把小时寄存器中D5(AM/PM)标志记反了,实际是(0-AM,1-PM)
        
实际记录:
        1.对于1302在显示屏上显示,关于1302的数据显示"?",而其它部分正常显示,不用说,程序没问题,1302坏了(我用到第三个1302才正常显示,不是“?”)
        2.1302所具有的校准功能在显示AM/PM方面,必须小时位变化(类似22->23)才会发生,所以在初始化的时候必须对小时寄存器中D5(AM/PM)标志位进行设置(在显示AM/PM的前提下)

方式:
   1.是对于12/24小时制的选择以及AM/PM的设定,我选择的是在数组中放置标志位

uchar add_write[]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//寄存器地址
uchar add_read[]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
uchar tim0[]={22,7,2,11,11,59,55,1,1};//年、星期、月、日、时、分、秒、12/24、PM/AM
uchar tim_bcd[7];//保存读出的时间日期
uchar tim[14];//保存分解开的十位、个位

前两个是各个寄存器的读写地址,第三个是各寄存器的初始值设置,而第三个数组最后两个元素就是12/24,AM/PM标志位(1-12,0-24)(1-PM,0-AM)
  2.我对12/24小时制的选择以及AM/PM的设定是在初始化函数中对已经转化为BCD码的tim0[4](也就是对小时寄存器初始化写入)进行操作的

            if(tim0[7]==1)//对12/24标志位进行判断
                {
                        if(tim0[8]==1)
                                tim0[4]|=0xa0;//12小时PM
                        else
                                tim0[4]|=0x80;//12小时AM
                }
                else
                {
                        if(tim0[8]==1)//对AM/PM标志位进行判断
                                tim0[4]|=0x20;//PM
                        else
                                tim0[4]|=0x00;//AM
                }
   3.对于AM/PM的显示,我是在display_1302time显示函数中写的
主函数部分:
        initial_12864();
//        initial_1602();
        ds1302_initial();
        while(1)
        {        
                read_1302time();
                display_1302time();
        }

首先是在read_1302time()函数中把从小时寄存器读出的数据(BCD码)储存在tim_bcd[14]中,然后只留下后五位数据用于转化为十进制(小时时间数据只用到了后五位)
               if(i==4)
                {
                        tim_bcd[14] = tim_bcd[4];
                        tim_bcd[4] = tim_bcd[4]& 0x1f;//11111
                }

之后在display_1302time显示函数中对显示AM/PM进行判断
         if(tim_bcd[14]&0x20==0x20)
                Putstring(" PM");
        else
                Putstring(" AM");        

学1302的时候,我是在B站上从零学电子的个人空间_哔哩哔哩_Bilibili这个UP主学的,我觉得讲的很细。但是只有最基础的24小时星期显示,AM/Pm,12小时制需要自己加,而且硬件也很恶心,刚学的时候根本不知道是硬件还是软件的问题,就尼玛显示"?",鬼知道为啥显示“?”,折腾半天,三块1302坏了两块,改显示格式上下午的时间都没在”?“上面卡的时间长



上图.c和.h文件下载: 10.ds1302.zip (14.9 KB, 下载次数: 18)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表