2017-2018-1 20155232 嵌入式C语言——时钟

时间:2023-01-29 19:25:21

2017-2018-1 20155232 嵌入式C语言——时钟

任务:

在作业本上完成附图作业,要认真看题目要求。
提交作业截图
作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清零)
2017-2018-1 20155232 嵌入式C语言——时钟

课上提交:

2017-2018-1 20155232 嵌入式C语言——时钟

出错分析:

主要是因为没有分析透彻,只是一味的照搬课上讲的内容,没有搞清楚,把移位的位数搞错了。而且没有写完整,例如宏的定义等。

基础知识

提取位(以分钟为例)
2017-2018-1 20155232 嵌入式C语言——时钟

插入位
2017-2018-1 20155232 嵌入式C语言——时钟

课上正确代码

#define TIME_Addr  0xFFFFC0000
#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;
    return (time>>11) & 0x1F;
}
  • 提取小时:原理和设置、提取分钟一样,只不过这里的0X3F变为0X1F,因为小时只有五位。还需要设置一个地址宏的定义。
  • 在get的过程中,我们需要将除了hour以外的部分清零,所以先将hour右移11位,即0000000000011111与0X1F作“与运算”,剩下的正好是我们需要的值。

  • 在嵌入式开发中,我们需要对寄存器进行写入,读出等等操作。每个寄存器都有自己固有的地址,所以我们需要通过C语言访问这些地址。

#define Time_Addr 0xFFFFC0000;

#define Time   *(volatile  int *)(Time_Addr+2)

课下练习

  • 设置、提取秒,此时无需右移。
#define TIME_Addr  0xFFFFC0000
#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;
    return time & 0x1F;
}