打印
[AVR单片机]

电工常识之(5):用AVRGCC 编写的8字节16进制转十进制程序

[复制链接]
4992|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xuyiyi|  楼主 | 2010-8-15 08:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看到某网友发了个贴子,详见:
[PIC 单片机] 主题:求救啊 8字节16进制转十进制 大侠们给看看啊 搞不出来了


由于飞船大力推广AVR汇编,要将本论坛打造成最强单片机“汇编”与“C”的混编论坛,让世人重新定位8位单片机---> AVR


俺响应飞船斑竹的号召,试用AVR汇编指令编写了这个8字节16进制数转10字节十进制数程序。

详见:
[AVR 单片机] 主题:电工常识之(4):用AVR汇编 编写的8字节16进制转十进制程序


5楼:粉丝大虾提出宝贵意见,认为汇编只是一些让人摸不着头脑的代码。


俺根据粉丝大虾的建议,改用AVRGCC写了一个功能相同的8字节16进制数转10字节十进制数程序。

请粉丝大虾多提点意见,谢谢!
评分
参与人数 1威望 +1 收起 理由
123jj + 1

相关帖子

来自 2楼
xuyiyi|  楼主 | 2010-8-15 08:45 | 只看该作者
/*-------------------------------------------------------------
;
;
;         无符号8字节十六进制数转换成10字节十进制数
;
;
;
;     输入:unsigned char a[8](高在先,8字节十六进制数)
;
;     输出:unsigned char b[10](高在先,10字节十进制数)
;
;
;
;
;
;        作者:许意义
;
;        版本:Ver 1.0.0
;
;        日期:2010年8月15日
;
;------------------------------------------------------------- */


//  测试常量定义
unsigned char a[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
//unsigned char a[]={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
//unsigned char a[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};

unsigned char b[10];

使用特权

评论回复
来自 3楼
xuyiyi|  楼主 | 2010-8-15 08:48 | 只看该作者
// ---------------------------------------
//
//        十进制数左移并调整子函数
//
// ---------------------------------------

char bcd2(unsigned char i,unsigned char Cy)
{  unsigned int m;

   m = (unsigned int)b[i];
   m = (m << 1) + (unsigned int)Cy;      // 十进制数左移并调整

   if((m & 0x1f) >= 10)    m += (0x10 - 10);
   if(((m & 0x1f0) >> 4) >= 10)    m += ((0x10 - 10) << 4);
   b[i]  = (unsigned char)(m & 0xff);
   Cy = (unsigned char)(m >> 8);
   return(Cy);
}

使用特权

评论回复
来自 4楼
xuyiyi|  楼主 | 2010-8-15 08:49 | 只看该作者
// -----------------------------------------------------------
//
//        无符号8字节十六进制数转换成10字节十进制数子函数
//
// -----------------------------------------------------------

void conv10(void)
{  unsigned char i,j,k,n;
   for (i = 10; i != 0; i--)
     {
        b[i-1] = 0;                 // 十进制数存储区预清除
     }

   for (n = 64; n != 0; n--)
     {      
        for (i = 8, j = 0; i != 0; i--)
          {  k = (a[i-1] >> 7);     // 二进制数整体左移一位
             a[i-1] <<= 1;
             a[i-1] |= j;
             j = k & 0x01;
          }   

        for (i = 10; i != 0; i--)
          {  j = bcd2(i-1,j);       // 十进制数左移并调整
          }   
     }
}

使用特权

评论回复
5
xuyiyi|  楼主 | 2010-8-15 08:51 | 只看该作者
// ------------------------------------------
//
//        测试主程序
//
// ------------------------------------------

int main(void)
{
  conv10();
  while(1);
}

使用特权

评论回复
6
xuyiyi|  楼主 | 2010-8-15 08:52 | 只看该作者
------如何用AVRGCC 编写一个8字节16进制数 转 10字节十进制数 程序------

------连载完毕,谢谢关注------

使用特权

评论回复
7
123jj| | 2010-8-15 09:03 | 只看该作者
帮顶!

使用特权

评论回复
8
李冬发| | 2010-8-15 16:55 | 只看该作者
弄了半天,也没看到飞船在飞船。
怎么跟阿三一样的,只说不练。

使用特权

评论回复
9
oloyu| | 2010-8-16 15:47 | 只看该作者
for (i = 8, j = 0; i != 0; i--)
          {  k = (a[i-1] >> 7);     // 二进制数整体左移一位
             a[i-1] <<= 1;
             a[i-1] |= j;
             j = k & 0x01;
          }   
整体左移是否有问题,看不明白!

使用特权

评论回复
10
oloyu| | 2010-8-16 15:51 | 只看该作者
for (i = 8, j = 0; i != 0; i--)
          {  k = (a[8-i] >> 7);     // 二进制数整体左移一位
             a[8-i] <<= 1;
             a[8-i] |= j;
             j = k & 0x01;
          }   
是否应该是这样,本比较菜,学习中

使用特权

评论回复
11
xuyiyi|  楼主 | 2010-8-16 15:56 | 只看该作者
回LS, 本程序经过测试,应该没问题。

for (i = 8, j = 0; i != 0; i--)       // 二进制数整体左移一位
          {  k = (a[i-1] >> 7);      // 取当前字节最高位(进位)
             a[i-1] <<= 1;             // 当前字节二进制数左移一位
             a[i-1] |= j;                 // 合并上一字节进位j(移出最高位)至最低位
             j = k & 0x01;            // 进位(移出的最高位)存变量j中
          }

使用特权

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

本版积分规则

55

主题

2448

帖子

6

粉丝