找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3761|回复: 14
收起左侧

普中的板子,DS1302时钟数值在12864液晶上显示,1602上显示正常,12864上就不显示了

  [复制链接]
ID:494791 发表于 2019-4-13 16:13 | 显示全部楼层 |阅读模式
程序如下:
说明:Ds1302Init();为1302初始化函数
Ds1302ReadTime();为读取时间数据的函数
#include<reg52.h>                         
#include<ds1302.h>
#include<stdlib.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char       
char num=0;
uchar DisplayData[8];
sbit rs=P2^6;        
sbit rw=P2^5;        
sbit en=P2^7;
sbit psb=P3^2;
sbit DSIO=P3^4;
sbit RST=P3^5;
sbit SCLK=P3^6;
//---DS1302写入和读取时分秒的地址命令---//
//---秒分时日月周年 最低位读写位;-------//
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

//---DS1302时钟初始化2016年5月7日星期六12点00分00秒。---//
//---存储顺序是秒分时日月周年,存储格式是用BCD码---//
uchar TIME[7] = {0, 0, 0x12, 0x07, 0x05, 0x06, 0x16};        
void delayxms(uint n)                     
{
    uint x,y;  
    for(x=n;x>0;x--)
        for(y=110;y>0;y--);
}
void lcd_wcom(uchar com)                 
{
    rs=0;
        rw=0;
        en=0;
        P0=com;
        delayxms(5);
        en=1;
        delayxms(5);
        en=0;
}
void lcd_wdat(uchar dat)            
{
   rs=1;
   rw=0;                                                                                 
   en=0;
   P0=dat;
   en=1;
   delayxms(5);
   en=0;
}
void lcd_init()               
{
    lcd_wcom(0x30);   
        delayxms(5);                                                                
    lcd_wcom(0x0c);          
        delayxms(5);   
    lcd_wcom(0x01);   
        delayxms(5);
}
//void datapros()          
//{
//  Ds1302ReadTime();
//        DisplayData[0] =                                 //时
//        DisplayData[1] = TIME[2]%16;                                 
//        //DisplayData[2] = 0x40;
//        DisplayData[3] = TIME[1]/16;                                //分
//        DisplayData[4] = TIME[1]%16;       
//        //DisplayData[5] = 0x40;
//        DisplayData[6] = TIME[0]/16;                                //秒
//        DisplayData[7] = TIME[0]%16;
//}
//void DigDisplay()
//{
//           lcd_wcom(0x80);
//        lcd_wdat(DisplayData[0]+0x30);
//        lcd_wdat(DisplayData[1]+0x30);
//        lcd_wdat(0x3a);
//        lcd_wdat(DisplayData[3]+0x30);
//        lcd_wdat(DisplayData[4]+0x30);
//        lcd_wdat(0x3a);
//        lcd_wdat(DisplayData[6]+0x30);                  
//        lcd_wdat(DisplayData[7]+0x30);
//}
void Ds1302Write(uchar addr, uchar dat)
{
        uchar n;
        RST = 0;
        _nop_();

        SCLK = 0;//先将SCLK置低电平。
        _nop_();
        RST = 1; //然后将RST(CE)置高电平。
        _nop_();

        for (n=0; n<8; n++)//开始传送八位地址命令
        {
                DSIO = addr & 0x01;//数据从低位开始传送
                addr >>= 1;
                SCLK = 1;//数据在上升沿时,DS1302读取数据
                _nop_();
                SCLK = 0;
                _nop_();
        }
        for (n=0; n<8; n++)//写入8位数据
        {
                DSIO = dat & 0x01;
                dat >>= 1;
                SCLK = 1;//数据在上升沿时,DS1302读取数据
                _nop_();
                SCLK = 0;
                _nop_();       
        }       
                 
        RST = 0;//传送数据结束
        _nop_();
}

uchar Ds1302Read(uchar addr)
{
        uchar n,dat,dat1;
        RST = 0;
        _nop_();

        SCLK = 0;//先将SCLK置低电平。
        _nop_();
        RST = 1;//然后将RST(CE)置高电平。
        _nop_();

        for(n=0; n<8; n++)//开始传送八位地址命令
        {
                DSIO = addr & 0x01;//数据从低位开始传送
                addr >>= 1;
                SCLK = 1;//数据在上升沿时,DS1302读取数据
                _nop_();
                SCLK = 0;//DS1302下降沿时,放置数据
                _nop_();
        }
        _nop_();
        for(n=0; n<8; n++)//读取8位数据
        {
                dat1 = DSIO;//从最低位开始接收
                dat = (dat>>1) | (dat1<<7);
                SCLK = 1;
                _nop_();
                SCLK = 0;//DS1302下降沿时,放置数据
                _nop_();
        }

        RST = 0;
        _nop_();        //以下为DS1302复位的稳定时间,必须的。
        SCLK = 1;
        _nop_();
        DSIO = 0;
        _nop_();
        DSIO = 1;
        _nop_();
        return dat;       
}
void Ds1302Init()
{
        uchar n;
        Ds1302Write(0x8E,0X00);                 //禁止写保护,就是关闭写保护功能
        for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年
        {
                Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);       
        }
        Ds1302Write(0x8E,0x80);                 //打开写保护功能
}
void Ds1302ReadTime()
{
        uchar n;
        for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年
        {
                TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
        }
               
}

