• 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
    }
    
  • 相关阅读:
    使用git svn工具进行svn 到git仓库的同步[持续更新]
    解决Linux无法存储svn密码
    spring boot @ResponseBody 注解情况下返回自定义类报错406
    解决mysql密码正确的情况下而无法连接的问题
    react项目实现国际化i18n
    github clone加速
    Centos模板机配置
    Xshell终端连接服务器慢,问题解决方法
    佛祖保佑永无 BUG 代码注释
    本地代理web端口
  • 原文地址:https://www.cnblogs.com/0831j/p/8214800.html
Copyright © 2020-2023  润新知