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); 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM