实验内容
实验思路
- 用uint16_t型(16位)指针time指向该16位寄存器,作为读取和修改寄存器值的通道;
- 定义一个名为timeOp的位域,结构如下,存储从寄存器中读取的值,修改操作在该位域上进行,修改后的值返回至寄存器中。
实验代码
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;
}
附加
同理,对于寄存器中minutes、seconds的修改和读取,也可用同样的方法进行操作,函数如下:
minutes
/*
* 函数功能:修改寄存器中的Minutes部分的值
* 实现方法:修改timeOp位域中Minutes的值,将位域的值利用time指针,传至寄存器中
*/
void SetMinutes(int minutes)
{
timeOp.mintutes = minutes;
*time = (u16)timeOp; //通过强制转换的方式将值传给time指针,指针将值给寄存器
}
/*
* 函数功能:返回寄存器中Minutes部分的值
* 实现方法:将timeOp位域中minutes的值直接返回即可
*/
int getMinutes()
{
return timeOp.minutes;
}
seconds
/*
* 函数功能:修改寄存器中的Seconds部分的值
* 实现方法:修改timeOp位域中seconds的值,将位域的值利用time指针,传至寄存器中
*/
void SetSeconds(int seconds)
{
timeOp.seconds = seconds/2;
*time = (u16)timeOp; //通过强制转换的方式将值传给time指针,指针将值给寄存器
}
/*
* 函数功能:返回寄存器中Seconds部分的值
* 实现方法:将timeOp位域中seconds的值X2返回即可
*/
int getSeconds()
{
return timeOp.seconds*2;
}