课上未完成作业补交(嵌入式C语言)
题目要求
在作业本上完成附图作业,要认真看题目要求。
提交作业截图
作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清零)
知识储备
嵌入式C语言中的位的提取与插入
1.提取位
以课上PPT中老师所讲Minutes为例:
如图可见Seconds所占位是第0~第4bit(共5bit),而Minutes所占位是第5~第10bit(共6bit),Hours则是第11~第15bit(共5bit)。
做法解析:
由于Minutes在第五位开始,所以首先要把序列向右移动5位来使Minutes从第0位开始,再和0x3F
(0000 0000 0011 1111)做&运算,0x3F的选择原因是Minutes一共六位且已经移位到了0~5位所以
要&一个只有0~5位是1其他位都是0的序列,这样才能让从最低位开始的Minutes的结果全部保留下来,
而其他位上全部清空置0。
移位后结果:
&运算后结果:
而Hours与Seconds做法同理,都是要先将他们置于最低位然后&运算一个从最低位起1的个数与Hours和
Seconds长度相等的其他位为0的序列,将它们从最低位提取出来。(Hours:右移5位,&
(0000000000011111)Seconds:已处于最低位不需右移,直接&(0000000000011111))。
2.插入位
以课上PPT中老师所讲Minutes为例:
做法解析:
与提取位很相像,可以说是提取位的逆过程,首先将(0000 0000 0011 1111)向左移5位也就是移
回与原本Minutes相对应的位置,然后将其取反与原Minutes做&运算(目的是只删除原Minutes并
将其他位保留下来,就像一块模具,提取时用实物做了一个模具,现在用模具做回实物),这样原
Minutes就被删除了,然后用删除后的结果&0x3F最后再左移5位移回原处就好了。
删除:
插入:
头文件使用
#define TIME_Addr 0xFFFFC0000//实时钟芯片的IO映像基址是OxFFFFC0000
#define TIME *(volatile int *) (TIME_Addr+2)//时间存放在基址+2的寄存器中
代码实现
小时设置及提取
#define TIME_Addr 0xFFFFC0000//实时钟芯片的IO映像基址是OxFFFFC0000
#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 = newtime;
}
int getHours()
{
int time;
time = (time>>11) & 0x1F;
return time;
}
秒的设置及提取
#define TIME_Addr 0xFFFFC0000//实时钟芯片的IO映像基址是OxFFFFC0000
#define TIME *(volatile int *) (TIME_Addr+2)//时间存放在基址+2的寄存器中
void SetSeconds(int seconds)
{
int oldtime=TIME;
int newtime=oldtime&~0x1F;
newtime|=seconds&0x1F;
TIME=newtime;
}
int getSeconds()
{
int time;
time=time&0x1F;
return time ;
}