搜索
bottom↓
回复: 39

用单片机将十六进制转换成十进制用程序怎么做呀?

[复制链接]

出0入21汤圆

发表于 2007-7-13 10:32:47 | 显示全部楼层 |阅读模式
最近遇到一个要将EEProm中的数据读出来。是十六进制的,要转换成十进制的数据。送给LCD显示。现在不知道怎么办了!

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2007-7-13 10:39:34 | 显示全部楼层
用除法和取模的方法分别取个十百千位。

出0入0汤圆

发表于 2007-7-13 11:07:58 | 显示全部楼层
LCD 显示还要16转10吗,单片机可不问什么16 10 8 的,楼上正解,

楼主概念没有分不清哦,不过还是给你个16->10的,呵呵

下面是十六进制转十进制程序,原理是:例:十六进制的2AF5=十进制的5*16+F*16+A*16*16+2*16*16*16;******

   // unsigned char ret4,ret3,ret2,ret1;//定义位的值

    ret4=ret/0x1000;                   //取出千位的值,注意0x1000是个十六进制数

    ret=ret<<4;                       //ret变量左移四位

    ret3=ret/0x1000;                  //取出百位的值

    ret=ret<<4;

    ret2=ret/0x1000;                 //取出十位的值

    ret=ret<<4;

    ret1=ret/0x1000;                 //取出个位的值

    ret=ret1+ret2*16+ret3*16*16+ret4*16*16*16;//各位的值乘以位权,完成十六转十进制

        return(ret);

出0入0汤圆

发表于 2007-7-13 11:21:11 | 显示全部楼层
楼上的MM,还用转换么,0x2AF5 就是等于 2*16*16*16 + 10*16*16 + 15*16 + 5



不知道你的“十六进制”是指什么,觉得没有必要,因为到LCD显示的时候还是要变换一下,直接显示即可



E2中的是BCD则不必转换

E2中的是十六进制则应该要十进制转BCD

出0入0汤圆

发表于 2007-7-13 11:48:32 | 显示全部楼层
转换ad后的AD值直接按一楼方法就可以了,确实没必要转换

在MCU看来16和10进制的数有区别吗?没有.只是楼主非要一个

16->10的,就写一个给他了,呵呵

如果转化的结果是BCD码要显示自然要取出高4位*10+低4位了:)

出0入0汤圆

发表于 2007-7-13 11:48:43 | 显示全部楼层
都是二进制数而已,写法不一样

直接x%10 ,x/10

出0入0汤圆

发表于 2007-7-13 11:49:01 | 显示全部楼层
想不到这年头竟然还有搞技术的MM。

出0入0汤圆

发表于 2007-7-13 11:55:52 | 显示全部楼层
呵呵.我也很难见到哦,看样子要转行了.:)

出0入0汤圆

发表于 2007-7-13 12:02:55 | 显示全部楼层
MM们都转行了,这工作做起来就更没劲了。。。

出0入0汤圆

发表于 2007-7-13 12:05:21 | 显示全部楼层
恩,看来有必要去 变性注册一下,然后弄个大美人的ico

出0入0汤圆

发表于 2007-7-13 12:07:27 | 显示全部楼层
:)

出0入21汤圆

 楼主| 发表于 2007-7-13 12:15:20 | 显示全部楼层
我要将十六进制转成十进制,再用十进制去查段码显示表,正好十进制可以对应十个段码0-9。所以十六进制必须转换成十进制。

出0入0汤圆

发表于 2007-7-13 12:29:23 | 显示全部楼层
uchar duanma[10]={段码0,......}

...

....

x=0x25;





y=x%10;

display(duanma[y],1);//显示个位

y=(x/10)%10;

display(duanma[y],2);//显示十位

y=x/100;

display(duanma[y],3);//显示百位

出0入0汤圆

发表于 2007-7-13 12:30:57 | 显示全部楼层
楼主直接用16进制查表也是一样的。

出0入0汤圆

发表于 2007-7-13 12:40:52 | 显示全部楼层
这个MM还是很适合做技术地,呵呵

出0入21汤圆

 楼主| 发表于 2007-7-13 12:53:59 | 显示全部楼层
如果是一个字节当然好办,共有三个字节。汇编。

出0入0汤圆

发表于 2007-7-13 13:48:25 | 显示全部楼层
to ilymy :

