20155302十六周课上实践

课上未完成作业补交(嵌入式C语言)

题目要求

在作业本上完成附图作业,要认真看题目要求。

提交作业截图

作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清零)
20155302十六周课上实践_第1张图片

知识储备

嵌入式C语言中的位的提取与插入

1.提取位

20155302十六周课上实践_第2张图片

以课上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.插入位

20155302十六周课上实践_第3张图片

以课上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 ;
}

你可能感兴趣的:(20155302十六周课上实践)