找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于51单片机LCD1602时钟显示时总是少显示1秒的问题

[复制链接]
跳转到指定楼层
楼主
在进行LCD1602显示秒变化时,发现按规律不显示10、21、32.... 找不到原因,各位大佬能否帮忙解决
主程序:
#include <REGX52.H>
#include "LCD1602.H"
#include "DS1302.h"
#include "Delay.h"
unsigned char second;
void main()
{
      
        DS1302_Init();
        LCD_Init();
        DS1302_Write(0x8e,0x00);         //如果读出时间为一个大于59并且不动的数,芯片可能处于写保护状态,关闭保护
      
        LCD_ShowString(1,1,"RRR");
        DS1302_Write(0x80,0x07);
      
        while(1)
        {
                second = DS1302_Read(0x81);
                LCD_ShowNum(2,1,second/16*10+second%16,3); //16进制转BCD码
                Delay(1000);
        }
}
DS1302模块化程序:
#include <REGX52.H>


sbit DS1302_SCLK = P3^6;
sbit DS1302_IO = P3^4;
sbit DS1302_CE = P3^5;


void DS1302_Init(void)
{
        DS1302_CE = 0;
        DS1302_SCLK = 0;
}
void DS1302_Write(unsigned char Command,Data)        //command命令如秒、分..
{
        unsigned char i;
        DS1302_CE = 1;
        for(i=0;i<8;i++)
        {
                DS1302_IO = Command&(0x01<<i);
                DS1302_SCLK = 1;
                DS1302_SCLK = 0;        //需要考虑时间是否允许
        }
        for(i=0;i<8;i++)
        {
                DS1302_IO = Data&(0x01<<i);
                DS1302_SCLK = 1;
                DS1302_SCLK = 0;      
        }
        DS1302_CE = 0;
}
unsigned char DS1302_Read(unsigned char Command)        //读出数据即显示写入的数据所以有返回值
{
        unsigned char i,Data = 0x00;        //局部变量初值不确定
        DS1302_CE = 1;
        for(i=0;i<8;i++)
        {
                DS1302_IO = Command&(0x01<<i);
                DS1302_SCLK = 0;
                DS1302_SCLK = 1;        //先置0再置1保证时序准确
        }
        for(i=0;i<8;i++)
        {
                DS1302_SCLK = 1;
                DS1302_SCLK = 0;
                if(DS1302_IO)                        //随着时序的运行 DS1302以及把想要输出的第0位给到IO输出口的这条线上
        {Data |= (0x01<<i);}
        }
        DS1302_CE = 0;
        DS1302_IO = 0;

        return Data;


}


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

使用道具 举报

沙发
ID:1080935 发表于 2023-5-30 18:32 | 只看该作者
读取时间间隔太大,虽然是秒,一秒一次读取有可能会漏掉一个数,可缩短读取时间间隔试下,如0.5秒读一次。
回复

使用道具 举报

板凳
ID:123289 发表于 2023-5-31 09:50 | 只看该作者
每10ms读一次,当本次与上次不同时,显示本次,这样误差优于10ms。
以依理类推。你可以改变读取间隔。
回复

使用道具 举报

地板
ID:332444 发表于 2023-5-31 14:29 | 只看该作者
按秒刷新,简洁的程序美妙的效果。

录像50_转.gif (91.39 KB, 下载次数: 96)

录像50_转.gif
回复

使用道具 举报

5#
ID:332444 发表于 2023-5-31 15:52 | 只看该作者
之上图片是按秒8位更新,当然也可以拆分为按秒按分按时分别更新2位数据可以提高速度更快完成。
回复

使用道具 举报

6#
ID:332444 发表于 2023-6-1 08:52 | 只看该作者
按理说使用1602比使用8位数码管更节省处理时间,8位数码管需要不停刷新,1602则可以按秒刷新因此可以更好安排时间,从动画引脚颜色变化可见,一个合理的程序再添加按秒刷新不会对原来效果有什么影响.
回复

使用道具 举报

7#
ID:384109 发表于 2023-6-1 09:48 | 只看该作者
LCD显示代码的问题
回复

使用道具 举报

8#
ID:390416 发表于 2023-6-1 18:11 | 只看该作者
http://www.51hei.com/bbs/dpj-228933-1.html
这个帖子里面 有LCD1602使用详细说明,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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