题目要求
- 在作业本上完成附图作业,要认真看题目要求。
- 提交作业截图
- 作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清零)
错误原因:
我把SetHours()和getHours()没理解清楚,首先两者就搞混了。
关于
return (time>>11) & 0x1F;
,我写成了return (time>>11) & 0x3E;
我意识到hours需要的是右移11位之后,取它低5位,但是对于“五个1”这个问题,我居然理解成了"0x3E",也就是"0x00111110",事实上,应该是"0x00011111".
老师曾在课上讲到关于地址的定义问题:
- 地址的定义
#define DATA_Addr 0x0C00000
#define DATA *(volatile int *) DATA_Addr
DATA = 0x1234;
- 对应的,这题中时间存放在(基址+2)的16位寄存器中,定义一个时间宏存放地址。
#define DATA_Addr 0xFFFFC000
#define DATA *(volatile int *) DATA_Addr+2
- 提取时间的方法,老师的PPT中也有提及:
在本题中,根据结构图,Hours占5位,其地址与时间地址的偏移量为11,因此提取数值的时候将原数值右移11位,再将数值与0x1F(00011111),将数值的低五位提取出来,也就是Hours.
正确答案:
#define DATA_Addr 0xFFFFC000
#define DATA *(volatile int *) DATA_Addr+2
void SetHours(int hours)
{
int oldtime = TIME;
int newtime = oldtime & ~ (0x1F << 11);
newtime |= (hours & 0x1F) << 11;
TIME = newtime;
}
int getHours()
{
int time = TIME;
return (time>>11) & 0x1F;
}
附加题:分钟和秒的实现,同理可得:
分钟:
void SetMinutes(int minutes)
{
int oldtime=TIME;
int newtime;
newtime=oldtime&~(0x3F<<5); 1111是因为分钟是6位:第5-10位
newtime|=(minutes&0x3F)<<5;
TIME=newtime;
}
#define Time_Addr 0xFFFFC0000
#define Time *(volatile int *)(Time_Addr+2)
int getMinutes()
{
int time=TIME;
return (time>>5)&0x3F;
}
- 秒:
void SetSeconds(int seconds)
{
int oldtime=TIME;
int newtime;
newtime=oldtime&~0x1F;
newtime|=(seconds/2)&0x1F;
TIME=newtime;
}
#define Time_Addr 0xFFFFC0000
#define Time *(volatile int *)(Time_Addr+2)
int getSeconds()
{
int time=TIME;
return (time&0x1F)*2;