开发板与平台: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
posted on 2012-07-21 09:08  孜求嵌道  阅读(546)  评论(0编辑  收藏  举报