⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 一个字节位颠倒.txt

📁 c51的一个字节颠倒程序
💻 TXT
字号:
要把一个字节位颠倒,既0x80变为0x01,有两种方法 [龙啸九天] [831次] 01-3-24 下午 07:56:05
/*————————————————————
〖说明〗要把一个字节位颠倒,既0x80变为0x01,有两种方法:
uchar a,b;
b=upset(a); 或 b=UpsetChar[a];
一个代码小,但速度慢,一个代码大、但速度快。
〖文件〗upset.c  ﹫2001/03/23
〖作者〗龙啸九天 c51@yeah.net <a href=http://mcs51.yeah.net target=_blank>http://mcs51.yeah.net</a>
〖修改〗修改建议请到论坛公布 <a href=http://c51bbs.yeah.net target=_blank>http://c51bbs.yeah.net</a>
〖版本〗V1.00A Build 0323
—————————————————————*/

uchar code UpsetChar[]=
{
0x0,0x80,0x40,0xc0,0x20,0xa0,0x60,0xe0,0x10,0x90,0x50,0xd0,0x30,0xb0,0x70,0xf0,
0x8,0x88,0x48,0xc8,0x28,0xa8,0x68,0xe8,0x18,0x98,0x58,0xd8,0x38,0xb8,0x78,0xf8,
0x4,0x84,0x44,0xc4,0x24,0xa4,0x64,0xe4,0x14,0x94,0x54,0xd4,0x34,0xb4,0x74,0xf4,
0xc,0x8c,0x4c,0xcc,0x2c,0xac,0x6c,0xec,0x1c,0x9c,0x5c,0xdc,0x3c,0xbc,0x7c,0xfc,
0x2,0x82,0x42,0xc2,0x22,0xa2,0x62,0xe2,0x12,0x92,0x52,0xd2,0x32,0xb2,0x72,0xf2,
0xa,0x8a,0x4a,0xca,0x2a,0xaa,0x6a,0xea,0x1a,0x9a,0x5a,0xda,0x3a,0xba,0x7a,0xfa,
0x6,0x86,0x46,0xc6,0x26,0xa6,0x66,0xe6,0x16,0x96,0x56,0xd6,0x36,0xb6,0x76,0xf6,
0xe,0x8e,0x4e,0xce,0x2e,0xae,0x6e,0xee,0x1e,0x9e,0x5e,0xde,0x3e,0xbe,0x7e,0xfe,
0x1,0x81,0x41,0xc1,0x21,0xa1,0x61,0xe1,0x11,0x91,0x51,0xd1,0x31,0xb1,0x71,0xf1,
0x9,0x89,0x49,0xc9,0x29,0xa9,0x69,0xe9,0x19,0x99,0x59,0xd9,0x39,0xb9,0x79,0xf9,
0x5,0x85,0x45,0xc5,0x25,0xa5,0x65,0xe5,0x15,0x95,0x55,0xd5,0x35,0xb5,0x75,0xf5,
0xd,0x8d,0x4d,0xcd,0x2d,0xad,0x6d,0xed,0x1d,0x9d,0x5d,0xdd,0x3d,0xbd,0x7d,0xfd,
0x3,0x83,0x43,0xc3,0x23,0xa3,0x63,0xe3,0x13,0x93,0x53,0xd3,0x33,0xb3,0x73,0xf3,
0xb,0x8b,0x4b,0xcb,0x2b,0xab,0x6b,0xeb,0x1b,0x9b,0x5b,0xdb,0x3b,0xbb,0x7b,0xfb,
0x7,0x87,0x47,0xc7,0x27,0xa7,0x67,0xe7,0x17,0x97,0x57,0xd7,0x37,0xb7,0x77,0xf7,
0xf,0x8f,0x4f,0xcf,0x2f,0xaf,0x6f,0xef,0x1f,0x9f,0x5f,0xdf,0x3f,0xbf,0x7f,0xff,
};

/*----------------------------------------------------------------------------
调用方式:uchar upset(uchar b)
函数说明:upset()返回字节b的高低位对调后的值。
------------------------------------------------------------------------------*/
uchar upset(uchar b)
{
uchar data v1=0;
uchar data v2=0;
char data i;
uchar data j1=0x80;
uchar data j2=0x01;
for (i=7;i>=1;i=i-2)
{
v1=((b<<i)&j1)|v1;
v2=((b>>i)&j2)|v2;
j1>>=1;
j2<<=1;
}
return (v1|v2);
} 

一种折衷的办法,分高4位和低4位分别查表后交错合并,代码短速度快 [晓奇] [68次] 01-3-24 下午 09:03:06 

看俺的招,长度43,data 1,不可能有比俺再快的啦,嘻喜!!! [haotz] [271次] 01-3-24 下午 10:34:14 
C51 COMPILER V6.10  
TEST                                                                   
03/24/2001 22:28:18 PAGE 1   


C51 COMPILER V6.10, COMPILATION OF MODULE TEST
OBJECT MODULE PLACED IN .\test.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE .\test.c DEBUG OBJECTEXTEND 
CODE

