打印

DS1302显示在1602上,显示的确实十六进制的。请问怎么转码?

[复制链接]
3016|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
肖恩till|  楼主 | 2012-12-15 20:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ui, TE, RS, ST, ck
程序:#include <reg51.h>
#include <intrins.h>

typedef unsigned char uint8;
typedef unsigned int  uint16;

sbit SCK = P3^5;
sbit SDA = P3^4;
sbit RST = P1^7;
sbit RS  = P1^0;
sbit RW  = P1^1;
sbit EN  = P1^5;
sbit BUSY= P0^7;

#define DS1302_W_ADDR 0x80
#define DS1302_R_ADDR 0x81

uint8 time[7]={00,1,11,14,12,16,12};

void delay(uint16 n)
{
            while(n--);
}
/*写一个字节*/
void w_ds1302_byte(uint8 dat)
{
     uint8 i;
         SCK = 0;
         for(i=0;i<8;i++)
         {
              SDA = dat & 0x01;
                  SCK =1;
                  dat>>=1;
                  SCK =0;
         }
}
/*读一个字节*/
uint8 r_ds1302_byte()
{
     uint8 i,dat =0;
         SCK =0;
         for(i=0;i<8;i++)
         {
              dat>>=1;
              if(SDA)
                       dat |=0x80;
                  SCK =1;
                  SCK =0;
         }
         return dat;
}

void reset_ds1302()
{     
         RST =0;
         SCK =0;
         RST =1;
}

void clear_ds1302_WP()
{
     reset_ds1302();
         RST =1;
         w_ds1302_byte(0x8e);
         w_ds1302_byte(0);
         SDA =0;
         RST =0;
}

void set_ds1302_WP()
{
     reset_ds1302();
         RST =1;
         w_ds1302_byte(0x8e);
         w_ds1302_byte(0x80);
         SDA =0;
         RST =0;
}
/*写入DS1302*/
void w_ds1302(uint8 addr,uint8 dat)
{
     reset_ds1302();
         RST =1;
         w_ds1302_byte(addr);
         w_ds1302_byte(dat);
         SDA =0;
         RST =0;
}

/*读出DS1302*/
uint8 r_ds1302(uint8 addr)
{
     uint8 temp;
     reset_ds1302();
         RST =1;
         w_ds1302_byte(addr);
         temp=r_ds1302_byte();
         SDA =0;
         RST =0;
         return temp;
}
/*设定时钟数据*/
void set_time(uint8 *timedata)
{
     uint8 i,tmp;
         for(i=0;i<7;i++)           //BCD
         {
             tmp =timedata[i]/10;
                 timedata[i]=timedata[i]%10;
                 timedata[i]=timedata[i]+tmp*16;
         }
         clear_ds1302_WP();
         tmp=DS1302_W_ADDR;
         for(i=0;i<7;i++)
         {
             w_ds1302(tmp,timedata[i]);
                 tmp +=2;
         }
         set_ds1302_WP();   
}
/*读时钟数据*/
void  read_time(uint8 *timedata)
{
     uint8 i,tmp;
         tmp =DS1302_R_ADDR;
         for(i=0;i<7;i++)
         {
             timedata[i] = r_ds1302(tmp);
                 tmp +=2;
         }
}

void wait()
{
     P0 =0xff;
         do
         {
              RS =0;
                  RW =1;
                  EN =0;
                  EN =1;
         }while(BUSY == 1);
         EN =0;
}
void w_dat(uint8 dat)
{
     wait();
         RS = 1;
         RW = 0;
         EN = 0;
         P0 = dat;
         EN = 1;
         EN = 0;
}
void w_cmd(uint8 dat)
{
     wait();
         RS = 0;
         RW = 0;
         EN = 0;
         P0 = dat;
         EN = 1;
         EN = 0;
}

void Init_LCD1602(void)
{
        w_cmd(0x38);  // 16*2显示,5*7点阵,8位数据接口
        w_cmd(0x0C);  // 显示器开、光标开、光标允许闪烁
        w_cmd(0x06);  // 文字不动,光标自动右移
        w_cmd(0x01);  // 清屏
}

main()
{
     set_time(&time);
         Init_LCD1602();
         while(1)
         {
              read_time(&time);
             w_cmd(0x80);w_dat(time[6]+'0');
                 w_cmd(0x82);w_dat('-');
                 w_cmd(0x83);w_dat(time[4]+'0');
                 w_cmd(0x85);w_dat('-');
                 w_cmd(0x86);w_dat(time[3]+'0');
          
                 w_cmd(0xc0);w_dat(time[2]+'0');
                 w_cmd(0xc2);w_dat(':');
                 w_cmd(0xc3);w_dat(time[1]+'0');
                 w_cmd(0xc5);w_dat(':');
                 w_cmd(0xc6);w_dat(time[0]+'0');
                 delay(10000);
         }
}

出来的结果列如:
B-B-D
A:B:E

相关帖子

