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