开发板与平台:XSBASE 270-S、PXA270
裸机程序:矩阵键盘
编译环境:ads 1.20
调试方法:直接用工具烧至片内norflash的0x0地址
一:分析
PXA270支持8 x 8 matrix keypad,eight direct keys,two rotary encoders。开发板配的是3*3的矩阵键盘。跟常见的s3c24X0不同,PXA270有专门的键盘控制器,这也是需要进行配置的。
本次实验实现一个效果为,按下哪个键,对应的哪个led灯就亮。
通过流水灯GPIO的设置,可以举一反三,这里的GPIO的设置就不加多说明了。在键盘控制器的配置中,我们忽略多重按键的按下和采用自动扫描方式检测按键的按下,另外还取消了矩阵键盘的中断响应。图3为KPC的设置。
由图4可知,如果没有按键按下的话,KPAS[MUKP]的值为0;单键按下的话,KPAS[MUKP]的值为1;如果考虑多重按键的按下,则需要考察KPASMKP0-3寄存器(这里我们不考虑)。要知道哪个按键按下了,就需要考察图5中的KPAS[RP]和KPAS[CP]。比如,0行0列按下了就表明是SW2按键被按下了。
图1:
图2:
图3:
图4:
图5:
二:程序代码
1 area boot, code, readonly 2 entry 3 4 ;led相关寄存器 5 GPSR2 equ 0x40e00020 6 GPDR2 equ 0x40e00014 7 GAFR2_U equ 0x40e00068 8 LED_CS equ 0x10500000 9 10 ;按键相关寄存器 11 GPLR3 equ 0x40e00100 12 GPDR3 equ 0x40e0010c 13 GAFR3_L equ 0x40e0006c 14 KPC equ 0x41500000 15 KPAS equ 0X41500020 16 17 ldr r8, =0x1 18 19 ;led初始化 20 21 ldr r0, =GPSR2 22 ldr r1, [r0] 23 orr r1, r1, r8, lsl #16 24 str r1, [r0] 25 26 ldr r0, =GPDR2 27 ldr r1, [r0] 28 orr r1, r1, r8, lsl #16 29 str r1, [r0] 30 31 ldr r0, =GAFR2_U 32 ldr r1, [r0] 33 bic r1, r1, r8, lsl #0 34 orr r1, r1, r8, lsl #1 35 str r1, [r0] 36 37 ;按键初始化 38 ldr r0, =GPDR3 39 ldr r1, [r0] 40 ;GPIO100-102设置成输入 41 bic r1, r1, r8, lsl #4 42 bic r1, r1, r8, lsl #5 43 bic r1, r1, r8, lsl #6 44 ;GPIO103-105设置为输出 45 orr r1, r1, r8, lsl #7 46 orr r1, r1, r8, lsl #8 47 orr r1, r1, r8, lsl #9 48 str r1, [r0] 49 50 ldr r0, =GAFR3_L 51 ldr r1, [r0] 52 ;GPIO100-102设置成功能复用1 53 orr r1, r1, r8, lsl #8 54 bic r1, r1, r8, lsl #9 55 orr r1, r1, r8, lsl #10 56 bic r1, r1, r8, lsl #11 57 orr r1, r1, r8, lsl #12 58 bic r1, r1, r8, lsl #13 59 ;GPIO103-105设置为功能复用2 60 bic r1, r1, r8, lsl #14 61 orr r1, r1, r8, lsl #15 62 bic r1, r1, r8, lsl #16 63 orr r1, r1, r8, lsl #17 64 bic r1, r1, r8, lsl #18 65 orr r1, r1, r8, lsl #19 66 str r1, [r0] 67 68 ldr r0, =KPC 69 ldr r1, [r0] 70 bic r1, r1, r8, lsl #30 71 ;活动的自动扫描 72 orr r1, r1, r8, lsl #29 73 ;矩阵键盘有三行 74 bic r1, r1, r8, lsl #28 75 orr r1, r1, r8, lsl #27 76 bic r1, r1, r8, lsl #26 77 ;矩阵键盘有三列 78 bic r1, r1, r8, lsl #25 79 orr r1, r1, r8, lsl #24 80 bic r1, r1, r8, lsl #23 81 ;忽略多重按键 82 orr r1, r1, r8, lsl #21 83 ;扫描1到3行 84 ldr r8, =0x1f 85 bic r1, r1, r8, lsl #16 86 ldr r8, =0x7 87 orr r1, r1, r8, lsl #13 88 ldr r8, =0x1 89 ;使能矩阵键盘 90 orr r1, r1, r8, lsl #12 91 ;禁止矩阵键盘的中断 92 bic r1, r1, r8, lsl #11 93 str r1, [r0] 94 95 loop 96 ;灭掉所有led灯 97 ldr r0, =LED_CS 98 ldr r1, =0xff 99 str r1, [r0] 100 101 ;检测是否有按键按下 102 ldr r0, =KPAS 103 ldr r1, [r0] 104 mov r1, r1, lsl #1 105 mov r1, r1, lsr #26 106 cmp r1, #0x0 107 beq loop 108 109 ldr r0, =KPAS 110 ldr r1, [r0] 111 mov r1, r1, lsl #24 112 mov r1, r1, lsr #28 113 cmp r1, #0x0 114 ;第一行有按键按下 115 beq check_r0 116 cmp r1, #0x1 117 ;第二行有按键按下 118 beq check_r1 119 cmp r1, #0x2 120 ;第三行有按键按下 121 beq check_r2 122 123 check_r0 124 ldr r0, =KPAS 125 ldr r1, [r0] 126 mov r1, r1, lsl #28 127 mov r1, r1, lsr #28 128 cmp r1, #0x0 129 ;第一个灯 130 beq led1_set 131 cmp r1, #0x1 132 ;第二个灯 133 beq led2_set 134 cmp r1, #0x2 135 ;第三个灯 136 beq led3_set 137 b loop 138 139 check_r1 140 ldr r0, =KPAS 141 ldr r1, [r0] 142 mov r1, r1, lsl #28 143 mov r1, r1, lsr #28 144 cmp r1, #0x0 145 beq led4_set 146 cmp r1, #0x1 147 beq led5_set 148 cmp r1, #0x2 149 beq led6_set 150 b loop 151 152 check_r2 153 ldr r0, =KPAS 154 ldr r1, [r0] 155 mov r1, r1, lsl #28 156 mov r1, r1, lsr #28 157 cmp r1, #0x0 158 beq led7_set 159 cmp r1, #0x1 160 beq led8_set 161 b loop 162 163 ;led灯的设置 164 led1_set 165 ldr r9, =7 166 b led_on 167 168 led2_set 169 ldr r9, =6 170 b led_on 171 172 led3_set 173 ldr r9, =5 174 b led_on 175 176 led4_set 177 ldr r9, =4 178 b led_on 179 180 led5_set 181 ldr r9, =3 182 b led_on 183 184 led6_set 185 ldr r9, =2 186 b led_on 187 188 led7_set 189 ldr r9, =1 190 b led_on 191 192 led8_set 193 ldr r9, =0 194 b led_on 195 196 led_on 197 ldr r0, =LED_CS 198 ldr r1, =0xff 199 bic r1, r1, r8, lsl r9 200 str r1, [r0] 201 b loop 202 203 end