沙发
cjmqgsx| | 2012-12-15 22:09 | 只看该作者
解不了

使用特权

评论回复
板凳
Juwaylee| | 2012-12-15 22:56 | 只看该作者
写进去是BCD,读出来也是BCD。写的时候转换了,读出来怎么不转换一下

使用特权

评论回复
地板
肖恩till|  楼主 | 2012-12-16 11:04 | 只看该作者
想在read_time(&time);之后转换的,可是一直都没试对,郁闷

使用特权

评论回复
5
Juwaylee| | 2012-12-16 15:23 | 只看该作者
肖恩till 发表于 2012-12-16 11:04
想在read_time(&time);之后转换的,可是一直都没试对,郁闷

还有个位十位要分别显示,一个萝卜坑是装不了两个萝卜滴

使用特权

评论回复
6
ningling_21| | 2012-12-16 15:40 | 只看该作者
十位:time[4]>>4
个位:time[4]&0x0f

使用特权

评论回复
7
肖恩till|  楼主 | 2012-12-16 21:13 | 只看该作者
楼上是这个意思么?
while(1)
         {
             read_time(&time);
                 for(i=0;i<7;i++)
                 {
                     tmp = time[i]&0x0f;
                         time[i]>>=4;
                         time[i] &= 0x0f;
                         time[i] =time[i]*10+tmp;
                 }
             w_cmd(0x80);w_dat(time[6]+'0');
                 w_cmd(0x82);w_dat('-');
                 w_cmd(0x83);w_dat(time[4]+'0');
                 w_cmd(0x85);w_dat('-');
                 w_cmd(0x86);w_dat(time[3]+'0');
可是还是不行那?

使用特权

评论回复
8
肖恩till|  楼主 | 2012-12-16 21:14 | 只看该作者
Juwaylee 发表于 2012-12-16 15:23
还有个位十位要分别显示,一个萝卜坑是装不了两个萝卜滴

那怎么办。能具体不?我是一个小菜鸟

使用特权

评论回复
9
东北小辉辉| | 2012-12-16 23:57 | 只看该作者
uchar BCD_Decimal(uchar bcd)//BCD 码转十进制函数,输入 BCD,返回十进制
{
    uchar Decimal;
    Decimal=bcd>>4;
    return(Decimal=Decimal*10+(bcd&=0x0f));
}
楼主我送你一个小函数,怎么样

使用特权

评论回复
10
coody| | 2012-12-17 10:15 | 只看该作者
DS1302是BCD码,这个要注意

使用特权

评论回复
11
肖恩till|  楼主 | 2012-12-17 12:27 | 只看该作者
东北小辉辉 发表于 2012-12-16 23:57
uchar BCD_Decimal(uchar bcd)//BCD 码转十进制函数,输入 BCD,返回十进制
{
    uchar Decimal;

你这个和我上面那个一样哪,出来的不是字母而是一些符号。。。有没有人写过类似的,我参考一下

使用特权

评论回复
12
肖恩till|  楼主 | 2012-12-17 12:27 | 只看该作者
coody 发表于 2012-12-17 10:15
DS1302是BCD码,这个要注意

嗯 知道

使用特权

评论回复
13
elec921| | 2012-12-17 12:37 | 只看该作者

高4位移到右边
低4位直接取

使用特权

评论回复
14
东北小辉辉| | 2012-12-17 12:47 | 只看该作者
肖恩till 发表于 2012-12-17 12:27
你这个和我上面那个一样哪,出来的不是字母而是一些符号。。。有没有人写过类似的,我参考一下 ...

我用的就是这个,显示很正常啊,怎么了?

使用特权

评论回复
15
Juwaylee| | 2012-12-17 15:53 | 只看该作者
Juwaylee 发表于 2012-12-16 15:23
还有个位十位要分别显示,一个萝卜坑是装不了两个萝卜滴

比如秒,你要这么显示
w_cmd(..);w_dat(time[0]/10+'0');
w_cmd(..);w_dat(time[0]%10+'0');

使用特权

评论回复
16
肖恩till|  楼主 | 2012-12-17 18:42 | 只看该作者
Juwaylee 发表于 2012-12-17 15:53
比如秒,你要这么显示
w_cmd(..);w_dat(time[0]/10+'0');
w_cmd(..);w_dat(time[0]%10+'0');

按照你说的,可以了,谢谢:handshake
谢谢楼上各位啦

使用特权

评论回复
17
Juwaylee| | 2012-12-17 18:50 | 只看该作者
肖恩till 发表于 2012-12-17 18:42
按照你说的,可以了,谢谢
谢谢楼上各位啦

继续努力哈

使用特权

评论回复
18
肖恩till|  楼主 | 2012-12-17 19:01 | 只看该作者
Juwaylee 发表于 2012-12-17 18:50
继续努力哈

呵呵

使用特权

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

本版积分规则

个人签名:一步一步,踩到顶点O(∩_∩)O~

3

主题

21

帖子

0

粉丝