在作业本上完成附图作业,要认真看题目要求。
提交作业截图
作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清零)
地址的定义
#define DATA_Addr 0x0C00000
#define DATA *(volatile int *)(DATA_Addr)
DATA = 0x1234;
分析:由于Seconds占5位,因此需要先右移5位将Minutes的最低位与位0对齐,再与(&)上3F(0000 0000 0011 1111)即可将6-15位全部清0从而取出Minutes的全部6位
假设Hours的5位全为A,Minutes的6位全为B,则:
00000 00000 111111
& ????? AAAAA BBBBBB
= 00000 00000 BBBBBB
提取Hours:
分析:由于Seconds占5位,Minutes占6位(共占11位),因此需要先右移11位将Hours的最低位与位0对齐,再与(&)上1F(0000 0000 0001 1111)即可将5-15位全部清0从而取出Hours的全部5位
假设Hours的5位全为C,Minutes的6位全为B,则:
00000 000000 11111
& ????? ?????? CCCCC
= 00000 000000 CCCCC
提取Seconds:
分析:由于Seconds占低5位,因此无需右移最低位即与位0对齐,只需与(&)上1F(0000 0000 0001 1111)即可将5-15位全部清0从而取出Seconds的全部5位
假设Seconds的5位全为A,Minutes的6位全为B,Hours的5位全为C,则:
00000 000000 11111
& CCCCC BBBBBB AAAAA
= 00000 000000 AAAAA
插入位(插入Minutes)
以课上的小时为例:
需要设置小时,首先需要将原来的小时清除,原来的小时有5位,故需要将前五位异或上零
newtime=oldtime&~(0x1F<<11);
还需要放置新的小时时间,将新的小时时间变为5位,然后放置到之前清空的五位上
newtime |= (hours & 0x1F) << 11;
获取小时时间时,直接取小时的五位然后输出即可。
Hours=time>>11)&0x1F;
return Hours;
整体代码如下
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;
}
还需要定义基地址和需要的寄存器地址。定义如下
#define Time_Addr 0xFFFFC0000 //定义基地址
#define Time *(volatile int *)(Time_Addr+2) //时间存放在基址+2的寄存器中
加做分钟和秒的实现
分钟位共六位,处于5——10位。
秒位共5位,处于0——4位。
实现过程同理与小时。
设置分钟和获取分钟
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;