[ZLG-ARM] 请教高手LPC2148 4×4按键问题

[复制链接]
2663|7
 楼主| kingorwei 发表于 2008-3-23 11:28 | 显示全部楼层 |阅读模式
请教问题,同事休假,他没调完的东东给我调了,CPU采用的是lpc2148,我也是刚接触这个片子,对它的脾气还不熟,。按键采用的是4×4的矩阵按键,直接占用了8个GPIO口的那种,不知到为什么,当我将ROW和COL进行反相读值的时候,读不到正确的数值,然而第一次进入的时候读到值又是正确的,我认为是程序的逻辑关系搞混乱了,但我现在查不出那个地方乱了,所以请教周工,帮我看看那个地方搞的还不对。谢谢:<br /><br />#define&nbsp;&nbsp;COL0&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&lt&lt&nbsp;9&nbsp;&nbsp;&nbsp;//&nbsp;P0.9连接COL0<br />#define&nbsp;&nbsp;COL1&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&lt&lt&nbsp;10&nbsp;&nbsp;&nbsp;//&nbsp;P0.10连接COL1<br />#define&nbsp;&nbsp;COL2&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&lt&lt&nbsp;20&nbsp;&nbsp;&nbsp;//&nbsp;P0.20连接COL2<br />#define&nbsp;&nbsp;COL3&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&lt&lt&nbsp;12&nbsp;&nbsp;&nbsp;//&nbsp;P0.13连接COL3<br /><br />#define&nbsp;&nbsp;ROW0&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&lt&lt&nbsp;15&nbsp;&nbsp;&nbsp;//&nbsp;P0.15连接ROW0<br />#define&nbsp;&nbsp;ROW1&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&lt&lt&nbsp;16&nbsp;&nbsp;&nbsp;//&nbsp;P0.16连接ROW1<br />#define&nbsp;&nbsp;ROW2&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&lt&lt&nbsp;17&nbsp;&nbsp;&nbsp;//&nbsp;P0.17连接ROW2<br />#define&nbsp;&nbsp;ROW3&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&lt&lt&nbsp;18&nbsp;&nbsp;&nbsp;//&nbsp;P0.18连接ROW3<br /><br />Uint32&nbsp;Scan_Key_bak(void)<br />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uint32&nbsp;i;<br />&nbsp;&nbsp;&nbsp;//**********************************//<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0SET&nbsp;|=&nbsp;(ROW0|ROW1|ROW2|ROW3);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;ROW&nbsp;set&nbsp;high&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR&nbsp;|=&nbsp;(COL0|COL1|COL2|COL3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//COL&nbsp;设为0<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;IO0DIR&nbsp;&=~(ROW0|ROW1|ROW2|ROW3);&nbsp;&nbsp;&nbsp;//&nbsp;ROW控制口输入<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0DIR&nbsp;|=(COL0|COL1|COL2|COL3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;COL控制口输出<br />//**********************************//&nbsp;&nbsp;&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;value0=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;value1=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;value2=0;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;value0&nbsp;=&nbsp;&nbsp;IO0PIN&nbsp;;//&&nbsp;0x00001e00&nbsp;;//读取row&nbsp;方向的值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value1&nbsp;=&nbsp;value0&nbsp;&(COL0|COL1|COL2|COL3);<br />&nbsp;&nbsp;&nbsp;&nbsp;value0&nbsp;&=&nbsp;(ROW0|ROW1|ROW2|ROW3);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;value0&nbsp;!=&nbsp;(ROW0|ROW1|ROW2|ROW3))&nbsp;&nbsp;//&nbsp;有按键按下<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTimeDly(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value1&nbsp;=&nbsp;&nbsp;IO0PIN&nbsp;;//&&nbsp;0x00001e00&nbsp;;//读取row&nbsp;方向的值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value1&nbsp;&=&nbsp;(ROW0|ROW1|ROW2|ROW3);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(value0&nbsp;==&nbsp;value1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;此处读到ROW的值是正确的。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />//**********************************//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0DIR&nbsp;|=(ROW0|ROW1|ROW2|ROW3);&nbsp;&nbsp;//&nbsp;ROW控制口输出<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0SET&nbsp;|=&nbsp;(COL0|COL1|COL2|COL3);&nbsp;&nbsp;//&nbsp;COL&nbsp;set&nbsp;high&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR&nbsp;|=&nbsp;(ROW0|ROW1|ROW2|ROW3);&nbsp;&nbsp;//ROW&nbsp;设为0&nbsp;&nbsp;&nbsp;执行完这行以后GPIO的输出电平是正确的<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0DIR&nbsp;&=~(COL0|COL1|COL2|COL3);&nbsp;//&nbsp;COL控制口输入&nbsp;&nbsp;执行完这行代码后,GPIO逻辑电平为0了,所以数据读不到了<br />//**********************************//&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value1&nbsp;=&nbsp;IO0PIN&nbsp;;//读取col&nbsp;方向的值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value1&nbsp;&=&nbsp;(COL0|COL1|COL2|COL3);//读取col&nbsp;方向的值<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;value1&nbsp;!=&nbsp;(COL0|COL1|COL2|COL3))&nbsp;&nbsp;//按键没松开<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTimeDly(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value2&nbsp;=&nbsp;IO0PIN&nbsp;;//读取col&nbsp;方向的值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value2&nbsp;&=&nbsp;(COL0|COL1|COL2|COL3);//读取col&nbsp;方向的值<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;value1&nbsp;==&nbsp;value2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value2&nbsp;=&nbsp;value0&nbsp;+&nbsp;value1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&lt16;&nbsp;i++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;查找0~15的键值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;value2&nbsp;==&nbsp;KeyTableVal)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value2&nbsp;=&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(value2&nbsp;&lt&nbsp;16)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;value2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;return&nbsp;0xff;<br />}<br />
 楼主| kingorwei 发表于 2008-3-23 11:34 | 显示全部楼层

