• 2017-2018-1 20155202 张旭 嵌入式C语言——时钟提取时分秒


    2017-2018-1 20155202 张旭 嵌入式C语言——时钟提取时分秒

    任务要求:

    • 在作业本上完成附图作业,要认真看题目要求。

    • 提交作业截图

    • 作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清零)

    题目解答

    • 提取位(以分钟为例)
    • 插入位(以分钟为例)

    定义地址

    #define DATA_Addr 0x0C00000
    #define DATA *(volatile int *)(DATA_Addr)
    DATA = 0x1234;
    
    位运算有以下规律:
    &0 --> 清零
    &1 --> 不变
    |1 --> 置1
    |0 --> 不变
    
    分钟占6位,故将时间右移6位,这时我们要将它提取出来,故要将每位&1,即&0x3F。

    设置、提取小时和秒原理和设置、提取分钟一样,只不过这里的0X3F变为0X1F,因为小时只有五位。

    提取操作分钟代码

    #define TIME_Addr  0xFFFFC0000
    #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 = newtime;
    }
    
    int getHours()
    {
        int time = TIME;
        return (time>>11) & 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 & 0x1F;
        TIME = newtime;
    }
    
    int getSeconds()
    {
        int time = TIME;
        return time & 0x1F;
    }
    
    提取小时
    #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的寄存器中
    void SetHours(int hours) //插入Hours
    {
        int oldtime=TIME;
        int newtime;
        newtime=oldtime&~(0x1F<<11);
        newtime|=(hours&0x1F)<<11;
        TIME=newtime;
    
    }
    int getHours() //取出Hours
    {
        int time=TIME;
        return (time>>11)&0x1F;
    }
    
    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;
    }
    
    void SetSeconds(int seconds) //插入Seconds
    {
        int oldtime=TIME;
        int newtime;
        newtime=oldtime&~0x1F;
        newtime|=(seconds/2)&0x1F;
        TIME=newtime;
    
    }
    int getSeconds() //取出Seconds
    {
        int time=TIME;
        return (time&0x1F)*2; //此处不考虑Seconds除2带来的误差,因此直接乘2
    }
    
  • 相关阅读:
    算法面试题
    学习进度条(一)
    代码作业——四则运算
    构建之法阅读笔记01
    本学期的阅读计划与快速阅读《构建之法》后提出问题
    自我介绍及学期目标
    对天天开心消消乐(订餐系统)的建议
    《构建之法》阅读笔记01-快速阅读后的几个问题。
    二柱子之随机四则运算
    自我介绍
  • 原文地址:https://www.cnblogs.com/zx20155202/p/8196032.html
Copyright © 2020-2023  润新知