This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
const struct Element Right = {
.inputPxselRegister = (uint8_t *)&P1SEL,
.inputPxsel2Register = (uint8_t *)&P1SEL2,
}
不明白 (uint8_t *)&P1SEL 什么意思,&P1SEL取了P1SEL的地址,然后呢,怎么又定义了一个指针,这个指针到底是谁?
camus,
您好!
(uint8_t *)&P1SEL是P1SEL地址格式化,P1SEL是对应的寄存器,在头文件中定义如下:
#define P1SEL_ 0x0026 /* P1 功能选择寄存器*/
sfrb P1SEL = P1SEL_;
就是将0x0026传给 .inputPxselRegister。
关于sfrb的说明如下:
外围模块变量Sfrb、Sfrw也称作特殊功能寄存器变量,直接位于内部RAM单元。
Sfrb范围为:0X00---0XFF;
Sfrw范围为:0X100---0X1FF;
外围模块变量使符号名与此范围的字节或字相联系,该地址处寄存器可以符号化被寻址,但没有分配存储空间。
例如:
Sfrb P1IES = 0X24H; 字节是8位
Sfrb P1DIR = 0X22H;
Sfrw ADC12CTL1 = 0X01A2H 字是16位
经过定义后就可以直接通过对应的符号访问这些寄存器了。
PIDIR = 0X01;P1.0输出
希望对您有所帮助。
那&P1SEL是不是P1SEL对应的寄存器的地址,即0x0026 。那么.inputPxselRegister = &P1SEL, 就把地址传给 .inputPxselRegister .干嘛 有(uint8_t *)?
同意鸵鸟蝈蝈的说法。就相当于把Pin口的地址赋予通用型方式,主要是保证整个library的通用性。另外,我觉得也是减小代码空间的考虑。
inputPxselRegister的定义如下:
uint8_t *inputPxselRegister; // PinOsc: port selection address
uint8_t *inputPxsel2Register; // PinOsc: port selection 2 address
那么就需要强制转换P1SEL,减小一个byte空间。如果有多个按键,那么就能节省一部分空间。