20155229 2017-2018-1 《信息安全系统设计基础》18.1.3课上实践重做
嵌入式基础
题目
- 在作业本上完成附图作业,要认真看题目要求。
PPT上的知识
- 提取位
- 插入位
分析
- 定义基地址及时间存放的寄存器地址
#define TIME_Addr 0xFFFFC0000
#define TIME *(volatile int *) (TIME_Addr+2)
- 寄存器分为16bit,前5bit提供给
小时
,中间6bit提供给分
,后5比特提供给秒
sethours()
设置小时
时,需要先清空小时占用的位置,然后装入新的小时的数据
与1与保持
与0与得0
所以我们需要将0x1F左移11位再取反得到的旧时间,与旧时间按位于得到新时间。
再将设定的小时
左移11位和新的时间进行按位或得到最终时间。
void SetHours(int hours)
{
int oldtime = TIME;
int newtime = oldtime & ~ (0x1F << 11);//将小时清零,保留分钟与秒钟
newtime |= (hours & 0x1F) << 11;//设置小时时间
TIME = newtime;
}
gethours()
将分
和秒
所占的位给清空,所以将时间右移11位,然后与上0x1F。
int getHours()
{
int time=TIME;
return (time>>11)&0x1F;
}
提取设置分
和秒
的道理和小时
的差不多,不同的在于分
占6bit,以及左移右移时,分
和秒
的移位不同。
分
void SetMinutes(int minutes)
{
int oldtime=TIME;
int newtime;
newtime=oldtime&~(0x3F<<5);
newtime|=(minutes&0x3F)<<5;
TIME=newtime;
}
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;
}
int getSeconds()
{
int time=TIME;
return (time&0x1F)*2;