微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 万年历程序,12864屏幕不显示

万年历程序,12864屏幕不显示

时间:10-02 整理:3721RD 点击:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int

sbit lcdrs=P0^7;
sbit lcdrw=P0^6;
sbit lcde=P0^5;
sbit lcdpsb=P0^4;

sbit rst=P1^0;
sbit sclk=P1^2;
sbit io=P1^1;
uchar writedat[]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
uchar read_dat[]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
uchar time_dat[7]={14,1,4,21,11,58,30}; //年周月日时分秒
uchar code table[]="0123456789";
uchar code table1[]="一二三四五六日";
uchar str0[16]="2014/04/21";
uchar str1[16]="09:46:30 星期一";
uchar str2[16]="fffff";
uchar str3[16]="dddd";

void write1302_byte(uchar dat);//写数据
void write1302(uchar add,uchar dat);//写地址和写数据
read1302(uchar add);//读数据
void set_rtc(void);//初始化
void lcd12864display(uchar *p,uchar line);
void lcd12864display(uchar *p,uchar line)
{
        uchar add;
        uchar i;
        if(line==1)
        {add=0x80;}
        if(line==2)
        {add=0x90;}
        if(line==3)
        {add=0x88;}
        if(line==4)
        {add=0x98;}
        i=*p+line;
//        write_com(i);
}         
void delayms(uint x)
{
        uchar i,j;
        for(j=0;j<x;j++)
                for(i=0;i<110;i++);        //延时x秒
}
void write_com(uchar com)        //写指令
{
        lcdrs=0;
        lcdrw=0;
        lcde=0;
        P2=com;
        delayms(5);
        lcde=1;
        delayms(5);
        lcde=0;
}
void write_dat(uchar dat)        //写数据
{
        lcdrs=1;
        lcdrw=0;
        lcde=0;
        P2=dat;
        delayms(5);
        lcde=1;
        delayms(5);
        lcde=0;
}
void lcd_init()           //初始化
{
        lcdpsb=1;
        write_com(0x30);
        delayms(5);
        write_com(0x0c);
        delayms(5);
        write_com(0x01);
        delayms(5);
}
void write1302_byte(uchar dat)//写数据
{
        uchar i;
        rst=0;
        _nop_();
        rst=1;
        _nop_();
        for(i=0;i<8;i++)
        {
                sclk=0;
                io=dat;
                dat=dat&&0x01;
                dat=dat>>1;
                sclk=1;
        }
           rst=0;
        _nop_();       
}
void write1302(uchar add,uchar dat)
{
        rst=0;
        _nop_();
        rst=1;
        _nop_();
        write1302_byte(add);//写地址
        write1302_byte(dat);//写数据
        rst=0;
        _nop_();
        sclk=1;
        _nop_();
        io=1;
        _nop_();               
}

read1302(uchar add)
{
        uchar i,value;
        rst=0;
        _nop_();
        sclk=0;
        _nop_();
        rst=1;
        _nop_();
        write1302_byte(add);
        for(i=0;i<8;i++)
        {
                value=value>>1;
                sclk=0;
                if(io)
                value=value|0x80;
                sclk=1;
                _nop_();       
        }
        rst=0;
        _nop_();
        sclk=0;
        _nop_();
        sclk=1;
        _nop_();
        io=1;
        _nop_();
        return value;//返回
}
void set_rtc()        //初始化
{
        uchar i,j;
        for(i=0;i<7;i++)
        {
                j=time_dat[i]/10;
                time_dat[i]=time_dat[i]%10;
                time_dat[i]=time_dat[i]+j*16;       
        }
        write1302(0x8e,0x00); //去除写保护
        for(i=0;i<7;i++)
        {
                write1302(writedat[i],time_dat[i]);               
        }
        write1302(0x8e,0x80);//写保护
}
void read_str(void)
{
        uchar i;
        for(i=0;i<7;i++)
        {
                time_dat[i]=read1302(read_dat[i]);
        }
}
struct Time
{
        uchar second;
        uchar minute;
        uchar hour;
        uchar day;
        uchar week;
        uchar month;
        uchar year;
}time;
//extern struct Time time;
void mian()
{
        time.second=59;
        time.minute=30;
        time.hour=11;
        time.day =21;
        time.week=1;
        time.month=4;
        time.year=14;
        set_rtc();
        delayms(50);
        lcd_init();
        delayms(50);
        while(1)
        {
        read_str();
        str0[2]=table[time.year/10];
        str0[3]=table[time.year%10];
        str0[6]=table[time.month/10];
        str0[7]=table[time.month%10];
        str0[9]=table[time.day/10];
        str0[10]=table[time.day%10];
        str1[1]=table[time.hour/10];
        str1[2]=table[time.hour%10];
        str1[4]=table[time.minute/10];
        str1[5]=table[time.minute%10];
        str1[7]=table[time.second/10];
        str1[8]=table[time.second%10];
        str1[14]=table1[(time.week-1)*2-1];
        str1[15]=table1[(time.week-1)*2]  ;
        lcd12864display(str0,1);
        lcd12864display(str1,2);
        lcd12864display(str2,3);
        lcd12864display(str3,4);
        }
               
}

