历史上的今天
今天是:2025年01月14日(星期二)
2019年01月14日 | STM32按键总结(低电平有效及上升沿有效)
2019-01-14 来源:eefocus
低电平有效的按键
#define KEY1 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_10)//读取按键0
#define KEY2 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)//读取按键1
#define KEY3 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)//读取按键2
#define KEY4 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_11)//读取按键3(WK_UP)
#define KEY5 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)//读取按键3(WK_UP)
void KEY_Init(void) //IO初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
/*开启按键端口(PC)的时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_13;//KEY0-KEY2;
// GPIO_InitStructure.GPIO_Speed= GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void KEY_Scan(u8 mode)
{
staticu8 key_up=1;//按键按松开标志
if(mode)
key_up=1; //支持连按
if((KEY1==0||KEY2==0||KEY3==0||KEY4==0||KEY5==0))
{
delay_ms(40);//去抖动
key_up=0;
if(KEY1==0)
KEY1_flag=1;
if(KEY2==0)
KEY2_flag=1;
if(KEY3==0)
KEY3_flag=1;
if(KEY4==0)
KEY4_flag=1;
if(KEY5==0)
KEY5_flag=1;
}
if((KEY1==1||KEY2==1||KEY3==1||KEY4==1||KEY5==1))
{
delay_ms(10);//去抖动
key_up=0;
if(KEY1==1)
KEY1_flag=0;
if(KEY2==1)
KEY2_flag=0;
if(KEY3==1)
KEY3_flag=0;
if(KEY4==1)
KEY4_flag=0;
if(KEY5==1)
KEY5_flag=0;
}
}
按键,弹起有效
KEY_Scan函数修改为
void KEY_Scan(u8 mode)
{
staticu8 key_up=1;//按键按松开标志
if(mode)
key_up=1; //支持连按
if((KEY1==0||KEY2==0||KEY3==0||KEY4==0||KEY5==0))
{
delay_ms(10);//去抖动
key_up=0;
if(KEY1==0)
{
KEY1_flag=1;
if(0== KEY1_press_flag)
{
KEY1_Event_exec_flag= 0;
KEY1_press_flag= 1;
}
}
if(KEY2==0)
{
KEY2_flag=1;
if(0== KEY2_press_flag)
{
KEY2_Event_exec_flag= 0;
KEY2_press_flag= 1;
}
}
if(KEY3==0)
{
KEY3_flag=1;
if(0== KEY3_press_flag)
{
KEY3_Event_exec_flag= 0;
KEY3_press_flag= 1;
}
}
if(KEY4==0)
{
if(0== KEY4_flag)
{
KEY4_flag=1;
}
if(0== KEY4_press_flag)
{
KEY4_Event_exec_flag= 0;
KEY4_press_flag= 1;
}
}
if(KEY5==0)
KEY5_flag=1;
}
if((KEY1==1||KEY2==1||KEY3==1||KEY4==1||KEY5==1))
{
delay_ms(10);//去抖动
key_up=0;
if(KEY1==1)
{
KEY1_flag=0;
if(KEY1_press_flag == 1)
{
KEY1_press_flag= 0;
if(0== KEY1_Event_exec_flag)
KEY1_Event_exec_flag= 1;
}
}
if(KEY2==1)
{
KEY2_flag=0;
if(KEY2_press_flag== 1)
{
KEY2_press_flag= 0;
if(0== KEY2_Event_exec_flag)
KEY2_Event_exec_flag= 1;
}
}
if(KEY3==1)
{
KEY3_flag=0;
if(KEY3_press_flag== 1)
{
KEY3_press_flag= 0;
if(0== KEY3_Event_exec_flag)
KEY3_Event_exec_flag= 1;
}
}
if(KEY4==1)
{
if(1== KEY4_flag)
{
KEY4_flag=0;
}
if(KEY4_press_flag== 1)
{
KEY4_press_flag= 0;
if(0== KEY4_Event_exec_flag)
KEY4_Event_exec_flag= 1;
}
}
if(KEY5==1)
KEY5_flag=0;
}
}
然后,后面响应按键的操作,不再以KEY_flag为标志,而是以KEY3_Event_exec_flag为标志。
史海拾趣
|
DM642现在停工了,一个是公司也没有这方面的打算,第二是响应的人不多,第三就是花费比较大。做板还是小事,焊接也是自己不能做。如果就是我一个人用,还不如买个来得轻松了。 至于为啥做个6720的板子,第一个是它做板简单,另一个就是我还没有, ...… 查看全部问答> |
|
nandflash 的ECC校验是怎么实现的? 在写的时候产生ECC校验码, 在读的时候也产生ECC校验码, (硬件,与软件 的实现) ---------------- … 查看全部问答> |
|
请问在调用wait_event_interruptible()后,如果等待的条件一直都不满足,有timer_list 可不可以制定一个超时跳出wait_even 请问在调用wait_event_interruptible()后,如果等待的条件一直都不满足,但是又想在一定时间内返回,该怎么办啦? 我在调用wait_event_interruptible()前加了一个timer_list,(add(timer)),但是好像不管用,超时了还是不跳出sleep。请问需要 ...… 查看全部问答> |
|
定时器3秒执行一次 Invalidate(); UpdateWindow(); 复制代码 整个程序就干这一件事,隔3秒显示一张图片。但是我用wince的系统属性查看正在使用的内存数,隔几分钟就会增长4K,我联系观察了几个小时,很有规律。 void CshowphotoDlg::OnPaint() { ...… 查看全部问答> |
|
已在ce5上成功写了usb. iic. spi.键盘驱动. 觉得可以常识着写WiFi无线网卡/蓝牙驱动. 能否推荐一款资料比较多的WiFi无线网卡/蓝牙模块? 如果有开源资料更好.… 查看全部问答> |




