打印
[51单片机]

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

[复制链接]
3679|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fsi091347|  楼主 | 2014-4-21 20:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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);

        }
               
}

相关帖子

沙发
专注于嵌入式| | 2014-4-21 21:52 | 只看该作者
你这样提问,没人会回答你的。:lol

使用特权

评论回复
板凳
WM~~~| | 2014-4-22 09:02 | 只看该作者
读忙程序呢?

使用特权

评论回复
地板
fsi091347|  楼主 | 2014-4-22 09:57 | 只看该作者
都写了啊

使用特权

评论回复
5
fsi091347|  楼主 | 2014-4-22 09:58 | 只看该作者
WM~~~ 发表于 2014-4-22 09:02
读忙程序呢?

写了啊

使用特权

评论回复
6
fsi091347|  楼主 | 2014-4-23 16:42 | 只看该作者
有人吗?

使用特权

评论回复
7
651927693| | 2014-4-24 00:57 | 只看该作者
友情帮顶。
给些建议。明确你的问题。出了问题学会调试,不会调试的话把你明确的问题告诉大家,大家说不定可以帮你。你这样贴一大段代码,大部分人都没什么兴趣的

使用特权

评论回复
8
fsi091347|  楼主 | 2014-4-24 20:02 | 只看该作者
专注于嵌入式 发表于 2014-4-21 21:52
你这样提问,没人会回答你的。

好吧

使用特权

评论回复
9
fsi091347|  楼主 | 2014-4-24 20:02 | 只看该作者
651927693 发表于 2014-4-24 00:57
友情帮顶。
给些建议。明确你的问题。出了问题学会调试,不会调试的话把你明确的问题告诉大家,大家说不定 ...

我不知道是不是1302初始化错了

使用特权

评论回复
10
df_flying| | 2014-4-24 20:29 | 只看该作者
给你一个调试思路把:先把12864显示调好,没问题了,再加1302~,记住在初始化LCD12864之后,紧跟着显示一句“1302显示实验”之类的“废话”,说明你的LCD没问题,然后在while(1)中,显示你的1302,最好还是整个ADD啥的自加一下显示出来,说明你的程序没有卡死,然后再检查你的1302的初始化之类的。51虽然在线仿真不容易,但是一步一步来,还是比较容易的~建议你还是看一下匈牙利命名规则~改进下代码编写风格吧~

使用特权

评论回复
11
jinxihexi| | 2014-4-25 08:56 | 只看该作者
你的显示程序好像有点不对,没有看到让12864显示的内容发出

使用特权

评论回复
12
fsi091347|  楼主 | 2014-4-25 13:04 | 只看该作者
12864显示能显示了,1302时间,日期都不对了。

使用特权

评论回复
13
fsi091347|  楼主 | 2014-4-25 13:05 | 只看该作者
df_flying 发表于 2014-4-24 20:29
给你一个调试思路把:先把12864显示调好,没问题了,再加1302~,记住在初始化LCD12864之后,紧跟着显示一句 ...

嗯,12864现在能写进去了,时间,日期都不对

使用特权

评论回复
14
fsi091347|  楼主 | 2014-4-25 13:05 | 只看该作者
df_flying 发表于 2014-4-24 20:29
给你一个调试思路把:先把12864显示调好,没问题了,再加1302~,记住在初始化LCD12864之后,紧跟着显示一句 ...

能显示了

使用特权

评论回复
15
fsi091347|  楼主 | 2014-4-25 13:06 | 只看该作者
df_flying 发表于 2014-4-24 20:29
给你一个调试思路把:先把12864显示调好,没问题了,再加1302~,记住在初始化LCD12864之后,紧跟着显示一句 ...

我直接用开发板做的,不是仿真

使用特权

评论回复
16
651927693| | 2014-4-25 19:35 | 只看该作者
那接着要确认到底是通信的过程出了问题,还是读相应的寄存器读错了,是所有的通信都错了,还是只是几个数据错了

使用特权

评论回复
17
fsi091347|  楼主 | 2014-4-25 23:02 | 只看该作者
651927693 发表于 2014-4-25 19:35
那接着要确认到底是通信的过程出了问题,还是读相应的寄存器读错了,是所有的通信都错了,还是只是几个数据 ...

怎么确认???

使用特权

评论回复
18
受不了了| | 2014-4-25 23:12 | 只看该作者
用点灯来监测程序是否依照你的意愿在跑

使用特权

评论回复
19
fsi091347|  楼主 | 2014-4-26 08:57 | 只看该作者
受不了了 发表于 2014-4-25 23:12
用点灯来监测程序是否依照你的意愿在跑

谢谢

使用特权

评论回复
20
fsi091347|  楼主 | 2014-4-26 10:03 | 只看该作者
651927693 发表于 2014-4-25 19:35
那接着要确认到底是通信的过程出了问题,还是读相应的寄存器读错了,是所有的通信都错了,还是只是几个数据 ...


1302的驱动程序没有问题,读进去的时间有问题,也就是几个数据错误

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

15

帖子

0

粉丝