发新帖我要提问
12
返回列表
打印

进制转换问题,希望高手详细分析下。

[复制链接]
楼主: lackan
手机看帖
扫描二维码
随时随地手机跟帖
21
楼主说的没错,这是十六进制转BCD码,也是二进制转BCD码。

使用特权

评论回复
22
lackan|  楼主 | 2011-4-6 03:42 | 只看该作者
这种低级错误都能犯,悲哀啊。。。
time* t;
get_time(t);

t是个指针,指向未知的内存空间。连数据放在哪都不知道那还写什么程序?前面的代码还用看吗?
time  t;
get_time(&t);
这么简单的东西连猪都知道。好好记 ...
sdpz 发表于 2011-4-5 20:41

感谢你的指导,我的程序能用了。不过我发现了一个很奇怪的现象,不知能否解释下?是不是uchar类型数据和uint数据的区别?

#include<reg51.h>
                #define uchar unsigned char
                #define uint unsigned int
                sbit ACC0=ACC^0;
                sbit ACC7=ACC^7;
                sbit led1=P0^4;
                sbit led2=P0^5;
                sbit rst=P2^0;
                sbit sclk=P2^1;
                sbit io=P2^2;
                void delay(uint m)
                {
                        uint i,j;
                        for(i=m;i>0;i--)
                                for(j=110;j>0;j--);
                }
                void display(uint num)
                {
                         uchar ge,shi;
                         shi=num/10;
                         ge=num%10;
                         P0=ge;
                            led1=1;
                         led2=0;
                         delay(10);
                         led2=1;
                         P0=shi;
                         led1=0;
                         delay(10);
                         led1=1;
                }
                typedef struct _time{
                        uchar sec;
                        uchar min;
                        uchar hour;
                        uchar day;
                        uchar mon;
                        uchar year;
                }time;
                void wr_byte(uchar d)
                {
                        uchar i; //(把这里改为uint i,显示就不正常了。)
                        ACC=d;
                        for(i=8;i>0;i--)
                        {
                                io=ACC0;
                                sclk=1;
                                sclk=0;
                                ACC=ACC>>1;
                                io=1;
                        }
                }
                uchar rd_byte(void)
                {
                    uchar i; //(这里和上面的现象一样)
                        for(i=8;i>0;i--)
                        {       
                                ACC=ACC>>1;
                                ACC7=io;
                                sclk=1;
                                sclk=0;
                                io=1;
                        }
                        return(ACC);
                }
                void write(uchar aadd,uchar adat)
                {
                        rst=0;
                        sclk=0;
                        rst=1;
                        wr_byte(aadd);
                        wr_byte(adat);
                        sclk=1;
                        rst=0;
                }
                uchar read(uchar aadd)
                {
                        uchar cdat;
                        rst=0;
                        sclk=0;
                        rst=1;
                        wr_byte(aadd);
                        cdat=rd_byte();
                        sclk=1;
                        rst=0;
                        return(cdat);
                }
                void set_time(uchar aadd,uchar val)
                {
                         write(0x8e,0x00);
                         write(aadd,((val/10)<<4|(val%10)));
                }
                void get_time(time *tim)
                {
                        uchar rd_dat;
                        rd_dat=read(0x81);
                        tim->sec=((rd_dat&0x70)>>4)*10 + (rd_dat&0x0F);
                        rd_dat=read(0x83);
                        tim->min=((rd_dat&0x70)>>4)*10 + (rd_dat&0x0F);
                        rd_dat=read(0x85);
                        tim->hour=((rd_dat&0x70)>>4)*10 + (rd_dat&0x0F);
                        rd_dat=read(0x87);
                        tim->day=((rd_dat&0x70)>>4)*10 + (rd_dat&0x0F);
                        rd_dat=read(0x89);
                        tim->mon=((rd_dat&0x70)>>4)*10 + (rd_dat&0x0F);
                        rd_dat=read(0x8d);
                        tim->year=((rd_dat&0x70)>>4)*10 + (rd_dat&0x0F);
                }
                void init(void)
                {
                        uchar sec;
                    sec=read(0x80);
                        if(sec&0x80)
                        set_time(0x80,0);
                        set_time(0x80,30);
                        set_time(0x82,59);
                        set_time(0x84,23);
                        set_time(0x86,26);  
                        set_time(0x88,5);  
                        set_time(0x8C,7);
                }
                void main()
                {
                        time t;
                    init();
                        get_time(&t);
                        while(1)
                        {
                        display(t.min);
                        }
                }

使用特权

评论回复
23
lackan|  楼主 | 2011-4-6 03:45 | 只看该作者
本帖最后由 lackan 于 2011-4-6 03:47 编辑

我认为i只是作为一个循环的变量而已啊,怎么会有这种区别呢?希望高手指点。。。今天我被这玩意折腾了一天了,才发现是这点不同导致芯片不能运行的。

使用特权

评论回复
24
ayb_ice| | 2011-4-6 08:29 | 只看该作者
就是转换成BCD码
比如99=0x63,现在用0x99来表示十进制的99

使用特权

评论回复
25
sdpz| | 2011-4-6 09:32 | 只看该作者
真是蛋疼。。。ACC这种东西就不要搬进C里面。先去掉再看结果吧。

使用特权

评论回复
26
lackan|  楼主 | 2011-4-6 13:42 | 只看该作者
本帖最后由 lackan 于 2011-4-6 13:49 编辑
真是蛋疼。。。ACC这种东西就不要搬进C里面。先去掉再看结果吧。
sdpz 发表于 2011-4-6 09:32

就是不用ACC实现是吧?那您能不能教我另一种方法啊?对于这个我暂时想不到好的方法。。。

使用特权

评论回复
27
lackan|  楼主 | 2011-4-7 21:26 | 只看该作者
请教不用ACC实现的方法。。。

使用特权

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

本版积分规则