求助 12864+ds1302 显示问题

2019-07-16 02:41发布

主要问题是readclock();这个子程序加上后12864无显示,怕1302的程序写错,特意写了个数码管的程序,能够正常读取数值,所以readclock();这个没有问题,请哪位高手帮忙看看。冲突或者在那。


#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
#define writeaddr_nian         0x8c        
#define writeaddr_yue         0x88
#define writeaddr_zhou         0x8a
#define writeaddr_ri         0x86  
#define writeaddr_shi         0x84  
#define writeaddr_feng         0x82
#define writeaddr_miao         0x80
#define writeaddr_wp         0x8e

#define readaddr_nian         0x8d        
#define readaddr_yue         0x89
#define readaddr_zhou         0x8b
#define readaddr_ri             0x87  
#define readaddr_shi         0x85  
#define readaddr_feng         0x83
#define readaddr_miao         0x81


uchar nian,yue,ri,zhou,miao;
char shi,feng,shi1,feng1;  
uchar code  dis[] = {"年月日时分秒星期定时: ℃"};
uchar dis1[2];
uchar shijian[15];
uchar riqi[12];
uchar dingshi[10];
uchar xingqi[5];

sbit LCD_RS  =  P2^6;      //寄存器选择输入
sbit LCD_RW  =  P2^5;      //液晶读/写控制
sbit LCD_EN  =  P2^7;      //液晶使能控制
sbit LCD_PSB =  P3^2;      //串/并方式控制
sbit LCD_RST =  P3^7;      //液晶复位端口



sbit sclk=P3^6;        //时钟信号
sbit ce=P3^5;    //使能信号
sbit io=P3^4;         //1302信号
sbit  ACC_7=ACC^7;




void delayms(int x)
{ uint i,j;
  for(i=x;i>0;i--)
          for(j=110;j>0;j--);
}
//延时程序



void write1302( uchar addr ,uchar dat)         //写入1302
{uchar i ,temp;
  ce=0;
  sclk=0;
  ce=1;
  for(i=8;i>0;i--)                                 //写地址
        {sclk=0;
         temp=addr;
         io=(bit)(temp&0x01);
         addr>>=1;
     sclk=1;       
        }
  for(i=8;i>0;i--)                                 //写数据
        {sclk=0;
         temp=dat;
         io=(bit)(temp&0x01);
        dat>>=1;
     sclk=1;       
        }
   ce=0;
}

