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); 
时间: 2024-11-05 06:12:53

C语言按位操作应用的相关文章

c语言的位操作

c语言的位操作最常用的地方就是用在对寄存器的写值上. 一.基本的一些概念 1.位与:& 操作:1 & 1 = 1: 1 & 0 = 0: 0 & 0 = 0: 特点:只有全是1的时候才是1,其他情况都是0. 总结:任何数和0位与就是0,和1位与没有变化,所以位与常用在清零上(清零用位与). 2.位或:| 操作:1 | 1 = 1: 1 | 0 = 1: 0 | 0 = 0: 特点:只有全0的时候才是0,其他情况都是1. 总结:任何数和1位或就是1,和0位或没有变化,所以位或

C语言高效位操作

思考: 1. 如何将一个数据中的多个不连续位清位? 1. 如何将一个数据中的多个不连续位置位? 1. 如何反转一个数据中的多个不连续位(1->0, 0->1)? 基础知识:C 语言位操作 按位或(有1得1): | 按位与(有0得0): & 按位异或(不同得1): ^ 按位取反: ~ 0 | 0 = 0 0 & 0 = 0 0 ^ 0 = 0  ~0 = 1 0 | 1 = 1 0 & 1 = 0 0 ^ 1 = 1  ~1 = 0 1 | 0 = 1 1 & 0

C语言:位操作小例子几则

首先,我将列举C语言中一些常用的与位操作相关的运算符 一.移位运算符 左移操作符<< 算术左移与逻辑左移都是左边移出一位,右边补0: 右移操作符>> 逻辑右移为右边移出一位左边最高位补0,而算术右移为右边移出一位,最高位补符号位. 二.位操作符 与 & 运算法则:见0为0,全1为1: 或 | 运算法则:见1为1,全0为0: 异或^ 运算法则:相同得0,相异为1: 接下来我将分享几个比较常用的对位进行操作的编程小例子 1.不使用临时变量实现数a和b的交换 #include&l

一起talk C栗子吧(第十九回:C语言实例--位操作)

各位看官们,大家好,上一回中咱们说的是输出十六进制的例子,这一回咱们说的例子是:位操作.闲话 休提,言归正转.让我们一起talk C栗子吧! 看官们,位操作有五种,与.或.非.异或.移位.接下来咱们分别介绍这些操作.为了方便说明,我们 先统一做一下说明,位操作的对象是比特位.假如有三个比特位:A.B和C,大家都知道比特位的值只有0 或者1两种,所以A.B和C的值是0或者1.我们把A和B当作位操作的对象,C当作A和B操作的结果. 与操作:操作符为&.例子:C=A & B.只有A和B的值都为1

浅谈C语言嵌入式系统编程注意事项

C语言嵌入式系统编程注意事项之背景篇 本文的讨论主要围绕以通用处理器为中心的协议处理模块进行,因为它更多地牵涉到具体的C语言编程技巧 不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作能力.无疑,汇编语言具备这样的特质.但是,归因于汇编语言开发过程的复杂性,它并不是嵌入式系统开发的一般选择.而与之相比,C语言--一种"高级的低级"语言,则成为嵌入式系统开发的最佳选择.笔者在嵌入式系统项目的开发过程中,一次又一次感受到C语言的精妙,沉

C语言嵌入式系统编程修炼

C语言嵌入式系统编程修炼 ?? 2008-08-19 作者:宋宝华 来源:天极网 ?? C语言嵌入式系统编程修炼之背景篇 本文的讨论主要围绕以通用处理器为中心的协议处理模块进行,因为它更多地牵涉到具体的C语言编程技巧 不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作能力.无疑,汇编语言具备这样的特质.但是,归因于汇编语言开发过程的复杂性,它并不是嵌入式系统开发的一般选择.而与之相比,C语言--一种"高级的低级"语言,则成为嵌入式系

高级Javascript代码

Javascript是一门很吊的语言,我可能学了假的JavaScript,哈哈,大家还有什么推荐的,补充送那啥邀请码. 本文秉承着:你看不懂是你SB,我写的代码就要牛逼. 1.单行写一个评级组件 "★★★★★☆☆☆☆☆".slice(5 - rate, 10 - rate);定义一个变量rate是1到5的值,然后执行上面代码,看图 才发现插件什么的都弱爆了 来源:来自知乎用户蜗牛老湿的回答 2.如何装逼用代码骂别人SB (!(~+[])+{})[--[~+""][+

【转】这些JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已

[转]这些JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已 Javascript是一门很吊的语言,我可能学了假的JavaScript,哈哈,大家还有什么推荐的 本文秉承着:你看不懂是你SB,我写的代码就要牛逼. 1.单行写一个评级组件 "★★★★★☆☆☆☆☆".slice(5 - rate, 10 - rate);定义一个变量rate是1到5的值,然后执行上面代码,看图 才发现插件什么的都弱爆了 2.如何装逼用代码骂别人SB (!(~+[])+{})[--[~+&qu

浅析嵌入式C优化技巧

嵌入式C语言优化小技巧 1 概述 嵌入式系统是指完成一种或几种特定功能的计算机系统,具有自动化程度高,响应速度快等优点,目前已广泛应用于消费电子,工业控制等领域.嵌入式系统受其使用的硬件以及运行环境的限制,非常注重代码的时间和空间效率,因此选择一种合适的开发语言十分重要.目前,在嵌入式系统开发中可使用的语言很多,其中 C语言应用得最广泛.虽然用 C 语言编程具有许多优点,但基于嵌入式系统的C语言和标准 C语言又有很大区别.接下来我结合嵌入式系统的特点和自己的一些积累,讨论在程序设计中代码优化的一