zoukankan      html  css  js  c++  java
  • 2017-2018-1 20155306 《信息安全系统设计基础》嵌入式C语言———提取设置时分秒

    2017-2018-1 20155306 《信息安全系统设计基础》嵌入式C语言———提取设置时分秒

    要求:根据下图,完成对时分秒的设置和提取。

    示例及思路分析:


    思路分析:以分钟为例,根据位运算的规则,设置分钟,只需要将寄存器中分钟对应的5-10bit清零,再进行赋值即可。即按位与上0x3F左移5位的取反结果,再按位或上所赋分钟值按位与上0x3F并左移5位的结果,最后赋值给寄存器即可。

    提取分钟,只需要将寄存器中分钟对应的5-10bit右移5位至0-5bit,再将0-5bit的值提取出来即可。即将右移5位,再与上0x3F的结果返回即可。

    同样地,提取时钟、秒钟的思路也是如此。其中,需要注意两个问题:1.时钟和秒钟所占位均为5bit,需要灵活调整0x3F为0x1F;2.0-4bit是秒钟除以2的结果,再设置提取的编程实现时需要注意。

    代码实现:

    设置时

    #define TIME_Addr 0xFFFFC000
    #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 = time;//改变时间寄存器的值
    }
    

    提取时

    #define TIME_Addr 0xFFFFC000
    #define TIME *(volatile int *)(TIME_Addr+2)//这里需要将地址+2
    
    int getHours()
    {
        int time = TIME;
        return (time >> 11) & 0x1F;
    }
    

    设置分

    #define TIME_Addr 0xFFFFC000
    #define TIME *(volatile int *)(TIME_Addr+2)//这里需要将地址+2
        
    void SetMinutes(int minutes)
    {
        int oldtime = TIME;
        int newtime = oldtime & ~ (0x3F << 5);//将分钟清零,保留时钟与秒钟
        newtime | = (minutes & 0x3F) << 5;//设置分钟时间
        TIME = newtime;//改变时间寄存器的值
    }
    

    提取分

    #define TIME_Addr 0xFFFFC000
    #define TIME *(volatile int *)(TIME_Addr+2)//这里需要将地址+2
    
    int getMinutes()
    {
        int time = TIME;
        return (time >> 5) & 0x3F;
    }
    

    设置秒

    #define TIME_Addr 0xFFFFC000
    #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;//改变时间寄存器的值
    }
    

    提取秒

    #define TIME_Addr 0xFFFFC000
    #define TIME *(volatile int *)(TIME_Addr+2)//这里需要将地址+2
    
    int getSeconds()
    {
        int time = TIME;
        return (time & 0x1F) * 2; //此处不考虑Seconds除2带来的误差,因此直接乘2
    }
    
  • 相关阅读:
    波段是金牢记六大诀窍
    zk kafka mariadb scala flink integration
    Oracle 体系结构详解
    图解 Database Buffer Cache 内部原理(二)
    SQL Server 字符集介绍及修改方法演示
    SQL Server 2012 备份与还原详解
    SQL Server 2012 查询数据库中所有表的名称和行数
    SQL Server 2012 查询数据库中表格主键信息
    SQL Server 2012 查询数据库中所有表的索引信息
    图解 Database Buffer Cache 内部原理(一)
  • 原文地址:https://www.cnblogs.com/0831j/p/8214800.html
Copyright © 2011-2022 走看看