本帖最后由 hou 于 2009-10-19 23:32 编辑
void abc()
{
uint8 P1_changed_now; //记录两次采样周期中P1各位的变化
uint8 P1_changed_sum; //记录P1变化的历史信息,曾经变化的位(无论次数)
uint8 P1_changed_multi; //记录P1变化的历史信息,发生多次变化的位
uint8 P1_old;
uint8 P1_new;
uint8 i=0;
P1=1;//读引脚
P1_old = P1;
while (i<100)
{
P1=1;
P1_new = P1;
P1_changed_now = P1_new ^ P1_old;//记录相邻两次采样P1变化的位
P1_changed_multi |= P1_changed_sum & P1_changed_now;//曾经变化过的且当前又变化过的位,记录下来;
P1_changed_sum |= P1_changed_now;
P1_old = P1_new;
i++;
delay10ms();
}
P2 = P1_changed_sum ^ P1changed_multi; //曾经变化过的位中,减去多次变化的位
}
例:以4位为例
采样次数 P1 changed_now changed_sum changed_multi
---------------------------------------------------------
0 1001 0000 0000 0000
---------------------------------------------------------
1 1010 0011 0011 0000
---------------------------------------------------------
2 1111 0101 0111 0001
---------------------------------------------------------
3 1101 0010 0111 0011
---------------------------------------------------------
到此为止,有低三位发生变化,其中低两位曾多次变化;则可判定次高位应点亮。 |