程序在下面。PD3-6是行线,PA1-3是列线。按列扫描的。
结果是,刚开始那个参数key能显示第一行和第三行的。后来,不管按哪个键,都是进第一行,第n列的。
PD 的IDR,和ODR,只要输出了0x07. IDR也是0x07的。 按键不变化。
另外,又一次单步调试的时候,正确进了第
[mw_shl_code=c,true]void key1(void)
{
GPIO_Init(GPIOD,(GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6),GPIO_MODE_OUT_PP_HIGH_FAST );//行线推挽输出
GPIO_Init(GPIOA,(GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 ), GPIO_MODE_IN_PU_IT );//列线上拉输入
GPIO_WriteLow(GPIOD,(GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6));//输出行线全部输出高
COLUMN_VALUE1=GPIO_ReadInputPin(GPIOA, GPIO_PIN_1);
COLUMN_VALUE2=GPIO_ReadInputPin(GPIOA, GPIO_PIN_2);
COLUMN_VALUE3=GPIO_ReadInputPin(GPIOA, GPIO_PIN_3);
column_value=COLUMN_VALUE1+COLUMN_VALUE2+COLUMN_VALUE3;
if(column_value!=0x0E)//cuo
{
GPIO_Write(GPIOD,0X70);
ROW_VALUE1=GPIO_ReadInputPin(GPIOD, GPIO_PIN_3);
ROW_VALUE2=GPIO_ReadInputPin(GPIOD, GPIO_PIN_4);
ROW_VALUE3=GPIO_ReadInputPin(GPIOD, GPIO_PIN_5);
ROW_VALUE4=GPIO_ReadInputPin(GPIOD, GPIO_PIN_6);
row_value=ROW_VALUE1+ROW_VALUE2+ROW_VALUE3+ROW_VALUE4;
key_value=row_value+column_value;
switch(key_value)
{
case(0X76):
{key=1;return;}
case(0X7A):
{key=2;return;}
case(0X7C):
{key=3;return;}
}
GPIO_Write(GPIOD,0X68);
ROW_VALUE1=GPIO_ReadInputPin(GPIOD, GPIO_PIN_3);
ROW_VALUE2=GPIO_ReadInputPin(GPIOD, GPIO_PIN_4);
ROW_VALUE3=GPIO_ReadInputPin(GPIOD, GPIO_PIN_5);
ROW_VALUE4=GPIO_ReadInputPin(GPIOD, GPIO_PIN_6);
row_value=ROW_VALUE1+ROW_VALUE2+ROW_VALUE3+ROW_VALUE4;
key_value=column_value+row_value;
switch(key_value)
{
case(0X6E):
{key=4;return;}
case(0X72):
{key=5;return;}
case(0X74):
{key=6;return;}
}
GPIO_Write(GPIOD,0X58);
ROW_VALUE1=GPIO_ReadInputPin(GPIOD, GPIO_PIN_3);
ROW_VALUE2=GPIO_ReadInputPin(GPIOD, GPIO_PIN_4);
ROW_VALUE3=GPIO_ReadInputPin(GPIOD, GPIO_PIN_5);
ROW_VALUE4=GPIO_ReadInputPin(GPIOD, GPIO_PIN_6);
row_value=ROW_VALUE1+ROW_VALUE2+ROW_VALUE3+ROW_VALUE4;
key_value=column_value+row_value;
switch(key_value)
{
case(0X5E):
{key=7;return;}
case(0X62):
{key=8;return;}
case(0X64):
{key=9;return;}
}
GPIO_Write(GPIOD,0X38);
ROW_VALUE1=GPIO_ReadInputPin(GPIOD, GPIO_PIN_3);
ROW_VALUE2=GPIO_ReadInputPin(GPIOD, GPIO_PIN_4);
ROW_VALUE3=GPIO_ReadInputPin(GPIOD, GPIO_PIN_5);
ROW_VALUE4=GPIO_ReadInputPin(GPIOD, GPIO_PIN_6);
row_value=ROW_VALUE1+ROW_VALUE2+ROW_VALUE3+ROW_VALUE4;
key_value=column_value+row_value;
switch(key_value)
{
case(0X3E):
{key=10;return;}
case(0X42):
{key=11;return;}
case(0X44):
{key=12;return;}
}
}
}[/mw_shl_code]
二行的程序,当时IDR的值是0 1100 11 0(stm8没有PD0和PD7)
|