标题: 对自己在使用LCD12864显示1302时钟过程的总结 附单片机程序 [打印本页]

作者: yeyuemyl    时间: 2022-2-21 10:37
标题: 对自己在使用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, 下载次数: 19)








欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1