打印

有点液晶显示问题,很急

[复制链接]
1806|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
124563328|  楼主 | 2011-5-25 23:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
cosysunshine| | 2011-5-26 01:12 | 只看该作者
你自己的程序是怎么写的啊。。。。这肯定和你程序有关啊。。

使用特权

评论回复
板凳
124563328|  楼主 | 2011-5-26 09:07 | 只看该作者
2# cosysunshine
我把程序弄上来,你看下~~~
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

sbit io=P3^4;
sbit rst=P3^5;
sbit sck=P3^6;

uchar time_data[7]={11,1,4,25,11,39,30};                           //年周月日时分秒
uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};                   //写地址
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};                           //读地址
uchar disp[8];                                                                                                           //用来存放时分秒
uchar code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40
};
uchar code smg_we[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};

void delay(uint z)
{
        int x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

void write_ds1302_byte(uchar date)   //单字节的写操作
{
        uchar i;
        for(i=0;i<8;i++)
        {
                sck=0;         
                io=date&0x01;       //表明数字是从第一位开始传送的
                date=date>>1;
                sck=1;
        }       
}

void write_ds1302(uchar add,uchar date)                 //写多字节
{
        rst=0;_nop_();
        sck=0;_nop_();
        rst=1;_nop_();
        write_ds1302_byte(add);
        write_ds1302_byte(date);
        rst=0;_nop_();
        io=1;sck=1;               
}

uchar read_ds1302(uchar add)
{
    uchar i,value;
        rst=0;_nop_();
        sck=0;_nop_();
        rst=1;_nop_();
        write_ds1302_byte(add);
        for(i=0;i<8;i++)
        {
            value=value>>1;
                sck=0;
                if(io)
                value=value|0x08;
                sck=1;               
        }
        rst=0;_nop_();
        sck=0;_nop_();
        rst=1;io=1;
        return value;
}

void set_rtc()                                 //设置初始时间
{
        uchar i,j;
        for(i=0;i<7;i++)                     //转化为BCD码
        {
                j=time_data/10;                             //存储十位
                time_data=time_data%10;    //存储个位
                time_data=j*16+time_data;         //整合成十六进制数
        }
        write_ds1302(0x8e,0x00);                 //去除写保护
        for(i=0;i<7;i++)                                         //向ds1302中写保护数据
        {
                write_ds1302(write_add,time_data);
        }
        write_ds1302(0x8e,0x80);                 //加写保护
}
                                          
void read_rtc()                                     //读初始时间
{
    uchar i;
        for(i=0;i<7;i++)
        {
                time_data=read_ds1302(read_add);                                       
        }       
}

void time_pros()                                  
{
        disp[0]=time_data[4]%16;           //时个位
        disp[1]=time_data[4]/16;           //时十位
        disp[2]=10;
        disp[3]=time_data[5]%16;           //分个位
        disp[4]=time_data[5]/16;           //分十位
        disp[5]=10;
        disp[6]=time_data[6]%16;           //秒个位
        disp[7]=time_data[6]/16;           //秒十位       
}

void display()
{
        uchar i;
        for(i=0;i<8;i++)
        {          
                P2=smg_we;
                P0=smg_du[disp];
                delay(1);
        }
}

void main()
{
        set_rtc();
        while(1)
        {
                read_rtc();
                time_pros();
                display();
        }
}

使用特权

评论回复
地板
delin17| | 2011-5-26 09:22 | 只看该作者
P0=smg_du[disp[i]];

使用特权

评论回复
5
joyme| | 2011-5-26 09:25 | 只看该作者
for(i=0;i<7;i++)                     //转化为BCD码
        {
                j=time_data/10;                             //存储十位
                time_data=time_data%10;    //存储个位
                time_data=j*16+time_data;         //整合成十六进制数
        }
没有用到 i 变量,明显错了,timedata是个数组,你操作的是其起始地址,而不是数组的内容

使用特权

评论回复
6
124563328|  楼主 | 2011-5-26 21:38 | 只看该作者
5# joyme
我之前改过,没改过来,上传的时候没注意到,就是加上i了,也是那样的

使用特权

评论回复
7
124563328|  楼主 | 2011-5-26 21:39 | 只看该作者
4# delin17
不是的,我之前有改动过,加上i了也不行

使用特权

评论回复
8
124563328|  楼主 | 2011-5-26 21:42 | 只看该作者
5# joyme
我之前改过,没改过来,上传的时候没注意到,就是加上i了,也是那样的
124563328 发表于 2011-5-26 21:38

我再传一遍
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

sbit io=P3^4;
sbit rst=P3^5;
sbit sck=P3^6;

uchar time_data[7]={11,1,4,25,11,39,30};                           //年周月日时分秒
uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};                   //写地址
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};                           //读地址
uchar disp[8];                                                                                                           //用来存放时分秒
uchar code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40
};
uchar code smg_we[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};

