• C语言按位操作应用


     1 #define GPFCON      (*(volatile unsigned long *)0x56000050)//(int *)是将变量强制转换为地址形式,这样就能和指针连起来用了。
     2 #define GPFDAT      (*(volatile unsigned long *)0x56000054)
     3 
     4 #define GPGCON      (*(volatile unsigned long *)0x56000060)
     5 #define GPGDAT      (*(volatile unsigned long *)0x56000064)
     6 
     7 /*
     8  * LED1,LED2,LED4对应GPF4、GPF5、GPF6
     9  */
    10 #define    GPF4_out    (1<<(4*2))
    11 #define    GPF5_out    (1<<(5*2))
    12 #define    GPF6_out    (1<<(6*2))
    13 
    14 #define    GPF4_msk    (3<<(4*2))
    15 #define    GPF5_msk    (3<<(5*2))
    16 #define    GPF6_msk    (3<<(6*2))
    17 
    18 /*
    19  * S2,S3,S4对应GPF0、GPF2、GPG3
    20  */
    21 #define GPF0_in     (0<<(0*2))
    22 #define GPF2_in     (0<<(2*2))
    23 #define GPG3_in     (0<<(3*2))
    24 
    25 #define GPF0_msk    (3<<(0*2))
    26 #define GPF2_msk    (3<<(2*2))
    27 #define GPG3_msk    (3<<(3*2))
    28 
    29 int main()
    30 {
    31         unsigned long dwDat;
    32 
    33 
    34         // LED1,LED2,LED4对应的3根引脚设为输出
    35         GPFCON &= ~(GPF4_msk | GPF5_msk | GPF6_msk);//GPFCON原先是什么不知道,通过按位与,使4,5,6的那几个位清0了,而其他位不变,因为有取反的影响,导致按位与                                                         可以保持不变
    36         GPFCON |= GPF4_out | GPF5_out | GPF6_out;   //同理这一句仅仅使4,5,6的那几个位变成01了 ,设置成输入成功。
    37                                                     //只要记住,GPFCON在这里并不是0x0,而是某个数,但是我们只想改变4,5,6位,其他位不变,所以就要这么写啦。
    38         // S2,S3对应的2根引脚设为输入
    39         GPFCON &= ~(GPF0_msk | GPF2_msk);           //为什么要两次,因为是对2位操作,所以需要先把那2位请0,在置1或保持为0;
    40         GPFCON |= GPF0_in | GPF2_in;
    41 
    42         // S4对应的引脚设为输入
    43         GPGCON &= ~GPG3_msk;
    44         GPGCON |= GPG3_in;
    45 
    46 
    47 //        GPFCON=0x00150000;                        这么写也可以,直接赋值,就是很土,而且容易算错位数。
    48 //        GPGCON=0x00000000;
    49 
    50         while(1){
    51             //若Kn为0(表示按下),则令LEDn为0(表示点亮)
    52             dwDat = GPFDAT;             // 读取GPF管脚电平状态
    53 
    54         
    55             if (dwDat & (1<<0))        // S2没有按下
    56                 GPFDAT |= (1<<4);       // LED1熄灭   ,由于LED只占1位,所以一条语句就够了,置1就是按位或
    57             else    
    58                 GPFDAT &= ~(1<<4);      // LED1点亮
    59 
    60        
    61             if (dwDat & (1<<2))         // S3没有按下
    62                 GPFDAT |= (1<<5);       // LED2熄灭
    63             else    
    64                 GPFDAT &= ~(1<<5);      // LED2点亮
    65     
    66             dwDat = GPGDAT;             // 读取GPG管脚电平状态
    67             
    68             if (dwDat & (1<<3))         // S4没有按下
    69                 GPFDAT |= (1<<6);       // LED3熄灭
    70             else    
    71                 GPFDAT &= ~(1<<6);      // LED3点亮
    72     }
    73 
    74     return 0;
    75 }


    总结:
    对一个寄存器仅有2位需要改变,其他保持不变时这么写:先清0,在用按位或操作,GPF4_MSK,GPF_OUT都是移位的数,更改方便
     GPFCON &= ~(GPF4_msk | GPF5_msk | GPF6_msk);
     GPFCON |= GPF4_out | GPF5_out | GPF6_out;   

    对一个寄存器仅有1位需要改变:只用1条按位与或者按位或即可
    GPFDAT |= (1<<4); 
  • 相关阅读:
    Vue核心之数据劫持
    Flex 布局教程
    Grid布局
    我们都在深夜,参差不齐地入眠
    一个十分好用的动画工具:Velocity.js
    前端知识点总结——jQuery(下)
    前端知识点总结——jQuery(上)
    虫师Selenium2+Python_2、测试环境搭建
    虫师Selenium2+Python_11、自动化测试项目实战
    虫师Selenium2+Python_12、BDD框架之Lettuce入门
  • 原文地址:https://www.cnblogs.com/AcmenLiang/p/6663475.html
Copyright © 2020-2023  润新知