1、头文件里面定义了P0,P1,P2,而没有定义位,所以,你的程序在开始时,就要进行位亮陵定义sbit,而不用对口进行定义。
2、在头文件里,明确的将P0到P2映射到对应的寄存器地址上,P0到P2就变成一个代号,也就是说,P0到P2已经登记在册,只要我们在文态拆件中使用它,编译器知道它指的是什么东西。以上是头文件为啥没敬闭戚有定义p0到p2寄存器里的位的原因。
位地址在汇编语言中,只能直接寻址,不支持间接寻址。那么,在 C 语言中,也就不能用指针来 *** 作。所以不能定义单片机的寄存器。
访问寄存器可以通过直接地址引用来完成。
例如52单片机的寄存器有4组,分滚绝别为00H-07H,08H-0FH,10H-17H,18H-1FH,各组均8字节,要结合程序状态字寄存器PSW(D0H)中的RS0,RS1的组合来确定是哪一组。
可以定义一个访问Rn的函数
typedef unsigned char ucharuchar dacRn(uchar n) //n=[0..7]
{
uchar data *p
n += (PSW & 0x18) //PSW 7:CY 6:AC 5:F0 4:RS1 3:RS0 2:OV 1:F1 0:P
//本来要誉升右移三位变为0-3,但由庆备老于是8个一组要乘以8(左移3位),所以直接加上寄存器编号就可以了
return *(uchar data *)n
}
一个一个渗咐回答你吧:1)
‘u’
的意义
-----无符号整形;
2)
(0*0x800u)
(1*0x800u)
等如何解释丛握纯-----ADC10CTL0是一个16位的寄存器,ADC10SHTx占
其中的Bit11
和
Bit12.
当
ADC10SHTx
为01(也就是
ADC10SHT_1)时,
ADC10CTL0寄存器的第11位为0,第12位为1,
此时整个寄存器的值就是
0x0800,
当
ADC10SHTx
为10(也就是
ADC10SHT_2)时,
ADC10CTL0寄存器的第11位为1,第12位为0,
此时整个寄存器的值就是
0x1000,也就是
把0x800左移了一位;
即
2*0x800
;
同理,可理解0*0x800u
和
3*0x800u;
3)
ADC10SHTx
的值决定皮腊
ADC10的采样和保持时间(sample-and-hold
time)。4
×
ADC10CLKs
意思是采样和保持时间为4个ADC时钟周期
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)