看到你的留言了,这两天在忙毕业论文,而且又你问题又问得不清不楚,所以一直没回。12864我也没用过,刚买了回来也没心思去弄它。但是也看了一点。12864不显示,首先检查一下硬件线路有没问题。管脚对不,看一次初始化程序。如果屏幕没问题不显示一般都是这些问题。我也没用过只能给点建议。

我用最小系统和时钟模块,和液晶屏都检查过了,硬件没问题了。就是不显示啊,我怀疑是ds1302读到的数据每一写进去液晶屏,或者是ds1302的初始化错了

硬件没问题,我觉得是1302读到的数据没写到液晶屏里面

你看看ds1302的初始化有没有问题

液晶屏有没显示其他东西还是一点东西都不显示。先让液晶屏显示其他的东西有没问题。

液晶屏显示其他的东西有没问题,我试过了

行,我现在在弄,等我弄好了在发给你。

感谢啊,其实我对1302还不是很熟悉

我改了一下DS1302的驱动函数。你的main函数都写成mian.我仿真一直没反应。我还以为是程序问题呢。
你ds1302的读写都保存在数组time-dat中,根本就没有用到结构体time.
发改过的程序给你你下载看看还有什么问题没。因为我不会12864,因此也不能完全仿真。有问题再上来问。

  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char
  4. #define uint  unsigned int


  5. sbit lcdrs=P0^7;
  6. sbit lcdrw=P0^6;
  7. sbit lcde=P0^5;
  8. sbit lcdpsb=P0^4;


  9. sbit rst=P1^0;
  10. sbit sclk=P1^2;
  11. sbit io=P1^1;

  12. uchar writedat[]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
  13. uchar read_dat[]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
  14. uchar time_dat[7]={14,1,4,21,11,58,30}; //年周月日时分秒
  15. uchar code table[]="0123456789";
  16. uchar code table1[]="一二三四五六日";
  17. uchar str0[16]="2014/04/21";
  18. uchar str1[16]="09:46:30 星期一";
  19. uchar str2[16]="fffff";
  20. uchar str3[16]="dddd";


  21. void write1302_byte(uchar dat);//写数据
  22. void write1302(uchar add,uchar dat);//写地址和写数据
  23. read1302(uchar add);//读数据
  24. void set_rtc(void);//初始化
  25. void lcd12864display(uchar *p,uchar line);

  26. void lcd12864display(uchar *p,uchar line)
  27. {
  28.         uchar add;
  29.         uchar i;
  30.         if(line==1)
  31.         {add=0x80;}
  32.         if(line==2)
  33.         {add=0x90;}
  34.         if(line==3)
  35.         {add=0x88;}
  36.         if(line==4)
  37.         {add=0x98;}
  38.         i=*p+line;
  39. //        write_com(i);
  40. }         

  41. void delayms(uint x)
  42. {
  43.         uchar i,j;
  44.         for(j=0;j<x;j++)
  45.                 for(i=0;i<110;i++);        //延时x秒
  46. }

  47. void write_com(uchar com)        //写指令
  48. {
  49.         lcdrs=0;
  50.         lcdrw=0;
  51.         lcde=0;
  52.         P2=com;
  53.         delayms(5);
  54.         lcde=1;
  55.         delayms(5);
  56.         lcde=0;
  57. }

  58. void write_dat(uchar dat)        //写数据
  59. {
  60.         lcdrs=1;
  61.         lcdrw=0;
  62.         lcde=0;
  63.         P2=dat;
  64.         delayms(5);
  65.         lcde=1;
  66.         delayms(5);
  67.         lcde=0;
  68. }

  69. void lcd_init()           //初始化
  70. {
  71.         lcdpsb=1;
  72.         write_com(0x30);
  73.         delayms(5);
  74.         write_com(0x0c);
  75.         delayms(5);
  76.         write_com(0x01);
  77.         delayms(5);
  78. }

  79. void write1302_byte(uchar dat)//写数据
  80. {
  81.         uchar i;
  82.         for(i=0;i<8;i++)
  83.         {
  84.                 sclk=0;
  85.                 io=dat&0x01;
  86.                 dat=dat>>1;
  87.                 sclk=1;
  88.         }      
  89. }

  90. void write1302(uchar add,uchar dat)
  91. {
  92.         rst=0;
  93.         _nop_();
  94.                 sclk=0;
  95.             _nop_();
  96.         rst=1;
  97.         _nop_();
  98.         write1302_byte(add);//写地址
  99.         write1302_byte(dat);//写数据
  100.         rst=0;               
  101. }


  102. read1302(uchar add)
  103. {
  104.         uchar i,value;
  105.         rst=0;
  106.         _nop_();
  107.         sclk=0;
  108.         _nop_();
  109.         rst=1;
  110.         _nop_();
  111.         write1302_byte(add);
  112.         for(i=0;i<8;i++)
  113.         {
  114.                 value=value>>1;
  115.                 sclk=0;
  116.                 if(io)
  117.                 value=value|0x80;
  118.                 sclk=1;
  119.                 _nop_();        
  120.         }
  121.         rst=0;
  122.         _nop_();
  123.         sclk=0;
  124.         _nop_();
  125.         sclk=1;
  126.         _nop_();
  127.         io=0;
  128.         _nop_();
  129.         return value;//返回
  130. }
  131. void set_rtc()        //初始化
  132. {
  133.         uchar i,j;
  134.         for(i=0;i<7;i++)
  135.         {
  136.                 j=time_dat[i]/10;
  137.                 time_dat[i]=time_dat[i]%10;
  138.                 time_dat[i]=time_dat[i]+j*16;        
  139.         }       
  140.         write1302(0x8e,0x00); //去除写保护
  141.         for(i=0;i<7;i++)
  142.         {
  143.                 write1302(writedat[i],time_dat[i]);               
  144.         }
  145.         write1302(0x8e,0x80);//写保护
  146. }

  147. void read_str(void)
  148. {
  149.         uchar i;
  150.         for(i=0;i<7;i++)
  151.         {
  152.                 time_dat[i]=read1302(read_dat[i]);
  153.         }
  154. }


  155. void main()
  156. {

  157.         set_rtc();
  158.         delayms(50);
  159.         lcd_init();
  160.         delayms(50);
  161.         while(1)
  162.         {
  163.         read_str();
  164.         str0[2]=table[time_dat[0]/10];
  165.         str0[3]=table[time_dat[0]%10];

  166.         str0[6]=table[time_dat[2]/10];
  167.         str0[7]=table[time_dat[2]%10];

  168.         str0[9]=table[time_dat[3]/10];
  169.         str0[10]=table[time_dat[3]%10];

  170.         str1[1]=table[time_dat[4]/10];
  171.         str1[2]=table[time_dat[4]%10];

  172.         str1[4]=table[time_dat[5]/10];
  173.         str1[5]=table[time_dat[5]%10];

  174.         str1[7]=table[time_dat[6]/10];
  175.         str1[8]=table[time_dat[6]%10];

  176.         str1[14]=table1[(time_dat[1]-1)*2-1];
  177.         str1[15]=table1[(time_dat[1]-1)*2]  ;

  178.         lcd12864display(str0,1);
  179.         lcd12864display(str1,2);
  180.         lcd12864display(str2,3);
  181.         lcd12864display(str3,4);

  182.         }
  183.                
  184. }

