题目:

嵌入式C语言——提取时分秒

相关知识点

提取位:

嵌入式C语言——提取时分秒

插入位

嵌入式C语言——提取时分秒

用宏定义定义地址

#define TIME_Addr 0xFFFFC0000
#define TIME *(volatile int *)(TIME_Addr+2)

分析

  • 时分秒分别占5位、6位、5位!
  • 0x3F写成二进制111111六位进行&操作(适用于分)
  • 0x1F写成二进制11111五位进行&操作(适用于时、秒)

提取小时

#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的寄存器中
int getMinutes() 
{
    int time=TIME;
    return (time>>5)&0x3F;
}

插入分钟

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

}

提取秒

#define Time_Addr 0xFFFFC0000 //实时钟芯片的IO映像基址是OxFFFFC0000
#define TIME *(volatile int *)(Time_Addr+2) //时间存放在基址+2的寄存器中
int getSeconds() 
{
    int time=TIME;
    return (time&0x1F)*2; //此处不考虑Seconds除2带来的误差,因此直接乘2
}

插入秒

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

}

相关文章:

  • 2021-09-11
  • 2021-05-22
  • 2021-12-15
  • 2021-10-24
  • 2021-08-06
  • 2021-09-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-11-02
  • 2022-01-04
  • 2021-09-29
  • 2022-12-23
  • 2021-11-29
  • 2021-10-16
  • 2022-12-23
相关资源
相似解决方案