• 2017-2018-1 20152515 第16周 嵌入式基础 课堂实践补做


    题目要求

    • 在作业本上完成附图作业,要认真看题目要求。
    • 提交作业截图
    • 作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清零)


    错误原因:

    • 我把SetHours()和getHours()没理解清楚,首先两者就搞混了。

    • 关于return (time>>11) & 0x1F;,我写成了return (time>>11) & 0x3E;

    • 我意识到hours需要的是右移11位之后,取它低5位,但是对于“五个1”这个问题,我居然理解成了"0x3E",也就是"0x00111110",事实上,应该是
      "0x00011111".


    老师曾在课上讲到关于地址的定义问题:

    • 地址的定义
    #define DATA_Addr	0x0C00000
    #define DATA	*(volatile int *) DATA_Addr
    DATA = 0x1234;
    
    • 对应的,这题中时间存放在(基址+2)的16位寄存器中,定义一个时间宏存放地址。
    #define DATA_Addr	0xFFFFC000
    #define DATA	*(volatile int *)  DATA_Addr+2
    
    • 提取时间的方法,老师的PPT中也有提及:


    • 在本题中,根据结构图,Hours占5位,其地址与时间地址的偏移量为11,因此提取数值的时候将原数值右移11位,再将数值与0x1F(00011111),将数值的低五位提取出来,也就是Hours.

    • 正确答案:

    
    #define DATA_Addr	0xFFFFC000
    #define DATA	*(volatile int *)  DATA_Addr+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;
    }
    

    • 附加题:分钟和秒的实现,同理可得:

    • 分钟:

    void SetMinutes(int minutes) 
    {
        int oldtime=TIME;
        int newtime;
        newtime=oldtime&~(0x3F<<5); 1111是因为分钟是6位:第5-10位
        newtime|=(minutes&0x3F)<<5;
        TIME=newtime;
    
    }
    #define Time_Addr 0xFFFFC0000 
    #define Time *(volatile int *)(Time_Addr+2) 
    int getMinutes() 
    {
        int time=TIME;
        return (time>>5)&0x3F;
    }
    
    • 秒:
    void SetSeconds(int seconds)
    {
        int oldtime=TIME;
        int newtime;
        newtime=oldtime&~0x1F;
        newtime|=(seconds/2)&0x1F;
        TIME=newtime;
    
    }
    #define Time_Addr 0xFFFFC0000 
    #define Time *(volatile int *)(Time_Addr+2) 
    int getSeconds() 
    {
        int time=TIME;
        return (time&0x1F)*2;
    
  • 相关阅读:
    获取农历日期
    图片上传代码(C#)
    ASP.net使用技术总结(1)GridView控件的单击处理
    JavaScript使用小技巧:IE8的关闭处理
    FrameSet左右收缩编码
    哈哈,开心!今天注册开通了 弟弟Kernel 的网志
    设计模式简介
    Delphi字符串、PChar与字符数组之间的转换
    C++中数组参数详解
    1、简单工厂模式
  • 原文地址:https://www.cnblogs.com/xuanyan/p/8232812.html
Copyright © 2020-2023  润新知