复制代码

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int

sbit lcdrs=P0^7;
sbit lcdrw=P0^6;
sbit lcde=P0^5;
sbit lcdpsb=P0^4;

sbit rst=P1^0;
sbit sclk=P1^2;
sbit io=P1^1;
uchar writedat[]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
uchar read_dat[]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
uchar time_dat[7]={14,1,4,21,11,58,30}; //年周月日时分秒
uchar code table[]="0123456789";
uchar code table1[]="一二三四五六日";
uchar str0[16]="2014/04/21";
uchar str1[16]="09:46:30 星期一";
uchar str2[16]="1302显示实验";
uchar str3[16]="暂时未成功";

void write1302_byte(uchar dat);//写数据
void write1302(uchar add,uchar dat);//写地址和写数据
read1302(uchar add);//读数据
void set_rtc(void);//初始化
void display_daan(void);
void write_com(uchar com);
void write_dat(uchar dat) ;
void delayms(uint x);
void display(void)
{
        uchar i;
        write_com(0x80);
        for(i=0;i<10;i++)
        {
                write_dat(str0[i]);
                delayms(5);
        }
}
void display1(void)
{
        uchar i;
        write_com(0x90);
        for(i=0;i<15;i++)
        {
                write_dat(str1[i]);
                delayms(5);
        }
}
void display2(void)
{
        uchar i;
        write_com(0x88);
        for(i=0;i<12;i++)
        {
                write_dat(str2[i]);
                delayms(5);
        }
}
void display3(void)
{
        uchar i;
        write_com(0x98);
        for(i=0;i<10;i++)
        {
                write_dat(str3[i]);
                delayms(5);
        }
}
void display_daan(void)
{
        display();
        display1();
        display2();
        display3();
}
void delayms(uint x)
{
        uchar i,j;
        for(j=0;j<x;j++)
                for(i=0;i<110;i++);        //延时x秒
}
void write_com(uchar com)        //写指令
{
        lcdrs=0;
        lcdrw=0;
        lcde=0;
        P2=com;
        delayms(5);
        lcde=1;
        delayms(5);
        lcde=0;
}
void write_dat(uchar dat)        //写数据
{
        lcdrs=1;
        lcdrw=0;
        lcde=0;
        P2=dat;
        delayms(5);
        lcde=1;
        delayms(5);
        lcde=0;
}
void lcd_init()           //初始化
{
        lcdpsb=1;
        write_com(0x30);
        delayms(5);
        write_com(0x0c);
        delayms(5);
        write_com(0x01);
        delayms(5);
}
void write1302_byte(uchar dat)//写数据
{
        uchar i;
        for(i=0;i<8;i++)
        {
                sclk=0;
                io=dat&0x01;
                dat=dat>>1;
                sclk=1;
        }      
}
void write1302(uchar add,uchar dat)
{
        rst=0;
        _nop_();
                sclk=0;
            _nop_();
        rst=1;
        _nop_();
        write1302_byte(add);//写地址
        write1302_byte(dat);//写数据
        rst=0;               
}

