PPT上的例子

  • 已知位运算规则为:

      &0 --> 清零
      &1 --> 不变
      |1 --> 置1
      |0 --> 不变
    
  • getMinutes部分

2017-2018-1 20155326信息安全系统设计基础》嵌入式C语言课上考试补交

由于Seconds是0-5位,因此先右移5位将Minutes的最低位与位0对齐,再与上0000 0000 0011 1111,即0x3F,可将6-15位全部清0,获得minuts部分。

  • SetMinutes部分

2017-2018-1 20155326信息安全系统设计基础》嵌入式C语言课上考试补交

  • 代码如下:

#define Time_Addr 0xFFFFC0000 //实时钟芯片的IO映像基址是OxFFFFC0000
#define TIME *(volatile int *)(Time_Addr+2) //时间存放在基址+2的寄存器中
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;
}

课上习题

2017-2018-1 20155326信息安全系统设计基础》嵌入式C语言课上考试补交

由于seconds和minutes占0-10位,要提取hours,则先将hour右移11位,hour有5位,再与上000000000000011111,即0X1F。

  • sethours部分

void setHours(int hours){
    int oldtime=TIME;
    newtime|=(oldtime&0X1F)<<11;
    TIME=newtime;    
}

  • getHours部分

int gethours()
{
    int time;
    time=TIME;
    return (time>>11&0X1F);
}

  • 代码如下:

#define Time_Addr 0XFFFFC0000
#define TIME *(volatile int*) (Time+2)
int gethours()
{
    int time;
    time=TIME;
    return (time>>11&0X1F);
}

void sethours(int hours){
    int oldtime=TIME;
    newtime|=(oldtime&0X1F)<<11;
    TIME=newtime;
    
}

课下扩展

由于second在最右部分,所以不用左移,只需与上000000000000011111,即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/2) & 0x1F;
    TIME = newtime;
}

int getSeconds()
{
    int time = TIME;
    return (time & 0x1F)*2;//此处不考虑Seconds除2带来的误差,因此直接乘2
}

相关文章:

  • 2021-11-14
  • 2021-09-29
  • 2021-07-23
  • 2021-06-29
  • 2022-03-02
  • 2021-12-30
  • 2021-06-24
  • 2021-11-22
猜你喜欢
  • 2021-06-11
  • 2021-12-03
  • 2021-06-25
  • 2022-02-16
  • 2021-08-18
  • 2022-01-04
  • 2021-05-18
相关资源
相似解决方案