zoukankan      html  css  js  c++  java
  • 20155308《信息安全系统设计基础 嵌入式C语言课堂考试补博客

    20155308《信息安全系统设计基础 嵌入式C语言课堂考试补博客

    知识点

    置位

    • ?bits = bits | (1 << 7) ; /* sets bit 7 */

    • bits |= (1 << 7) ; /* sets bit 7 */

    • #define SET_BIT (n,bits) do{bits |= (1<<n)}while(0)

    清除

    • bits &= ~(1 << 7) ; /* clears bit 7 */
    • #define CLR_BIT (n,bits) do{bits &=~ (1<<n)}while(0)

    反转位

    • bits ^= (1 << 6) ; /* flips bit 6 */
    • #define FLIP_BIT (n,bits) do{bits ^= (1<<n)}while(0)

    PPT上事例

    • 提取位

    • 插入位

    • 理解代码

    1. 由于Seconds占5位,因此需要先右移5位将Minutes的最低位与位0对齐,再与上3F(0000 0000 0011 1111)即可将6-15位全部清0,则获得minute部分。
    2. 0x3F出处为:对于minute一共有6bit,即(111111)2,转换为16进制即为0x3F;
    • 地址的定义
    #define DATA_Addr 0x0C00000
    #define DATA *(volatile int *)(DATA_Addr)
    DATA = 0x1234;
    
    • 最终代码
    #define Time_Addr 0xFFFFC0000 //实时钟芯片的IO映像基址是OxFFFFC0000
    #define TIME *(volatile int *)(Time_Addr+2) //时间存放在基址+2的寄存器中
    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;
    }
    

    课上考试题

    • 理解代码

    由于Seconds占5位,Minutes占6位,因此需要先右移11位将Hours的最低位与位0对齐,再与上1F(0000 0000 0001 1111)即可将5-15位全部清0从而取出Hours的全部5位。

    • 最终代码
    #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 SetSeconds(int seconds)
    int Getseconds()

    #define Time_Addr 0xFFFFC0000 //实时钟芯片的IO映像基址是OxFFFFC0000
    #define TIME *(volatile int *)(Time_Addr+2) //时间存放在基址+2的寄存器中
    void SetHours(int hours) //插入Hours
    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
    }
    
  • 相关阅读:
    HDU 2100 LoveKey
    HDU 2111 Saving HDU
    HDU 2132 An easy problem
    PAT 甲级 1081 Rational Sum (数据不严谨 点名批评)
    LWIP内存管理
    LWIP带UCOS操作系统移植
    LWIP协议栈2-
    LWIP协议栈1
    掌握所有IO口的外部中断
    熟悉相关电路,控制I/O口,且配置相关参数,LED,光敏,74LS164数码管
  • 原文地址:https://www.cnblogs.com/JIUSHA/p/8195888.html
Copyright © 2011-2022 走看看