先上图:
所以4个KEY的GPIO定义如下:
1 #define GPF_KEY_4 8 2 #define GPF_KEY_4_INPUT 0x00 3 #define GPF_KEY_4_OUTPUT 0x01 4 5 #define GPF_KEY_3 6 6 #define GPF_KEY_3_INPUT 0x00 7 #define GPF_KEY_3_OUTPUT 0x01 8 9 #define GPF_KEY_2 4 10 #define GPF_KEY_2_INPUT 0x00 11 #define GPF_KEY_2_OUTPUT 0x01 12 13 #define GPF_KEY_0 0 14 #define GPF_KEY_0_INPUT 0x00 15 #define GPF_KEY_0_OUTPUT 0x01 16 17 18 #define KEY_PULL_DOWN 0x0 19 #define KEY_PULL_UP 0x1 20 21 22 #define GPFUP_KEY_0 0 23 #define GPFUP_KEY_0_DISABLE 0x00 24 #define GPFUP_KEY_0_PULL_DOWN_ENABLE 0x01 25 #define GPFUP_KEY_0_PULL_UP_ENABLE 0x10 26 27 #define GPFUP_KEY_2 2 28 #define GPFUP_KEY_2_DISABLE 0x00 29 #define GPFUP_KEY_2_PULL_DOWN_ENABLE 0x01 30 #define GPFUP_KEY_2_PULL_UP_ENABLE 0x10 31 32 #define GPFUP_KEY_3 3 33 #define GPFUP_KEY_3_DISABLE 0x00 34 #define GPFUP_KEY_3_PULL_DOWN_ENABLE 0x01 35 #define GPFUP_KEY_3_PULL_UP_ENABLE 0x10 36 37 #define GPFUP_KEY_4 4 38 #define GPFUP_KEY_4_DISABLE 0x00 39 #define GPFUP_KEY_4_PULL_DOWN_ENABLE 0x01 40 #define GPFUP_KEY_4_PULL_UP_ENABLE 0x10 41 42 /* 43 GPFDAT 保存当前按键的状态 44 */ 45 #define GPFDAT_KEY_0 0 46 #define GPFDAT_KEY_2 2 47 #define GPFDAT_KEY_3 3 48 #define GPFDAT_KEY_4 4
寄存器的定义如下:
1 #define GPFCON (*(volatile unsigned *)0x56000050) 2 #define GPFDAT (*(volatile unsigned *)0x56000054) 3 #define GPFUP (*(volatile unsigned *)0x56000058)
主程序中,需要先将GPF0,GPF2,GPF3,GPF4设置为输入:
1 GPFCON = (GPF_KEY_0_INPUT << GPF_KEY_0) | (GPF_KEY_2_INPUT << GPF_KEY_2) 2 |(GPF_KEY_3_INPUT << GPF_KEY_3) | (GPF_KEY_4_INPUT << GPF_KEY_4) ;
同时按键功能使能:
1 GPFUP = ((GPFUP_KEY_0_PULL_DOWN_ENABLE | GPFUP_KEY_0_PULL_UP_ENABLE) << GPFUP_KEY_0) 2 | ((GPFUP_KEY_2_PULL_DOWN_ENABLE | GPFUP_KEY_2_PULL_UP_ENABLE) << GPFUP_KEY_2) 3 | ((GPFUP_KEY_3_PULL_DOWN_ENABLE | GPFUP_KEY_3_PULL_UP_ENABLE) << GPFUP_KEY_3) 4 | ((GPFUP_KEY_4_PULL_DOWN_ENABLE | GPFUP_KEY_4_PULL_UP_ENABLE) << GPFUP_KEY_4) ;
随后就可以在一个循环中实现按键功能。
按键的状态保存在寄存器GPFDTA中,根据手册得知,如果GPF_KEY_3被按下,则GPFDTA的第3位保存对应的状态:pull_down 也就是 0
1 while (1) 2 { 3 if ( KEY_PULL_DOWN == ((GPFDAT >> GPFDAT_KEY_0 ) & 0x01) ) 4 { 5 led_0_on(); 6 } 7 else if ( KEY_PULL_DOWN == ((GPFDAT >> GPFDAT_KEY_2 ) & 0x01) ) 8 { 9 led_1_on(); 10 } 11 else if ( KEY_PULL_DOWN == ((GPFDAT >> GPFDAT_KEY_3 ) & 0x01) ) 12 { 13 led_2_on(); 14 } 15 else if ( KEY_PULL_DOWN == ((GPFDAT >> GPFDAT_KEY_4 ) & 0x01) ) 16 { 17 led_3_on(); 18 } 19 else 20 {} 21 }
至此可以实现按键点亮对应的LED灯。
源码下载地址: http://files.cnblogs.com/files/dgm3000/KEY.zip
时间: 2024-11-02 13:24:13