📄 一个字节位颠倒.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 + -