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