用单片机将十六进制转换成十进制用程序怎么做呀?
最近遇到一个要将EEProm中的数据读出来。是十六进制的,要转换成十进制的数据。送给LCD显示。现在不知道怎么办了! 用除法和取模的方法分别取个十百千位。 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); 楼上的MM,还用转换么,0x2AF5 就是等于 2*16*16*16 + 10*16*16 + 15*16 + 5
不知道你的“十六进制”是指什么,觉得没有必要,因为到LCD显示的时候还是要变换一下,直接显示即可
E2中的是BCD则不必转换
E2中的是十六进制则应该要十进制转BCD 转换ad后的AD值直接按一楼方法就可以了,确实没必要转换
在MCU看来16和10进制的数有区别吗?没有.只是楼主非要一个
16->10的,就写一个给他了,呵呵
如果转化的结果是BCD码要显示自然要取出高4位*10+低4位了:) 都是二进制数而已,写法不一样
直接x%10 ,x/10 想不到这年头竟然还有搞技术的MM。 呵呵.我也很难见到哦,看样子要转行了.:) MM们都转行了,这工作做起来就更没劲了。。。 恩,看来有必要去 变性注册一下,然后弄个大美人的ico :) 我要将十六进制转成十进制,再用十进制去查段码显示表,正好十进制可以对应十个段码0-9。所以十六进制必须转换成十进制。 uchar duanma={段码0,......}
...
....
x=0x25;
y=x%10;
display(duanma,1);//显示个位
y=(x/10)%10;
display(duanma,2);//显示十位
y=x/100;
display(duanma,3);//显示百位 楼主直接用16进制查表也是一样的。 这个MM还是很适合做技术地,呵呵 如果是一个字节当然好办,共有三个字节。汇编。 to ilymy :
呵呵,非要和你视频才觉得是我本人吗,虽然可以,但是总是觉得好象没必要,当然你可以这么做 :)
to 楼主:
不懂你的意思,你的意思是从eeprom取出一个范围在0~2的24次方-1之间的数据吗,而且用汇编实现?AVR汇编我不熟悉,没办法帮到你了 大姐您是人是y对我来说毫无意义
如果我说的话让您觉得不舒服,那我道歉 女子多了。做技术的。 越搞越糊涂 如果编程用的是C语言的话,“十六进制转换成十进制”就是多余的废话,你就把它当成10进制就行了。汇编语言编程另当别论。 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);
LCD_write_byte(0,Number);
}
const uint8_t Number[]={'0','1','2','3','4','5','6','7','8','9'};
看看吧,不知道合适不, 适合于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);
} 我做的一般不转换为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编辑过 回复【23楼】dicat
-----------------------------------------------------------------------
楼主有3字节或多字节16进制转BCD码的汇编程序么?
如有,可以发到我的邮箱么:awendey@sohu.com
谢谢。 网上多的是双字节转BCD 码的, 51汇编的, 自己改一下就得了。
那些说单片机不认识16进制10进制2进制的,我看是不懂单片机吧? 单片机里只有二进制,但显示却需要十进制,用汇编的话就需要自己写程序转换。 同样输入的10进制要转换为二进制。 不要把编译器的工作当成单片机的本领。 【2楼】 roseGirl 段颖美女正解! 数制只存在人脑里,对机器,什么数字都一样(编译器会全转成16进制。。)
只有显示的时候才用得着16转10进制,因为人要看10进制的东东。除10取余是标准做法。
16进制与10进制作四则混合运算得出的结果没有什么区别。 mark x%10 ,x/10 一群狼,这问题要是一男的问,不用说,一定会被比视得无地自容...........:) Mark mark mark 学习了明天继续研究。。 不明白有啥好纠结 我也觉得,如果这2问题是是男的问的,估计现在LZ早藏起来让了,被鄙视得无法出来了。。。。。。 23楼,Mark 好贴,mark一下~ x/16+x%16;
页:
[1]