最近在看别人写的驱动时总是遇到一些C语言用法,句子符号能看懂,但实际的意思不明白,如下语句:
// LCD_PWREN(GPG4)
s2440IOP->GPGCON &= ~(3 << 8);
s2440IOP->GPGCON |= (1 << 8);
s2440IOP->GPGDAT |= (1 << 4);
// LCD _nRESET control
s2440IOP->GPBCON = (s2440IOP->GPBCON & ~(3<<2)) |(1<<2);
s2443IOP->GPBDAT |= (1<<1);
我知道这是对GPG和GPB的寄存器操作,但直接赋值不就行了吗?为什么要用这种格式写?这样写是否是对寄存器的某一位进行的单独操作?请大侠们指点。
个人习惯问题
其次这样写比较明了,因为大家都习惯这么看啊
s2440IOP->GPGCON &= ~(3 < < 8);
是对这个寄存器的bit[8]和bit[11]置零。
s2440IOP->GPGCON ?= (1 < < 8);
是对这个寄存器的bit[8]置1。
s2440IOP->GPGDAT ?= (1 < < 4);
是对这个寄存器的bit[4]置1。
以此类推,其实这是典型的先读后写操作,就是因为某些寄存器里我们有时候只需要改变某一位或某几位而不能动其他的位,所以才这样用。
至于(1 < < 8) 和(1 < < 4)这样的写法一目了然,一眼就能看出来是在对第几位进行操作,纯粹是为了阅读方便。
楼上解释的很详细了
补充一句
有的时候一个寄存器的含义和内容十分复杂
在操作的时候并不知道它现在所有位的值,而只能确定我们想修改的位
这样的话就不能用楼主所说的赋值的操作了 必须用这种方法
回复 楼主 wxching 的帖子
一个最简单的理由,只操作要操作的位,没用到的位不去操作它,因为你不知道或者预料不到你的操作会把它设置成什么状态。
而位与位或这些就可以做到位写0位写1而屏蔽掉其他位的功能