stmt level    source

   1          
   2          #include"at89x52.h"
   3          bdata unsigned char b;
   4          sbit b0=b^0;
   5          sbit b1=b^1;
   6          sbit b2=b^2;
   7          sbit b3=b^3;
   8          sbit b4=b^4;
   9          sbit b5=b^5;
  10          sbit b6=b^6;
  11          sbit b7=b^7;
  12          //bit tmp;
  13          unsigned char un_down_rev(unsigned char ch);
  14          unsigned char un_down_rev(unsigned char ch)
  15          {
  16   1       b=ch;
  17   1      
  18   1       CY=b0;
  19   1       b0=b7;
  20   1       b7=CY; 
  21   1       
  22   1       CY=b1;
  23   1       b1=b6;
  24   1       b6=CY;
  25   1      
  26   1      
  27   1       CY=b2;
  28   1       b2=b5;
  29   1       b5=CY;
  30   1      
  31   1       CY=b3;
  32   1       b3=b4;
  33   1       b4=CY;
  34   1      return b;
  35   1      }
  36          void main(void)
  37          {
  38   1       unsigned char i;
  39   1      
  40   1       i=un_down_rev(0x0f);
  41   1      }
C51 COMPILER V6.10  
TEST                                                                   
03/24/2001 22:28:18 PAGE 2   

ASSEMBLY LISTING OF GENERATED OBJECT CODE


             ; FUNCTION _un_down_rev (BEGIN)
;---- Variable 'ch' assigned to Register 'R7' ----
                                           ; SOURCE LINE # 14
                                           ; SOURCE LINE # 15
                                           ; SOURCE LINE # 16
0000 8F00        R     MOV     b,R7
                                           ; SOURCE LINE # 18
0002 A200        R     MOV     C,b0
                                           ; SOURCE LINE # 19
0004 A200        R     MOV     C,b7
0006 9200        R     MOV     b0,C
                                           ; SOURCE LINE # 20
0008 9200        R     MOV     b7,C
                                           ; SOURCE LINE # 22
000A A200        R     MOV     C,b1
                                           ; SOURCE LINE # 23
000C A200        R     MOV     C,b6
000E 9200        R     MOV     b1,C
                                           ; SOURCE LINE # 24
0010 9200        R     MOV     b6,C
                                           ; SOURCE LINE # 27
0012 A200        R     MOV     C,b2
                                           ; SOURCE LINE # 28
0014 A200        R     MOV     C,b5
0016 9200        R     MOV     b2,C
                                           ; SOURCE LINE # 29
0018 9200        R     MOV     b5,C
                                           ; SOURCE LINE # 31
001A A200        R     MOV     C,b3
                                           ; SOURCE LINE # 32
001C A200        R     MOV     C,b4
001E 9200        R     MOV     b3,C
                                           ; SOURCE LINE # 33
0020 9200        R     MOV     b4,C
                                           ; SOURCE LINE # 34
                                           ; SOURCE LINE # 35
0022         ?C0001:
0022 22                RET     
             ; FUNCTION _un_down_rev (END)

             ; FUNCTION main (BEGIN)
                                           ; SOURCE LINE # 36
                                           ; SOURCE LINE # 37
                                           ; SOURCE LINE # 40
0000 7F0F              MOV     R7,#0FH
0002 120000      R     LCALL   _un_down_rev
0005 8F00        R     MOV     i,R7
                                           ; SOURCE LINE # 41
0007 22                RET     
             ; FUNCTION main (END)



MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =     43    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1       1
C51 COMPILER V6.10  
TEST                                                                   
03/24/2001 22:28:18 PAGE 3   

   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S) 

讲长度,也许这个更短 :) [晓奇] [223次] 01-3-24 下午 11:47:03 
TURN:  CLR   C
       MOV   R0,#8
  TN1: RLC    A
       XCH    R1,A
       RRC    A
       XCH    A,R1
       DJNZ   RO,TN1
       MOV    A,R1
       RET 

连汇编也用上啦!,IFU [haotz] [44次] 01-3-25 上午 12:01:12 

请大家指点我写的,谢谢 [xinshou] [100次] 01-3-25 上午 11:29:02 
#include<stdio.h>
main()
{bdata unsigned char b;
   bdata unsigned char c;
   bdata unsigned char d;
   bdata unsigned char e;
   
   c=(b&F0)>>4;            //**把b和11110000 相与在右移4位/
   d=(b&0F)<<4;            //**把b和00001111相与在左移4位/
   e=c|d;
   printf("/n  b=%d" ,b);
   printf("/n  e=%d",e);
   } 

提意理解错啦 [晓奇] [28次] 01-3-25 上午 11:31:41 

折衷的办法 [晓奇] [107次] 01-3-25 上午 11:46:19 
turn:     push a
           anl a,#0fh
           mov       dptr,#tabl1
           movc     a,@a+dptr
           swap a
           mov r7,a
           pop       a
           swap     a
           anl        a,#0fh
           movc     a,@a+dptr
           orl a,r7
           ret