呵呵,非要和你视频才觉得是我本人吗,虽然可以,但是总是觉得好象没必要,当然你可以这么做 :)



to 楼主:

不懂你的意思,你的意思是从eeprom取出一个范围在0~2的24次方-1之间的数据吗,而且用汇编实现?AVR汇编我不熟悉,没办法帮到你了

出0入0汤圆

发表于 2007-7-13 13:58:45 | 显示全部楼层
大姐您是人是y对我来说毫无意义

如果我说的话让您觉得不舒服,那我道歉

出0入0汤圆

发表于 2007-7-13 14:38:48 | 显示全部楼层
女子多了。做技术的。

出0入0汤圆

发表于 2007-7-13 15:03:17 | 显示全部楼层
越搞越糊涂

出0入0汤圆

发表于 2007-7-13 16:26:05 | 显示全部楼层
如果编程用的是C语言的话,“十六进制转换成十进制”就是多余的废话,你就把它当成10进制就行了。汇编语言编程另当别论。

出0入0汤圆

发表于 2007-7-13 19:02:02 | 显示全部楼层
void Display(uint8_t x, uint8_t y, uint8_t g_data)

{

        uint8_t temp_h,temp_l;

        temp_h = temp_l = g_data;

        temp_h &= 0xf0;

        temp_h >>= 4;

        temp_l &= 0x0f;

        LCD_set_xy(x,y);

        LCD_write_byte(0,Number[temp_h]);

        LCD_write_byte(0,Number[temp_l]);

}



const uint8_t Number[]={'0','1','2','3','4','5','6','7','8','9'};

看看吧,不知道合适不,

出0入4汤圆

发表于 2007-7-14 14:54:30 | 显示全部楼层
适合于9999以下的数据转换

unsigned int bcdda(unsigned int sbcd_data)

  {

   if((sbcd_data&0x0f)>9)

     {

     sbcd_data=sbcd_data+6;

     }

   if((sbcd_data&0x00f0)>0x90)

     {

     sbcd_data=sbcd_data+0x60;

     }

   if((sbcd_data&0x0f00)>0x0900)

     {

     sbcd_data=sbcd_data+0x600;

     }

   if((sbcd_data&0xf000)>0x9000)

     {

     sbcd_data=sbcd_data+0x6000;

     }

    return(sbcd_data);

  }

//------------------------------------------

unsigned int hextobcd (unsigned int hex_data)

  {

   unsigned int bcd_data;

   unsigned char temp;

   temp=hex_data&0x0f;

   if(temp>9)

     {

     bcd_data=temp+6;

         }

        else

         {

         bcd_data=temp;

         }

   temp=(hex_data>>4)&0x0f;

   for(;temp>0;temp--)

     {

          bcd_data=bcd_data+0x16;

      bcd_data=bcdda(bcd_data);

         }

   temp=(hex_data>>8)&0x0f;

   for(;temp>0;temp--)

     {

          bcd_data=bcd_data+0x256;

      bcd_data=bcdda(bcd_data);

         }

   temp=(hex_data>>12)&0x0f;

   for(;temp>0;temp--)

     {

          bcd_data=bcd_data+0x4096;

          bcd_data=bcdda(bcd_data);

         }

   return(bcd_data);

  }

出0入0汤圆

发表于 2007-7-14 17:04:31 | 显示全部楼层
我做的一般不转换为BCD码而是把这个十六进制转换为几个单独的数,一个百位,一个十位,一个个位,然后查段码去显示 %$^)& 用减法就行,浪费一点点临时寄存器而已,比除法,求模什么的空间时间都节约多了.

1: >=100? Y -100 百位+1 循环1

          N 下一步

2: >=10?  Y -10 十位+1  循环2

          N 结束,余数为个位





;------------------------------------

;BIN_TO_BCD_16 双字节十六进制数转换成BCD码

;待转换的数放在TEMP1:TEMP2中

;BCD码的个位放在TEMP1中

;BCD码的十位放在TEMP2中

;BCD码的百位放在TEMP3中

;BCD码的千位放在TEMP4中

;万位舍弃

;1000 --> 0x03 E8



;BIN_TO_BCD   单字节十六进制数转换成3位BCD码

;待转换的数放在TEMP中

;BCD码的个位放在TEMP1中

;BCD码的十位放在TEMP2中

;BCD码的百位放在TEMP3中

BIN_TO_BCD:

                MOV        TEMP1,TEMP

                CLR        TEMP2

                CLR        TEMP3

                RJMP        BIN_BW_NEXT

;--------------------------------------

BIN_TO_BCD_16:

                CLR        TEMP4

                CLR        TEMP3

BIN_WW_NEXT:

                CPI        TEMP1, low(10000)        ;待转换的数大于等于10000(0x2710)?

                LDI        TEMP, high(10000)

                CPC        TEMP2, TEMP

                BRCS        BIN_QW_NEXT

                SUBI        TEMP1, 0X10

                SBCI        TEMP2, 0X27

                RJMP        BIN_WW_NEXT



BIN_QW_NEXT:

                CPI        TEMP1, low(1000)        ;待转换的数大于等于1000(0x03E8)?

                LDI        TEMP, high(1000)

                CPC        TEMP2, TEMP

                BRCS        BIN_BW_NEXT

                SUBI        TEMP1, 0XE8

                SBCI        TEMP2, 0X03

                INC        TEMP4

                RJMP        BIN_QW_NEXT



BIN_BW_NEXT:

                CPI        TEMP1, 100        ;待转换的数大于等于100(0x0064)?

                CLR        TEMP

                CPC        TEMP2, TEMP

                BRCS        BIN_GW_NEXT

                SUBI        TEMP1, 100

                SBCI        TEMP2, 0

                INC        TEMP3

                RJMP        BIN_BW_NEXT



BIN_GW_NEXT:

                MOV        TEMP, TEMP1        ;待转换的数大于等于10?

                SUBI        TEMP, 10

                BRCS        BIN_RET

                MOV        TEMP1, TEMP

                INC        TEMP2

                RJMP        BIN_GW_NEXT

BIN_RET:

                RET

;------------------------------------

;只适合某些情况哦,需要用到十进制数的请绕道...
-----此内容被dicat于2007-07-14,17:07:04编辑过

出0入0汤圆

发表于 2010-4-15 21:13:42 | 显示全部楼层
回复【23楼】dicat
-----------------------------------------------------------------------

楼主有3字节或多字节16进制转BCD码的汇编程序么?
如有,可以发到我的邮箱么:awendey@sohu.com
谢谢。

出0入0汤圆

发表于 2010-4-15 21:18:29 | 显示全部楼层
网上多的是双字节转BCD 码的, 51汇编的, 自己改一下就得了。  

那些说单片机不认识16进制10进制2进制的,我看是不懂单片机吧? 单片机里只有二进制,但显示却需要十进制,用汇编的话就需要自己写程序转换。 同样输入的10进制要转换为二进制。 不要把编译器的工作当成单片机的本领。

出0入0汤圆

发表于 2010-4-23 09:23:14 | 显示全部楼层
【2楼】 roseGirl 段颖  美女正解!

出0入0汤圆

发表于 2010-4-23 09:34:39 | 显示全部楼层
数制只存在人脑里,对机器,什么数字都一样(编译器会全转成16进制。。)

只有显示的时候才用得着16转10进制,因为人要看10进制的东东。除10取余是标准做法。

16进制与10进制作四则混合运算得出的结果没有什么区别。

出0入0汤圆

发表于 2011-11-7 12:46:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-7 12:48:34 | 显示全部楼层
x%10 ,x/10

出0入0汤圆

发表于 2011-11-7 13:47:41 | 显示全部楼层
一群狼,这问题要是一男的问,不用说,一定会被比视得无地自容...........  :)

出0入0汤圆

发表于 2011-11-7 13:52:27 | 显示全部楼层
Mark

出0入0汤圆

发表于 2011-11-7 13:59:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-14 15:56:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-6-2 00:53:19 | 显示全部楼层
学习了  明天继续研究。。

出0入0汤圆

发表于 2012-6-2 01:01:07 | 显示全部楼层
不明白有啥好纠结

出0入10汤圆

发表于 2012-6-2 09:26:45 | 显示全部楼层
我也觉得,如果这2问题是是男的问的,估计现在LZ早藏起来让了,被鄙视得无法出来了。。。。。。

出0入0汤圆

发表于 2013-4-12 17:11:28 | 显示全部楼层
23楼,Mark

出0入0汤圆

发表于 2013-9-7 21:47:50 | 显示全部楼层
好贴,mark一下~

出0入0汤圆

发表于 2014-7-30 17:49:53 | 显示全部楼层
x/16+x%16;
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 17:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表