|
楼主 |
发表于 2010-11-27 20:16:41
|
显示全部楼层
#define UTIL_BIN4(x) (uchar)((0##x & 01000)/64 + (0##x & 0100)/16 + (0##x & 010)/4 + (0##x & 1))
#define UTIL_BIN8(hi, lo) (uchar)(UTIL_BIN4(hi) * 16 + UTIL_BIN4(lo))
用的时候这样:
TCCR1A = UTIL_BIN8(1000, 0010);
=============
#define UTIL_ARG1(a, b) a
#define UTIL_ARG2(a, b) b
#define UTIL_CONCAT(a, b) a ## b
#define UTIL_CONCAT_EXPANDED(a, b) UTIL_CONCAT(a, b)
#define PORT_PIN_SET(pinspec) UTIL_CONCAT_EXPANDED(PORT, UTIL_ARG1(pinspec)) |= (1 << (UTIL_ARG2(pinspec)))
#define HWPIN_HVSP_SCI B, 3
用的时候这样:
PORT_PIN_SET(HWPIN_HVSP_SCI);
===================================
#define UTIL_CONCAT(a, b) a ## b
意思就是把a和b按照字面连接起来
比方说
UTIL_CONCAT(1001,0110) 实际上就是10010110
#define PORT_PIN_SET(pinspec) UTIL_CONCAT_EXPANDED(PORT, UTIL_ARG1(pinspec)) |= (1 << (UTIL_ARG2(pinspec)))
#define HWPIN_HVSP_SCI B, 3
PORT_PIN_SET(HWPIN_HVSP_SCI);
实际上就是 PORTB |= (1 << 3)
一种位操作的方法。
======================================
##在ANSIC标准中只能用在宏定义中,所以VC6会出错,而GCC不是标准的ANSIC,所以不出错也就不奇怪了
#define BIN(x) 0##x
Edit1->Text = BIN(x); // Edit1->Text = 010; // 八进制的10 = 十进制的8 |
|