uchar read1302(uchar addr)                          //读1302
{uchar i,temp,dat1,dat2;
  ce=0;
  sclk=0;
  ce=1;
  for(i=8;i>0;i--)                                 //写地址
        {sclk=0;
         temp=addr;
         io=(bit)(temp&0x01);
          addr>>=1;
     sclk=1;       
        }
  for (i=8;i>0;i--)
          {
           ACC_7=io;
           sclk=1;
           ACC>>=1;
           sclk=0;
          }
      ce=0;
        dat1=ACC;
        dat2=dat1/16;
        dat1=dat1%16;
        dat1=dat1+dat2*10;
        return(dat1) ;       



void lcd_wcmd(uchar cmd)          //写指令数据到LCD   RS=L,RW=L,E=高脉冲,D0-D7=指令码。
{                          

    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;   
    P0 = cmd;
    delayms(5);
    LCD_EN = 1;
    delayms(5);
    LCD_EN = 0;  
}

void lcd_wdat(uchar dat)                 //写显示数据到LCD RS=H,RW=L,E=高脉冲,D0-D7=数据。
{                          

    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = dat;
    delayms(5);
    LCD_EN = 1;
    delayms(5);
    LCD_EN = 0;
}



void lcd_init()                                                                        //液晶初始化
{
    LCD_PSB = 1;          //并口方式             
                                                                                                         
    delayms(5);            
    lcd_wcmd(0x30);      //基本指令操作
    delayms(5);
    lcd_wcmd(0x0C);      //显示开,关光标
    delayms(5);
    lcd_wcmd(0x01);      //清除LCD的显示内容
    delayms(5);
}

void zh (uchar dat)
{ dis1[0]=dat/10+0x30;
  dis1[1]=dat%10+0x30;

}



void display()
{uchar i;
               
                 
                 zh(nian);
                riqi[0]=dis1[0] ;
                riqi[1]=dis1[1] ;
                riqi[2]=dis[0]        ;
                riqi[3]=dis[1]        ;
                zh(yue);
                riqi[4]=dis1[0] ;
                riqi[5]=dis1[1] ;
                riqi[6]=dis[2]        ;
                riqi[7]=dis[3]        ;
                zh(ri);
                riqi[8]=dis1[0] ;
                riqi[9]=dis1[1] ;
                riqi[10]=dis[2]        ;
                riqi[11]=dis[3]        ;
                lcd_wcmd(0x80);                              
            for(i=0;i<12;i++)
                { lcd_wdat(riqi);               
                }

          
                //日期显示         xx年xx月xx日  

                zh(shi);
                shijian[0]=dis1[0] ;
                shijian[1]=dis1[1] ;
                shijian[2]=dis[20];         
                zh(feng);
                shijian[3]=dis1[0] ;
                shijian[4]=dis1[1] ;
                shijian[5]=dis[20];
                zh(miao);
                shijian[6]=dis1[0] ;
                shijian[7]=dis1[1] ;
               
                shijian[8]=dis[21] ;
                shijian[9]=dis[21] ;
                shijian[10]=dis[12] ;
                shijian[11]=dis[13] ;
                shijian[12]=dis[14] ;
                shijian[13]=dis[15] ;
                zh(zhou);
                shijian[14]=dis1[1] ;


                lcd_wcmd(0x90);                              
            for(i=0;i<15;i++)
                { lcd_wdat(shijian);               
                }
                //时间显示 xx时xx分xx  星期x

                 

               
                dingshi[0]=dis[16] ;
                dingshi[1]=dis[17] ;
                dingshi[2]=dis[18] ;
                dingshi[3]=dis[19] ;
                dingshi[4]=dis[21] ;
                zh(shi1);
                dingshi[5]=dis1[0] ;
                dingshi[6]=dis1[1] ;
                dingshi[7]=dis[20];         
                zh(feng1);
                dingshi[8]=dis1[0] ;
                dingshi[9]=dis1[1] ;
               
               
                lcd_wcmd(0x88);                              
            for(i=0;i<10;i++)
                { lcd_wdat(dingshi);               
                }
                //定时显示 xx时xx分  星期x



   }

void c51init()
{   TMOD = 0x02;
    TH0 = 0x06;
    TL0 = 0x06;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
       
}

void readclock()
{miao=read1302(readaddr_miao);
nian=read1302(readaddr_nian);
yue=read1302(readaddr_yue);
ri=read1302(readaddr_ri);
zhou=read1302(readaddr_zhou);
feng=read1302(readaddr_feng);
shi=read1302(readaddr_shi);

}

void main()
{  
   delayms(10);                 //上电,等待稳定
   lcd_init();
   c51init();
                    //初始化LCD
   while(1)
   { anjian();
     display();
         
     if(xscs>=40000)
        {
         xscs=0;
         readclock();
          

        }
   }
}




void timer0Interrupt(void) interrupt 1
{  xscs++;

}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
殷高旺
1楼-- · 2019-07-16 04:33
已复制保存查看了等待结果
shiqiankun424
2楼-- · 2019-07-16 06:47
 精彩回答 2  元偷偷看……
覆水
3楼-- · 2019-07-16 12:46
把原理图看下!有可能是DS1302和12864  的管脚共用了
覆水
4楼-- · 2019-07-16 14:17
我以前碰到这样过
psb.jpg
shiqiankun424
5楼-- · 2019-07-16 17:56
谢谢大家,问题找到了的,犯了一个低级错误,P34这个脚复用了的,没仔细看开发板。给大家添麻烦了的

一周热门 更多>