导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→拜求格雷码转换二进制的汇编程序[ql2000]

 *第23756篇: 拜求格雷码转换二进制的汇编程序

  
楼 主:ql2000 2004年7月15日16:59
 拜求格雷码转换二进制的汇编程序
拜求格雷码转换二进制的汇编程序,是51系列的单片机,希望高手指点。
  
2楼:zglike 2004年7月15日21:50
 ASM的没有,你看这行吗?
*/
 
//#define test
#include   <stdio.h>  
#ifdef test
 #include   <time.h>  
#endif

/**
 *参考一下用吧,汇编难找啊
 * 二进制转换成格雷码
 * @param lStart lvalue所在区间下界
 * @param lEnd lvalue所在区间上界
 * @param lvalue 要转换的二进制数的实值
 * @return 返回格雷码对应的二进制数的实值
 * @see g2b() g2b 格雷码转换二进制
 * @see BtoG() BtoG 二进制转换格雷码
 * @see GtoB() BtoG 格雷码转换二进制
 * @author 黄毅
 * @useage a=b2g(0,15,4); //取得4所对应格雷码的二进制值 结果a等于6
 * @memo lvalue的值必须在区间[lStart,lEnd]里,否则无法求得所求结果.相应地,如果区间越小,求得结
 *       果所用的时间就越少.而且lStart,lEnd的值必须为2的N次方减1. 通常lStart为0.为了方便求得
 *       其值,建议使用BtoG()函数来进行操作.不过这样会使计算时间加长到原来的120%~180%.
 */
unsigned long b2g(unsigned long lStart,unsigned long lEnd,unsigned long lvalue)
{
 unsigned long Start=lStart,End=lEnd,Temp=0,Counter=0;
 bool Type=true;
 while(Start  <End)
  {
   Temp=(End+Start-1)>  >  1;
   if (lvalue  <=Temp)
   {
    if(!Type)
     Counter+=((End-Start+1)>  >  1);
    End=Temp;
    Type=true;
   }
   else
   {
    if(Type)
     Counter+=((End-Start+1)>  >  1);
    Start=++Temp;
    Type=false;
   }
  }
 return Counter;
}

/**
 * 格雷码转换成二进制
 * @param lStart lvalue对应二进制数所在区间下界
 * @param lEnd lvalue对应二进制数所在区间上界
 * @param lvalue 要转换的格雷码的实值
 * @return 返回二进制数对应的格雷码的实值
 * @see b2g() b2g 二进制转换格雷码
 * @see BtoG() BtoG 二进制转换格雷码
 * @see GtoB() BtoG 格雷码转换二进制
 * @author 黄毅
 * @useage a=b2g(0,15,6); //取得6所对应二进制值的格雷码 结果a等于4
 * @memo lvalue对应二进制数的值必须在区间[lStart,lEnd]里,否则无法求得所求结果.相应地,如果区
 *       间越小,求得结果所用的时间就越少.而且lStart,lEnd的值必须为2的N次方减1. 通常lStart为0.
 *       为了方便求得其值,建议使用GtoB()函数来进行操作.但会使计算时间加长到原来的105%~140%.
 */
unsigned long g2b(unsigned long lStart,unsigned long lEnd,unsigned long lvalue)
{
 unsigned long Start=lStart,End=lEnd,Counter=0,Temp=0;
 bool Type=true;
 while(Start  <End)
  {
   Temp=Counter+((End-Start+1)>  >  1);
   if(Type^(lvalue  <Temp))
   { 
    if(Type) Counter=Temp;
    Start=(Start+End+1)>  >  1;
    Type=false;
   }
   else
   {
    if(!Type) Counter=Temp;
    End=(Start+End-1)>  >  1;
    Type=true;
   }
  }
 return Start;
}
//b2g外壳程序,用来算lStart,lEnd;
long BtoG(unsigned long lvalue)
{
 register unsigned long lV=lvalue,lMax=1;
 while (lV>  0)
 {
  lV>  >  =1;
  lMax  <  <=1;
 }
 if (lMax==0) return -1;
 return b2g(0,--lMax,lvalue);
}
//g2b外壳程序
long GtoB(unsigned long lvalue)
{
 register unsigned long lV=lvalue,lMax=1;
 while (lV>  0)
 {
  lV>  >  =1;
  lMax  <  <=1;
 }
 if (lMax==0) return -1;
 return g2b(0,--lMax,lvalue);
}


main()
{
 long input=0;
#ifdef test
//程序测试部分
 clock_t cStart,cEnd;
 unsigned long dTime;
 cStart=clock();
 for (input=0;input  <9999999;input++)
  BtoG(32768);
 cEnd=clock();
 dTime=(cEnd-cStart);
 printf("BtoG: %ld / %ld\n",dTime,CLOCKS_PER_SEC);
//------------------------------------------------------
 cStart=clock();
 for (input=0;input  <9999999;input++)
  b2g(0,65535,32768);
 cEnd=clock();
 
 dTime=(cEnd-cStart);
 printf("b2g: %ld / %ld\n",dTime,CLOCKS_PER_SEC);
//------------------------------------------------------
 cStart=clock();
 for (input=0;input  <9999999;input++)
  GtoB(32768);
 cEnd=clock();
 dTime=(cEnd-cStart);
 printf("GtoB: %ld / %ld\n",dTime,CLOCKS_PER_SEC);
//------------------------------------------------------
 cStart=clock();
 for (input=0;input  <9999999;input++)
  g2b(0,65535,32768);
 cEnd=clock();
 dTime=(cEnd-cStart);
 printf("g2b: %ld / %ld\n",dTime,CLOCKS_PER_SEC);
#else
//程序演试部分
 printf("Input(HEX):");
 scanf("%x",&input);
 while (input!=-1)
 {
  printf("------BtoG------\nBinary:%08Xh\nGray  :%08Xh\n------GtoB------\nGray  :%08Xh\nBinary:%08Xh\n----------------\n",input,BtoG(input),input,GtoB(input));
  printf("Input(HEX):");
  scanf("%x",&input);
 }
#endif
}

  
3楼:cuittao 2004年7月17日16:10
 格雷码到二进制的转换符合一个公式运算,具体的我忘了,你找找看

>>>>>>对该主题发表你的看法

本主题贴数3,分页: [第1页]


[上一篇主题]:在做用2051配置FPGA,可是要用到串行存储器,现在被时序弄晕了头脑

[下一篇主题]:想知道2051配置FPGA的情况