read1302(uchar add)
{
        uchar i,value;
        rst=0;
        _nop_();
        sclk=0;
        _nop_();
        rst=1;
        _nop_();
        write1302_byte(add);
        for(i=0;i<8;i++)
        {
                value=value>>1;
                sclk=0;
                if(io)
                value=value|0x80;
                sclk=1;
                _nop_();        
        }
        rst=0;
        _nop_();
        sclk=0;
        _nop_();
        sclk=1;
        _nop_();
        io=0;
        _nop_();
        return value;//返回
}
void set_rtc()        //初始化
{
        uchar i,j;
        for(i=0;i<7;i++)
        {
                j=time_dat[i]/10;
                time_dat[i]=time_dat[i]%10;
                time_dat[i]=time_dat[i]+j*16;        
        }        
        write1302(0x8e,0x00); //去除写保护
        for(i=0;i<7;i++)
        {
                write1302(writedat[i],time_dat[i]);               
        }
        write1302(0x8e,0x80);//写保护
}
void read_str(void)
{
        uchar i;
        for(i=0;i<7;i++)
        {
                time_dat[i]=read1302(read_dat[i]);
        }
}

void main()
{
        set_rtc();
        delayms(50);
        lcd_init();
        delayms(50);
        while(1)
        {
        read_str();
        str0[2]=table[time_dat[0]/10];
        str0[3]=table[time_dat[0]%10];
        str0[6]=table[time_dat[2]/10];
        str0[7]=table[time_dat[2]%10];
        str0[9]=table[time_dat[3]/10];
        str0[10]=table[time_dat[3]%10];
        str1[1]=table[time_dat[4]/10];
        str1[2]=table[time_dat[4]%10];
        str1[4]=table[time_dat[5]/10];
        str1[5]=table[time_dat[5]%10];
        str1[7]=table[time_dat[6]/10];
        str1[8]=table[time_dat[6]%10];
        str1[14]=table1[(time_dat[1]-1)*2-1];
        str1[15]=table1[(time_dat[1]-1)*2]  ;
        display_daan();
        }
}
我改了下程序,能显示。时间,日期都不对了。

1302的驱动程序没有问题,读进去的时间有问题。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top