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

任务:

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

提交作业截图

作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清零)

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

课上提交:

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

出错分析:

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

基础知识

提取位(以分钟为例)

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

插入位

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

课上正确代码

#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;
}
05-11 13:42