• 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
    }
    
  • 相关阅读:
    OAuth2.0协议封装类
    FFmpeg学习笔记
    mysql学习笔记(有待增补)
    使用cnpm国内淘宝镜像命令
    mongoDB中的聚合操作示例
    react的学习日常整理
    服务器防止访问超时的一些参数设置
    MongoDB基本语句操作
    CI框架配置多个数据库
    php前后台登录交互明文传输使用base64加密
  • 原文地址:https://www.cnblogs.com/0831j/p/8214800.html
Copyright © 2020-2023  润新知