把一些好的应用与大家分享一下

熊已出没 2014-04-21 12:56:15

/***********************************************************
****程序全称:数据高低位转换
****程序功能:1001010101011100=0011101010101001
****输 入: 要转换位数 要转换数据
****返 回:转换后的数据
***********************************************************/
int data_to_data(unsigned char num,unsigned int data)
{ //高低位..互换.
unsigned char i;
unsigned int m = 0;

for(i = 0;i<num;i++){
m= (m<<1)+(data&1);
data >>=1;
}
return(m);
}

/***********************************************************
****程序全称:数据高低位转换
****程序功能:10010101=10101001
****输 入: 要转换数据
****返 回:转换后的数据
***********************************************************/
uchar reverse_bit(uchar data)
{ //高低位..互换.
data=(data<<4)|(data>>4);
data=((data&0x33)<<2)|((data&0xCC)>>2);
data=((data&0x55)<<1)|((data&0xAA)>>1);
return data;
}
3,得到指定地址上的一个字节或字

#define MEM_B( x ) ( *( (byte *) (x) ) )

#define MEM_W( x ) ( *( (word *) (x) ) )

4,求最大值和最小值

#define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )

#define MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )

5,得到一个field在结构体(struct)中的偏移量

#define FPOS( type, field ) \

/*lint -e545 */ ( (dword) &(( type *) 0)-> field ) /*lint +e545 */

6,得到一个结构体中field所占用的字节数

#define FSIZ( type, field ) sizeof( ((type *) 0)->field )

7,按照LSB格式把两个字节转化为一个Word

#define FLIPW( ray ) ( (((word) (ray)[0]) * 256) + (ray)[1] )

8,按照LSB格式把一个Word转化为两个字节

#define FLOPW( ray, val ) \

(ray)[0] = ((val) / 256); \

(ray)[1] = ((val) & 0xFF)

9,得到一个变量的地址(word宽度)

#define B_PTR( var ) ( (byte *) (void *) &(var) )

#define W_PTR( var ) ( (word *) (void *) &(var) )

10,得到一个字的高位和低位字节

#define WORD_LO(xxx) ((byte) ((word)(xxx) & 255))

#define WORD_HI(xxx) ((byte) ((word)(xxx) >> 8))

11,返回一个比X大的最接近的8的倍数

#define RND8( x ) ((((x) + 7) / 8 ) * 8 )

12,将一个字母转换为大写

#define UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )

13,判断字符是不是10进值的数字

#define DECCHK( c ) ((c) >= '0' && (c) <= '9')

14,判断字符是不是16进值的数字

#define HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||\

((c) >= 'A' && (c) <= 'F') ||\

((c) >= 'a' && (c) <= 'f') )

15,防止溢出的一个方法

#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))

16,返回数组元素的个数

#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )

17,返回一个无符号数n尾的值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n)

#define MOD_BY_POWER_OF_TWO( val, mod_by ) \

( (dword)(val) & (dword)((mod_by)-1) )

/*****************************************************************************
**** Byte2BCD
****
****
*****************************************************************************/
uchar Byte2BCD(uchar Data)
{
uchar Rslt=0;

if (Data>=99) return 0x99;
while(Data>9)
{
Data-=10;
Rslt+=0x10;
}
return(Rslt+Data);
}

/*****************************************************************************
**** BCD2Byte
****
****
*****************************************************************************/
uchar BCD2Byte(uchar Data)
{
return(((Data>>4)&0x0f)*10+(Data&0x0f));
}
...全文
234 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
8月1992 2014-07-01
  • 打赏
  • 举报
回复
不错,感谢楼主
熊已出没 2014-05-08
  • 打赏
  • 举报
回复
再来一个: 异或”运算符(^)       异或运算符^又被称为XOR运算符。当参与运算的两个位相同(‘1’与‘1’或‘0’与‘0’)时结果为‘0’。不同时为‘1’。即相同为0,不同为1。       0^0=0; 0^1=1; 1^0=1;1^1=0; 例如:         a=0x55^0x3f; //a=(0b01010101)^(0b00111111)=(0b01101010)=0x6a 异或运算主要有以下几种应用:       1.翻转某一位          当一个位与‘1’作异或运算时结果就为此位翻转后的值。如下例: a=0x35; //a=0b00110101 a=a^0x0f; //a=0b00111010 a的低四位翻转          关于异或的这一作用,有一个典型的应用,即取浮点的相反数,具体的实现如下: f=1.23; //f为浮点型变量 值为1.23 f=f*-1; //f乘以-1,实现取其相反数,要进行一次乘运算 f=1.23; ((unsigned char *)&f)[0]^=0x80; //将浮点数f的符号位进行翻转实现取相反数 
vc8fans 2014-04-24
  • 打赏
  • 举报
回复
收集的不错。。。
Falcon7x 2014-04-23
  • 打赏
  • 举报
回复
感谢分享,还有吗?
mangoalx 2014-04-22
  • 打赏
  • 举报
回复
收下了,谢谢
palleexu 2014-04-22
  • 打赏
  • 举报
回复
这个是好东西,感谢分享!
zhxianbin 2014-04-22
  • 打赏
  • 举报
回复
顶!!!!!!!!!

27,509

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