2017-2018-1 20155306 《信息安全系统设计基础》嵌入式C语言———提取设置时分秒
要求:根据下图,完成对时分秒的设置和提取。
示例及思路分析:
思路分析:以分钟为例,根据位运算的规则,设置分钟,只需要将寄存器中分钟对应的5-10bit清零,再进行赋值即可。即按位与上0x3F左移5位的取反结果,再按位或上所赋分钟值按位与上0x3F并左移5位的结果,最后赋值给寄存器即可。
提取分钟,只需要将寄存器中分钟对应的5-10bit右移5位至0-5bit,再将0-5bit的值提取出来即可。即将右移5位,再与上0x3F的结果返回即可。
同样地,提取时钟、秒钟的思路也是如此。其中,需要注意两个问题:1.时钟和秒钟所占位均为5bit,需要灵活调整0x3F为0x1F;2.0-4bit是秒钟除以2的结果,再设置提取的编程实现时需要注意。
代码实现:
设置时
#define TIME_Addr 0xFFFFC000
#define TIME *(volatile int *)(TIME_Addr+2)//这里需要将地址+2
void SetHours(int hours)
{
int oldtime = TIME;
int newtime = oldtime & ~ (0x1F << 11);//将时钟清零,保留分钟与秒钟
newtime | = (hours & 0x1F) << 11;//设置时钟时间
TIME = time;//改变时间寄存器的值
}
提取时
#define TIME_Addr 0xFFFFC000
#define TIME *(volatile int *)(TIME_Addr+2)//这里需要将地址+2
int getHours()
{
int time = TIME;
return (time >> 11) & 0x1F;
}
设置分
#define TIME_Addr 0xFFFFC000
#define TIME *(volatile int *)(TIME_Addr+2)//这里需要将地址+2
void SetMinutes(int minutes)
{
int oldtime = TIME;
int newtime = oldtime & ~ (0x3F << 5);//将分钟清零,保留时钟与秒钟
newtime | = (minutes & 0x3F) << 5;//设置分钟时间
TIME = newtime;//改变时间寄存器的值
}
提取分
#define TIME_Addr 0xFFFFC000
#define TIME *(volatile int *)(TIME_Addr+2)//这里需要将地址+2
int getMinutes()
{
int time = TIME;
return (time >> 5) & 0x3F;
}
设置秒
#define TIME_Addr 0xFFFFC000
#define TIME *(volatile int *)(TIME_Addr+2)//这里需要将地址+2
void SetSeconds(int seconds)
{
int oldtime = TIME;
int newtime = oldtime & ~ 0x1F;//将秒钟清零,保留时钟与分钟
newtime | = (seconds / 2) & 0x1F;//设置秒钟时间
TIME = newtime;//改变时间寄存器的值
}
提取秒
#define TIME_Addr 0xFFFFC000
#define TIME *(volatile int *)(TIME_Addr+2)//这里需要将地址+2
int getSeconds()
{
int time = TIME;
return (time & 0x1F) * 2; //此处不考虑Seconds除2带来的误差,因此直接乘2
}