void delay(uint z)
{
        int x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

void write_ds1302_byte(uchar date)   //单字节的写操作
{
        uchar i;
        for(i=0;i<8;i++)
        {
                sck=0;         
                io=date&0x01;       //表明数字是从第一位开始传送的
                date=date>>1;
                sck=1;
        }       
}

void write_ds1302(uchar add,uchar date)                 //写多字节
{
        rst=0;_nop_();
        sck=0;_nop_();
        rst=1;_nop_();
        write_ds1302_byte(add);
        write_ds1302_byte(date);
        rst=0;_nop_();
        io=1;sck=1;               
}

uchar read_ds1302(uchar add)
{
    uchar i,value;
        rst=0;_nop_();
        sck=0;_nop_();
        rst=1;_nop_();
        write_ds1302_byte(add);
        for(i=0;i<8;i++)
        {
            value=value>>1;
                sck=0;
                if(io)
                value=value|0x08;
                sck=1;               
        }
        rst=0;_nop_();
        sck=0;_nop_();
        rst=1;io=1;
        return value;
}

void set_rtc()                                 //设置初始时间
{
        uchar i,j;
        for(i=0;i<7;i++)                     //转化为BCD码
        {
                j=time_data/10;                             //存储十位
                time_data=time_data%10;    //存储个位
                time_data=j*16+time_data;         //整合成十六进制数
        }
        write_ds1302(0x8e,0x00);                 //去除写保护
        for(i=0;i<7;i++)                                         //向ds1302中写保护数据
        {
                write_ds1302(write_add,time_data);
        }
        write_ds1302(0x8e,0x80);                 //加写保护
}
                                          
void read_rtc()                                     //读初始时间
{
    uchar i;
        for(i=0;i<7;i++)
        {
                time_data=read_ds1302(read_add);                                       
        }       
}

void time_pros()                                  
{
        disp[0]=time_data[4]%16;           //时个位
        disp[1]=time_data[4]/16;           //时十位
        disp[2]=10;
        disp[3]=time_data[5]%16;           //分个位
        disp[4]=time_data[5]/16;           //分十位
        disp[5]=10;
        disp[6]=time_data[6]%16;           //秒个位
        disp[7]=time_data[6]/16;           //秒十位       
}

void display()
{
        uchar i;
        for(i=0;i<8;i++)
        {          
                P2=smg_we;
                P0=smg_du[disp];
                delay(1);
        }
}

void main()
{
        set_rtc();
        while(1)
        {
                read_rtc();
                time_pros();
                display();
        }
}

使用特权

评论回复
9
124563328|  楼主 | 2011-5-26 21:42 | 只看该作者
怎么会这样啊,在keil里面有数组的啊,传上去怎么没有了?????

使用特权

评论回复
10
delin17| | 2011-5-27 09:20 | 只看该作者
time_data=read_ds1302(read_add);                                       
这里也没i

使用特权

评论回复
11
delin17| | 2011-5-27 09:30 | 只看该作者
自己单步跟一下吧

使用特权

评论回复
12
joyme| | 2011-5-27 09:49 | 只看该作者
你有没有发现十位变化的频率怎么样?是不是十位显示了个位的内容,如果是你对调一下十位个位的显示位置就好了

使用特权

评论回复
13
124563328|  楼主 | 2011-5-27 14:05 | 只看该作者
12# joyme
不是的,十位变化频率还是自己的变化频率,不是个位的,而且个位一直显示是0,等到十秒后,十位依然是加一

使用特权

评论回复
14
joyme| | 2011-5-28 11:45 | 只看该作者
13楼: 12# joyme
不是的,十位变化频率还是自己的变化频率,不是个位的,而且个位一直显示是0,等到十秒后,十位依然是加一


那你可以对调个位和十位的位置来判断是读取到的数字个位就是0,还是显示部分出了问题。只能一步步排除差错了

使用特权

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

本版积分规则

0

主题

34

帖子

1

粉丝