• 补做课堂实践 嵌入式


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

    地址的定义

    #define DATA_Addr 0x0C00000
    #define DATA *(volatile int *)(DATA_Addr)
    DATA = 0x1234;
    

    分析:由于Seconds占5位,因此需要先右移5位将Minutes的最低位与位0对齐,再与(&)上3F(0000 0000 0011 1111)即可将6-15位全部清0从而取出Minutes的全部6位

    假设Hours的5位全为A,Minutes的6位全为B,则:

      00000 00000 111111
    &   ????? AAAAA BBBBBB
    =   00000 00000 BBBBBB 
    

    提取Hours:
    分析:由于Seconds占5位,Minutes占6位(共占11位),因此需要先右移11位将Hours的最低位与位0对齐,再与(&)上1F(0000 0000 0001 1111)即可将5-15位全部清0从而取出Hours的全部5位
    假设Hours的5位全为C,Minutes的6位全为B,则:

       00000 000000 11111
    &   ????? ?????? CCCCC
    =   00000 000000 CCCCC 
    

    提取Seconds:
    分析:由于Seconds占低5位,因此无需右移最低位即与位0对齐,只需与(&)上1F(0000 0000 0001 1111)即可将5-15位全部清0从而取出Seconds的全部5位

    假设Seconds的5位全为A,Minutes的6位全为B,Hours的5位全为C,则:

        00000 000000 11111
    &   CCCCC BBBBBB AAAAA
    =   00000 000000 AAAAA 
    

    插入位(插入Minutes)

    以课上的小时为例:
    需要设置小时,首先需要将原来的小时清除,原来的小时有5位,故需要将前五位异或上零

    newtime=oldtime&~(0x1F<<11);
    

    还需要放置新的小时时间,将新的小时时间变为5位,然后放置到之前清空的五位上

    newtime |= (hours & 0x1F) << 11;
    

    获取小时时间时,直接取小时的五位然后输出即可。

    Hours=time>>11)&0x1F;
    return Hours;
    

    整体代码如下

    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的寄存器中
    

    加做分钟和秒的实现

    分钟位共六位,处于5——10位。
    秒位共5位,处于0——4位。
    实现过程同理与小时。

    设置分钟和获取分钟

    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;
  • 相关阅读:
    crontab 移动日志-超越昨天的自己系列(12)
    java进程性能分析步骤-超越昨天的自己系列(11)
    Linux 使用 you-get 指令下载网页视频
    Git git rm和git rm --cached
    Git .gitignore中已添加文件路径,但仍未被忽略
    Android 系统添加SELinux权限
    git 删除目录及子目录下的同名文件
    Android 查看和修改网络mtu
    git 设置git用户名和邮箱,并生成秘钥
    RK3288 添加普通串口uart1和uart3
  • 原文地址:https://www.cnblogs.com/nhx19970709/p/8228250.html
Copyright © 2020-2023  润新知