要求
代码思路
- 用uint16_t型(16位)指针time指向该16位寄存器,作为读取和修改寄存器值的通道;
- 定义一个名为timeOp的位域,结构如下,存储从寄存器中读取的值,修改操作在该位域上进行,修改后的值返回至寄存器中。
int getHours()
-
首先提取时间地址:时间存放在(基址+2)的16位寄存器中,定义一个时间宏存放地址;
-
根据结构图,Hours占5位,其地址与时间地址的偏移量为11,因此提取数值的时候将原数值右移11位;
-
右移后将数值与0x1F(00011111),将数值的低五位提取出来,也就是Hours。
void SetHours (int hours)
- 将原Hours置0;
- 将Hours左移11位,其他位为0,这样将左移后的Hours或上一步的时间后,就将Hours设置到新的时间中.
代码
typedef uint16_t u16; //16位
u16 *time;
time = OXFFFFC0000 + 2; //time指针指向该寄存器
struct{ //定义一个timeOp位域
unsigned seconds:5,
minutes: 6,
hours: 5;
}timeOp;
timeOp.hours = *time>>11; //利用time指针将寄存器中的值放至timeOp中
timeOp.minutes = (*time & 0X07E0)>>5;
timeOp.seconds = *time & 0X001F;
/*
* 函数功能:修改寄存器中的Hours部分的值
* 实现方法:修改timeOp位域中hours的值,将位域的值利用time指针,传至寄存器中
*/
void SetHours(int hours)
{
timeOp.hours = hours;
*time = (u16)timeOp; //通过强制转换的方式将值传给time指针,指针将值给寄存器
}
/*
* 函数功能:返回寄存器中hours部分的值
* 实现方法:将timeOp位域中hours的值直接返回即可
*/
int getHours()
{
return timeOp.hours;
}