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