本帖最后由 modongwei 于 2017-1-7 18:26 编辑
@正点原子 我在用STM8S写一个独立按键的程序,使用IAR for stm8软件,遇到奇怪的问题,希望高手给我指点迷津,详细如下:
先看程序
[mw_shl_code=applescript,true]typedef enum//枚举变量
{
KEY_DOWN = 0,
KEY_UP = 1,
KEY_WAIT = 2,
}KEYState_TypeDef;
void KEY_Init(void)//初始化
{
GPIO_Init(K1_PORT, K1_PIN, GPIO_MODE_IN_PU_NO_IT );//浮动输入无中断功能
GPIO_Init(Touch_PORT,Touch_PIN,GPIO_MODE_IN_PU_NO_IT );
}
KEYState_TypeDef keycan(GPIO_TypeDef* GPIOx,GPIO_Pin_TypeDef GPIO_Pin,u8 KEY_ID)
{
static KEYState_TypeDef KEY_State[4]={KEY_UP,KEY_UP,KEY_UP,KEY_UP}; //存入每个按键状态
if(KEY_State[KEY_ID]==KEY_UP)
{
if(GPIO_ReadInputPin(GPIOx, GPIO_Pin) == RESET)
{
delay_ms(20);//消抖
if(GPIO_ReadInputPin(GPIOx, GPIO_Pin) == RESET)
{
KEY_State[KEY_ID]=KEY_DOWN;//按键按下
}
}
}
else
{
if(KEY_State[KEY_ID]!=KEY_UP)
{
//!!请注意这里,我的问题就出现在这里,如果改成【 if(GPIO_ReadInputPin(GPIOx, GPIO_Pin) != RESET)】程序就正常了;
if(GPIO_ReadInputPin(GPIOx, GPIO_Pin) == SET)
{
KEY_State[KEY_ID]=KEY_UP;//按键松开
}
else
{
KEY_State[KEY_ID]=KEY_WAIT;//按键没有松开,进入等待状态
}
}
}
return KEY_State[KEY_ID];
}[/mw_shl_code]
我在调试界面查看Watch1
1、当按键按下之后
按下之后
2、当按键松开之后
我就怀疑是这句有问题了GPIO_ReadInputPin(GPIOx, GPIO_Pin) == SET,松开之后不是高电平??
改成 if(GPIO_ReadInputPin(GPIOx, GPIO_Pin) != RESET)程序就正常了;
正常状态下Watch1显示结果如下:
1、当按键按下之后
22
2、当按键一直按着
不松
3、当按键松开之后
我想知道怎么在Watch1界面查看GPIO_ReadInputPin读上来的的值,STM8库函数里面不是说:
GPIO_ReadInputPin()返回值是电平状态:
1、RESET,复位状态,低电平;
2、SET,置位状态,高电平;
难道高电平不是1?还是我的程序有错误吗?
[mw_shl_code=applescript,true]void key_Demo()
{
if(keycan(K1_PORT,K1_PIN,0)== KEY_DOWN)
{
LED1_R;//LED状态取反
}
if(keycan(Touch_PORT,Touch_PIN,1)== KEY_DOWN)
{
KM1_R;
}
}
[/mw_shl_code]
一周热门 更多>