20155228 2018-01-03 课堂测试:嵌入式基础

20155228 2018-01-03 课堂测试:嵌入式基础

题目和要求

  1. 在作业本上完成附图作业,要认真看题目要求。
  2. 提交作业截图
  3. 作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清零)

分析和设计

根据题意设置基地址和存放时间的寄存器的地址

#define Time_Addr 0xFFFFC0000 //定义基地址
#define Time *(volatile int *)(Time_Addr+2) //时间存放在基址+2的寄存器中

设置小时

寄存器中时间小时的数据放在第11-15位中,需要先清空小时的数据位第11-15位的数据,然后把新的数据放进去

0x1F是0000 0000 0001 1111左移11位得到1111 1000 0000 0000取反得到0000 01111 1111 1111
旧的时间xxxx xxxx xxxx xxxx和0000 01111 1111 1111进行按位与运算得到新的时间0000 0xxx xxxx xxxx
再将需要设定的小时数据左移11位和新的时间进行按位或运算得到新的时间

void SetHours(int hours)
{
    int oldtime=Time;
    int newtime=oldtime&~(0x1F<<11);
    newtime|=(hours&0x1F)<<11;
    Time=newtime;

}

获取小时

寄存器中时间小时的数据放在第11-15位中,需要将小时的数据位第11-15位保留,然后把其他位的数据清空

时间是xxxx xxxx xxxx xxxx右移11位得到0000 000x xxxx


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

设置分钟和获取分钟


void SetMinutes(int minutes) 
{
    int oldtime=TIME;
    int newtime;
    newtime=oldtime&~(0x3F<<5);//使用0x3F:0000 0011 1111是因为分钟是6位:第5-10位
    newtime|=(minutes&0x3F)<<5;
    TIME=newtime;

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

设置秒和获取秒


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

}
int getSeconds() 
{
    int time=TIME;
    return (time&0x1F)*2;
原文地址:https://www.cnblogs.com/besti20155228/p/8196670.html