tabl1:   db   0h, 08h, 04h, 0ch,02h, 0ah, 06h, 0eh, 01h, 09h, 05h, 0dh, 
03h, 0bh, 07h, 0fh 

还有更短的。。。 [小师⊕] [187次] 01-3-26 下午 01:14:28 
   1          #include <reg52.h>
   2          
   3          sbit ACC0=ACC^0;
   4          sbit ACC1=ACC^1;
   5          sbit ACC2=ACC^2;
   6          sbit ACC3=ACC^3;
   7          sbit ACC4=ACC^4;
   8          sbit ACC5=ACC^5;
   9          sbit ACC6=ACC^6;
  10          sbit ACC7=ACC^7;
  11          
  12          unsigned char un_down_rev(unsigned char ch)
  13          {
  14   1       ACC=ch;
  15   1      
  16   1       CY=ACC7;
  17   1       ACC7=ACC0;
  18   1       ACC0=CY;
  19   1      
  20   1       CY=ACC6;
  21   1       ACC6=ACC1;
  22   1       ACC1=CY;
  23   1      
  24   1       CY=ACC5;
  25   1       ACC5=ACC2;
  26   1       ACC2=CY;
  27   1      
  28   1       CY=ACC4;
  29   1       ACC4=ACC3;
  30   1       ACC3=CY;
  31   1      
  32   1       return(ACC);
  33   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =     35    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.

把它写成宏就更短了。


你们早讲吗!!! [秋雨] [79次] 01-3-27 上午 08:57:47 
我前几天设计一个程序,就是不知道如何办,没办法只好在硬件上把A0和A7颠倒过来,好
帆人呀!!! 

haha [小师⊕] [17次] 01-3-27 15:50:52 

看看这个 [潞潞] [104次] 01-3-31 下午 01:51:14 
uchar upset(uchar dat)
{
      uchar data a=0;
      char data i;

      for (i=0;i<8;i++)
      {
              a = a>>1;
              dat = dat<<1;
              if(CY==1) {a = a|0x80};
       }
       return (a);
} 

我的这个程序比较好懂吧 [lier] [112次] 01-4-8 上午 06:17:41 
uchar upset(uchar dat) //用12345678代表dat的各个位
{
dat=(dat>>4)|(dat<<4); //dat变成56781234
dat=((dat&0xcc)>>2)|((dat&0x33)<<2);//dat=78563412
dat=((dat&0xaa)>>1)|((dat&0x55)<<1);//dat=87654321
return temp;
}


fft函数 [arlin_1978] [90次] 01-4-15 下午 03:40:56 
我有一个麻烦,用MSC96系列单片机编一个fft函数,是快速傅立叶变换
帮帮我
     谢谢 

高手赐教! [ljf.flame] [49次] 01-4-19 9:05:57 
小弟不才,对斑竹算法之第二个函数怎么也看不懂!函数中J1、V2的作用实在是探索不到~~
好像最后实现不了预期的功能?我就在想是不是斑竹有什么语句忘记写了,害的小弟玩命的
看,是不是要……?:P 

Admire Lier! [phoen] [17次] 01-5-9 下午 01:16:39 

巨人犯了一个比较原理性的错误,可以说这个程序测试也许通过了但是实际应用时可能会出错 [hdp] [32次] 01-5-30 12:59:34 

我也赞成将这个程序用汇编做成库函数供C调用 [hdp] [24次] 01-5-30 13:01:53 

测试结果可能正确,但应用是可能会出错,犯了原则错误 [hdp] [16次] 01-5-30 13:03:41 

我来说一下看法,希望大家看看 [hdp] [101次] 01-5-30 13:17:39 
51单片机,字节内高低四位交换,汇编中用一条指令就够了,但是由于C51编译器制造商没
有考虑到这条指令的处理方法,因此只好用其它的指令组合起来完成同样的功能,因此,如
果程序对效率要求不是太高,用C语言编程就可以了,但是如果效率要求非常高(实际上可
能性很小),建议用汇编做成库函数供C调用,简单又实用。不知大家认为怎么样?
另:有很多网友的程序中老用ACC、CY、B之类的东西,以为程序很巧妙的完成了,实际上是
犯了编译原理最基本的错误,希望大家仔细体会一下,不要再犯类似错误。 

大家一定要看一下,!!!!!!!!!!!!!!!!!!!!!!!!!!! [hdp] [40次] 01-5-30 13:20:13 

clx21 [clx21] [10次] 01-9-27 上午 10:00:04 
我运行这个程序,咋提示“require ANSI-STYLE protype”,请个大虾会诊,拜托
了!!!!!!!! 

我赞成 [clx21] [11次] 01-9-28 上午 11:40:41 
若用ACC,CY等会破坏程序的模块化结构。 

 
点击这里回复这篇贴子>>
_____________________________________________________________________________
Copyright?,C51BBS论坛 2000-2001 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -