2017-2018-1 20155202 张旭 嵌入式C语言——时钟提取时分秒

2017-2018-1 20155202 张旭 嵌入式C语言——时钟提取时分秒

任务要求:

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

  • 提交作业截图

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

题目解答

  • 提取位(以分钟为例)
  • 插入位(以分钟为例)

定义地址

#define DATA_Addr 0x0C00000
#define DATA *(volatile int *)(DATA_Addr)
DATA = 0x1234;
位运算有以下规律:
&0 --> 清零
&1 --> 不变
|1 --> 置1
|0 --> 不变
分钟占6位,故将时间右移6位,这时我们要将它提取出来,故要将每位&1,即&0x3F。

设置、提取小时和秒原理和设置、提取分钟一样,只不过这里的0X3F变为0X1F,因为小时只有五位。

提取操作分钟代码

#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;
}
设置、提取秒,无需右移。
#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;
}
提取小时
#define Time_Addr 0xFFFFC0000 //实时钟芯片的IO映像基址是OxFFFFC0000
#define TIME *(volatile int *)(Time_Addr+2) //时间存放在基址+2的寄存器中
int getHours() 
{
int time=TIME;
return (time>>11)&0x1F;
}
插入小时
#define Time_Addr 0xFFFFC0000 //实时钟芯片的IO映像基址是OxFFFFC0000
#define TIME *(volatile int *)(Time_Addr+2) //时间存放在基址+2的寄存器中
void SetHours(int hours) 
{
    int oldtime=TIME;
    int newtime;
    newtime=oldtime&~(0x1F<<11);
    newtime|=(hours&0x1F)<<11;
    TIME=newtime;

}

最终综合代码如下:

#define Time_Addr 0xFFFFC0000 //实时钟芯片的IO映像基址是OxFFFFC0000
#define TIME *(volatile int *)(Time_Addr+2) //时间存放在基址+2的寄存器中
void SetHours(int hours) //插入Hours
{
    int oldtime=TIME;
    int newtime;
    newtime=oldtime&~(0x1F<<11);
    newtime|=(hours&0x1F)<<11;
    TIME=newtime;

}
int getHours() //取出Hours
{
    int time=TIME;
    return (time>>11)&0x1F;
}

void SetMinutes(int minutes) //插入Minutes
{
    int oldtime=TIME;
    int newtime;
    newtime=oldtime&~(0x3F<<5);
    newtime|=(minutes&0x3F)<<5;
    TIME=newtime;

}
int getMinutes() //取出Minutes
{
    int time=TIME;
    return (time>>5)&0x3F;
}

void SetSeconds(int seconds) //插入Seconds
{
    int oldtime=TIME;
    int newtime;
    newtime=oldtime&~0x1F;
    newtime|=(seconds/2)&0x1F;
    TIME=newtime;

}
int getSeconds() //取出Seconds
{
    int time=TIME;
    return (time&0x1F)*2; //此处不考虑Seconds除2带来的误差,因此直接乘2
}
posted @ 2018-01-04 21:13  20155202张旭  阅读(450)  评论(0编辑  收藏  举报