附图是相关的电路

附图是相关的电路,Row和Col都是直接连接到2148的GPIO上的,并且也初始化了相关的寄存器,将相应端口配置成了GPIO口
lyl831015 发表于 2008-3-23 12:05 | 显示全部楼层

7290

zlg7290很好用的,4*4的键盘,I2C接口直接读取。
 楼主| kingorwei 发表于 2008-3-23 16:49 | 显示全部楼层

电路已经定了,不会再更改了

3楼的大哥,电路已经定了,不会再更改了,谢谢
 楼主| kingorwei 发表于 2008-3-23 17:07 | 显示全部楼层

IOSET寄存器的说明看不明白

IOSET&nbsp;GPIO&nbsp;端口输出置位寄存器。该寄存器和IOCLR&nbsp;寄存器一起控制输出管脚的状态。写入1&nbsp;使对应管脚输出高电平。写入0&nbsp;无效。<br />我不明白的是话是:该寄存器和IOCLR&nbsp;寄存器一起控制输出管脚的状态
zhonggx 发表于 2008-3-23 19:48 | 显示全部楼层

COL方向没有上接电阻。

你的COL方向没有上接电阻。<br />如果不想改硬件,可以用逐列扫描的办法。
zlgarm 发表于 2008-3-24 21:22 | 显示全部楼层

I/O口

kingorwei&nbsp;您好:<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;问题在您程序处理上,电路没有问题。IOSET寄存器中,对应位置1时输出高电平,置0无效,IOCLR寄存器中,对应位置1清零IOSET中的相应位,同时使引脚变为低电平,写0无效。因此,引脚的最终电平有这两个寄存器决定。<br />&nbsp;&nbsp;&nbsp;&nbsp;在使用时请检查一下您的IODIR寄存器有无设置正确,IODIR相应位为1时,引脚只为输出,为0时为输入。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;on&nbsp;duty:zlgarm_zhanghuping
 楼主| kingorwei 发表于 2008-3-27 09:42 | 显示全部楼层

谢谢ZlgArm的答复,还有问题

谢谢ZLG的答复,看了一下,寄存器好像没设错<br />&nbsp;&nbsp;&nbsp;我的想法是<br />&nbsp;&nbsp;&nbsp;1,将Row端口设为输入端口,同时将端口置为高,将Col端口设为输出端口,同时置为低,然后读Row&nbsp;端口得到一个状态值&nbsp;RowData<br />&nbsp;&nbsp;&nbsp;2,Row&&nbsp;Col&nbsp;方向反相,将Col端口设为输入端口,同时将端口置为高,将Row端口设为输出端口,同时置为低,然后读Col端口得到一个状态值ColData<br />&nbsp;&nbsp;&nbsp;3,两个状态值相加得到一个确定的按键扫描值&nbsp;RowData+ColData&nbsp;=&nbsp;KeyData;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;问题1:设置IOSET&nbsp;、IOCLR&nbsp;时,只有在IODIR&nbsp;设为输出的时候才能有效,那么在第2条中,我想将Col设为输入端口,还想将Col设为高电平(这样按下的键是低电平,才能有效检测到),我应该怎么做,第一条同第二条。<br />&nbsp;&nbsp;&nbsp;问题2:我的按键扫描思想是否有逻辑错误,如果有错误,应该如何修正。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

31

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部