void main()
{       
        //uchar n;
        psb=1;
        lcd_init();               
        lcd_wcom(0x80);          //这四行是我为了测试程序加上去的,当Ds1302Init(); 函数和Ds1302ReadTime();函数都被注释时,该部分正常显示,
        lcd_wdat(1+0x30);      //当Ds1302Init();和 Ds1302ReadTime();只要有一个不被注释时这四行就不显示了,奇了怪了,没有循环,后边的程序还能对前边的程序造成影响
        lcd_wcom(0x90);          //
        lcd_wdat(1+0x30);           //
        Ds1302Init();                                             
        while(1)
        {  
          Ds1302ReadTime();
//          datapros();       
//    DigDisplay();   
      lcd_wcom(0x98);
          lcd_wdat(TIME[2]/16+0x30);               
          lcd_wdat(TIME[2]%16+0x30);
          lcd_wdat(0x3a);
          lcd_wdat(TIME[1]/16+0x30);
          lcd_wdat(TIME[1]%16+0x30);
          lcd_wdat(0x3a);
          lcd_wdat(TIME[0]/16+0x30);
          lcd_wdat(TIME[0]%16+0x30);                                       
        }               
}

回复

使用道具 举报

ID:494791 发表于 2019-4-13 16:49 | 显示全部楼层
求救
回复

使用道具 举报

ID:96682 发表于 2019-4-13 18:10 | 显示全部楼层
有相应出现不用,乱套程序能正常显示么
回复

使用道具 举报

ID:164602 发表于 2019-4-14 09:49 | 显示全部楼层
没从程序中看到你用了12864啊
1602与12864是两种可以说是完全不同的器件吧,没有新的程序,当然没有相应的功能。
另外,你的12864会接吗?那也是和1602不同的哦

评分

参与人数 1黑币 +1 收起 理由
嘉立创AAA + 1 普中是越来越缺德了!

查看全部评分

回复

使用道具 举报

ID:494791 发表于 2019-4-14 14:54 | 显示全部楼层
HC6800-ES-V2.0 发表于 2019-4-14 09:49
没从程序中看到你用了12864啊
1602与12864是两种可以说是完全不同的器件吧,没有新的程序,当然没有相应的 ...

有12864的显示程序啊,三个以lcd开头命名的不就是吗?在主函数里调用写命令函数和写数据函数不就行了吗?那个选择是串行还是并行的程序里也有,主函数里面滴四行那里请帮忙看一下
回复

使用道具 举报

ID:456780 发表于 2019-4-14 16:26 | 显示全部楼层
我这有1286451的程序,直接调用就行,我51都是调用那个,也不需要改
回复

使用道具 举报

ID:456780 发表于 2019-4-14 16:28 | 显示全部楼层

我的是串行通讯的程序
回复

使用道具 举报

ID:337069 发表于 2019-4-14 21:40 | 显示全部楼层
好好看看12864手册,带不带字库?
回复

使用道具 举报

ID:497670 发表于 2019-4-14 22:55 | 显示全部楼层
你好!
1、程序提供的不全
2、问题现象没有截图
3、给你一个类似的实物你看看

002.png


004.png



回复

使用道具 举报

ID:386381 发表于 2019-4-15 00:34 来自手机 | 显示全部楼层
前有字库,后无字库
回复

使用道具 举报

ID:164602 发表于 2019-4-15 09:06 | 显示全部楼层
单片机小白一个 发表于 2019-4-14 14:54
有12864的显示程序啊,三个以lcd开头命名的不就是吗?在主函数里调用写命令函数和写数据函数不就行了吗? ...

你的程序,我是认真看了的,没有12864的驱动显示程序,只有1602的程序,这两个器件是不同时的,程序不能共用!
回复

使用道具 举报

ID:269090 发表于 2019-4-15 10:22 | 显示全部楼层
驱动芯片不同,引脚定义不同吧,你试试修改引脚定义。(看着手册和原理图)
回复

使用道具 举报

ID:528325 发表于 2019-5-10 13:30 | 显示全部楼层
有没有源文件啊
回复

使用道具 举报

ID:682755 发表于 2020-6-13 10:59 来自手机 | 显示全部楼层
带字库的lcd12864和不带字库的肯定是不一样的啦,因为你想调用的ds1302里面的时间等都是变量,带字库的lcd12864没有添加变量函数所以你就调用不了
回复

使用道具 举报

ID:744327 发表于 2020-6-13 13:11 | 显示全部楼层
带字库的lcd12864需要添加一个变量和函数
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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