stm32怎样检测stm32按键扫描程序是否按下

查看: 3775|回复: 13
初学stm32,按键试验,按键按下触发事件及按键抬起触发事件
主题帖子精华
初级会员, 积分 128, 距离下一级还需 72 积分
在线时间11 小时
key0按下红灯亮,key0抬起红灯灭;key1按下绿灯亮,key1抬起绿灯灭。。另外mode为0是一个按键按下则锁定三个按键,抬起时解锁;mode为1时一个按键按下只锁定本按键,抬起时解锁。key_prs,key0Judge,key1Judge,wk_upJudge均为静态变量。程序无任何实际意义,纯属脑子抽筋。。。以下为按键扫描代码:
[C] 纯文本查看 复制代码u8 KEY_Scan(u8 mode)
if(mode)key_prs=1;
if(key_prs&&(KEY0==0||KEY1==0||WK_UP==1))
//按键按下触发事件
delay_ms(10);
key_prs = 0;
if(KEY0 == 0 && key0Judge == 0)
key0Judge = 1;
return KEY0_DOWN;
if(KEY1 == 0 && key1Judge == 0)
key1Judge = 1;
return KEY1_DOWN;
if(WK_UP == 1 && wk_upJudge == 0)
wk_upJudge = 1;
return WKUP_DOWN;
if((KEY0 == 1 || KEY1 == 1 || WK_UP == 0)&& key_prs == 0)
//按键抬起触发事件
delay_ms(10);
if(KEY0 == 1 && key0Judge == 1)
key0Judge = 0;
key_prs = 1;
return KEY0_UP;
if(KEY1 == 1 && key1Judge == 1)
key1Judge = 0;
key_prs = 1;
return KEY1_UP;
if(WK_UP == 0 && wk_upJudge == 1)
wk_upJudge = 0;
key_prs = 1;
return WKUP_UP;
以下为按键数据处理代码:
[C] 纯文本查看 复制代码void keytest(u8 mode)
t = KEY_Scan(mode);
case KEY0_DOWN:
case KEY1_DOWN:
case WKUP_DOWN:
LED0 = 0;LED1 = 0;
case KEY0_UP:
case KEY1_UP:
case WKUP_UP:
LED0 = 1;LED1 = 1;
主题帖子精华
新手上路, 积分 7, 距离下一级还需 43 积分
在线时间0 小时
对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源文件的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量
主题帖子精华
新手上路, 积分 24, 距离下一级还需 26 积分
在线时间0 小时
我想知道这快代码的设置mode怎么实现一个能连按&一个不能连按。求大神帮忙
主题帖子精华
新手上路, 积分 24, 距离下一级还需 26 积分
在线时间0 小时
回复【2楼】14haonan:
---------------------------------
我是说原子板上例程里的那段程序
主题帖子精华
在线时间784 小时
自己分析mode是怎么影响key_prs的!
道不同,不相与为谋
主题帖子精华
金钱114908
在线时间862 小时
回复【3楼】14haonan:
---------------------------------
你的代码都不是我们的啊。。。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
初级会员, 积分 128, 距离下一级还需 72 积分
在线时间11 小时
回复【5楼】正点原子:
---------------------------------
是根据例程改的,还有点原代码的影子,功能不一样了。
主题帖子精华
初级会员, 积分 128, 距离下一级还需 72 积分
在线时间11 小时
回复【2楼】14haonan:
---------------------------------
if(mode)key_up=1;&主要是这句,mode=1,则每次进入函数都会执行key_up=1,然后有按键按下第二个if语句就可以进入执行;mode=0,则key_up=1不会被执行,按键按下第一次扫描按键时第二个if语句进入后key_up=0,则除非按键抬起执行key_up=1,否则key_up将一直为0,进而第二个if语句不会被执行,也就不会连续扫描按键了。
主题帖子精华
新手上路, 积分 24, 距离下一级还需 26 积分
在线时间0 小时
回复【7楼】aiwl123:
---------------------------谢谢大神指导
主题帖子精华
初级会员, 积分 128, 距离下一级还需 72 积分
在线时间11 小时
回复【8楼】14haonan:
---------------------------------
共同学习,共同进步。
主题帖子精华
初级会员, 积分 77, 距离下一级还需 123 积分
在线时间12 小时
回复【7楼】aiwl123:
---------------------------------
学习了
主题帖子精华
中级会员, 积分 324, 距离下一级还需 176 积分
在线时间37 小时
我也遇到了这个问题
主题帖子精华
中级会员, 积分 324, 距离下一级还需 176 积分
在线时间37 小时
回复【7楼】aiwl123:
-------------------------------
请问开始的static&u8&key_up=1&是用来做什么的
主题帖子精华
初级会员, 积分 128, 距离下一级还需 72 积分
在线时间11 小时
回复【12楼】小板子:
---------------------------------
定义初始值为1并且key_up为静态变量,再次进入函数时其值为上次退出之前的值。相当于在此.c文件开头定义全局变量u8&key_up&=&1,效果一样。个人理解,有错误请指正。
Powered by查看: 2340|回复: 11
有关按键的检测问题
主题帖子精华
中级会员, 积分 412, 距离下一级还需 88 积分
在线时间0 小时
对于按键的检测问题
这个东西有点着急!一般而言,检测按键的话,主要是:
检测GPIO的电平的高低,然后再使用delay();来进行简单的消抖,然后再次确定电平的高低
但是这个原理理论可行,但是在检测的时候总是不稳定!大家有什么好的建议吗?
或者说大家有什么好的按键检测方面的建议!!非常感谢大家的帮助!!先谢谢各位.....
按键检测的时候,我直接没延时,
#define&KEY1&&nbspAin(0)
int&Key0=1
if(Key0&&(KEY1==0)){....}&&&&这样执行后的效果不错!!有试过!!!
开源的世界,你可以做主!!
主题帖子精华
中级会员, 积分 412, 距离下一级还需 88 积分
在线时间0 小时
按键检测的时候,我直接没延时,
#define&KEY1&&nbspAin(0)
int&Key0=1
if(Key0&&(KEY1==0)){....}&&&&这样执行后的效果不错!!有试过!!!
开源的世界,你可以做主!!
主题帖子精华
在线时间595 小时
是不是你的delay函数延时时间不合适,或者程序其他地方有问题,这个延时消抖并不只是理论可行,不稳定应该不是这个延时消抖的方法不实用,而是实现这个方法的过程有问题。
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
主题帖子精华
中级会员, 积分 412, 距离下一级还需 88 积分
在线时间0 小时
回复【2楼】龙之谷:
---------------------------------
我做按键检测的时候,先检测一下是否为高或者是低电平,然后延时,然后再检测其是否为高电平或者低电平,
如果延时前后的高电平或者低电平一样,那证明却是检测到了,此处按键检测有效!!
关于延时的问题,对于按键的检测的话,我一般是使用软件延时来进行消抖,不知是否和大家的有些出入!!!非常感谢....
开源的世界,你可以做主!!
主题帖子精华
高级会员, 积分 939, 距离下一级还需 61 积分
在线时间345 小时
回复【3楼】tsacy:
---------------------------------
实用的按键扫描程序当然不能这样写了,你要周期性的去判断按键状态,状态没改变就计时。
主题帖子精华
中级会员, 积分 412, 距离下一级还需 88 积分
在线时间0 小时
回复【4楼】TinyBoy:
---------------------------------
按键检测的时候,我直接没延时,
#define&KEY1&&nbspAin(0)
int&Key0=1
if(Key0&&(KEY1==0)){....}&&&&这样执行后的效果不错!!有试过!!!
开源的世界,你可以做主!!
主题帖子精华
新手上路, 积分 45, 距离下一级还需 5 积分
在线时间1 小时
回复【6楼】tsacy:
---------------------------------
这个Key0&=1&放在这里是干什么用的?&和直接if(key1==0)有什么区别?
主题帖子精华
高级会员, 积分 939, 距离下一级还需 61 积分
在线时间345 小时
回复【6楼】tsacy:
---------------------------------
理论上必须去抖
主题帖子精华
在线时间595 小时
回复【3楼】tsacy:
---------------------------------
自己写一个短的延时函数,按键稳定需要5ms~10ms,你的延时函数可以在10~15ms之间,然后进行按键测试,与前面进行对比
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
主题帖子精华
在线时间595 小时
回复【4楼】TinyBoy:
---------------------------------
这个不太明白,能够进一步说明&&“要周期性的去判断按键状态,状态没改变就计时”&&?
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
主题帖子精华
高级会员, 积分 939, 距离下一级还需 61 积分
在线时间345 小时
回复【10楼】龙之谷:
---------------------------------
你做项目按键扫描不是这样写么?按键按下或者释放时是不是状态改变了,按下以后或者释放了,是不是状态就不改变了,然后处理就行了嘛。
主题帖子精华
在线时间595 小时
回复【11楼】TinyBoy:
---------------------------------
以前都是在开发板上实验,实际工作中还没使用到按键扫描,下一个开发的设备需要矩阵按键,等测试的时候实际体验一下
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
Powered by最近在自学STM32,写了一个按键中断程序,但是中断总是不响应...望大虾赐教,谢谢....程序如下-送中断到底是发送完成后触发中
没有你要的?请搜索……
你现在正在浏览:
最近在自学STM32,写了一个按键中断程序,但是中断总是不响应...望大虾赐教,谢谢....程序如下 送中断到底是发送完成后触发中
最近在自学STM32,写了一个按键中断程序,但是中断总是不响应...望大虾赐教,谢谢....程序如下
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE.EXTI_Line = EXTI_Line3;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_IEXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_FEXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure); }void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitSSysTick_Configuration();EXTI_Configuration();NVIC_Configuration();GPIO_Configuration(),&GPIO_InitStructure);GPIO_ResetBits(GPIOC, GPIO_Pin_6 | GPIO_Pin_7);GPIO_ResetBits(GPIOD, GPIO_Pin_6 | GPIO_Pin_13);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);GPIO_Init(GPIOC,&GPIO_InitStructure), ENABLE);/*GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP.GPIO_Pin = GPIO_Pin_3;GPIO_InitSGPIO_InitStructure.h&#include &GPIO_InitStructure.h&#include &*/GPIO_InitSstm32f10x.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;}int main(void){RCC_Configuration().GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_13;while(1);}void EXTI3_IRQHandler(void){if (GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 0){Delay(5);if (GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 0){ GPIO_SetBits(GPIOC;#include &stm32f10x_gpio,GPIO_Pin_6).GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOD.GPIO_Mode = GPIO_Mode_IN_FLOATING.GPIO_Speed = GPIO_Speed_50MHz.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOE,&GPIO_InitStructure);stm32f10x_#include &Delay_nms.h&stm32f10x_exti.h&quot#include &NVIC_Init(&NVIC_InitStructure);}void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitSRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOE |
RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO.h&#include &quot.NVIC_IRQChannel = EXTI3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;void RCC_Configuration(void){SystemInit(); }void EXTI_Configuration(void){EXTI_InitTypeDef EXTI_InitSGPIO_EXTILineConfig(GPIO_PortSourceGPIOE;GPIO_InitSGPIO_InitSmisc.h&NVIC_InitSGPIO_ResetBits(GPIOD,GPIO_Pin_6);}}//EXTI_ClearITPendingBit(EXTI_Line3);EXTI_ClearFlag(EXTI_Line3);}#ifdef USE_FULL_ASSERTvoid assert_failed(uint8_t* file,uint32_t line){while(1){}}#endif有人说是因为没开中断的原因,但是我查了很多资料 也不知道中断是在哪开的?还望各位大虾赐教 谢谢;GPIO_InitStructure,GPIO_Pin_6);GPIO_SetBits(GPIOD,GPIO_Pin_6);}else{GPIO_ResetBits(GPIOC;GPIO_Init(GPIOC,&GPIO_InitStructure),GPIO_PinSource3);EXTI_InitStructure
试了一下这个程序。。可以进中断的。。如果你进不了中断可能是硬件连接的问题吧。。把PE3的GPIO_Mode改成IPU或者IPD再试试
一定要下载那个单片机的手册。有的里边有例子程序的。,我不知道我说的对不对,按键中断就是循环时候你扫描到按键的电平是高电平换低电平的时候,你程序写的挺有意思。希望对你有帮助大哥,应该有,像时间,建议你下载几个短的例子看看,还有串口那样,配置寄存器时候进入中断,这个就要查单片机手册了。希望对你有帮助。。。 大哥刚没看你程序,我又看了一眼,STC。对了,还有一点,触发时间,还有就是,做这个,比如基于STM32的温湿度传感器程序怎么写的,有可能能在里边找到你想要的代码,这个单片机我没用过,呵呵,我只写过PIC,51,ARM的
学习stm32找工作:
STM32的性能在32位的同类型芯片中算是性能比较高级的芯片了。cortex—M3的内核在应用领域还...
STM32 在主程序中运行可以的eeprom读写函数 在中断中为啥无法运行:
可以帮你写的
学习STM32一定要用到汇编语言吗?我只会C语言怎么办?:
在嵌入式开发中C语言和汇编两种语言相比。汇编作为低级语言,是仅次于机器语言和硬件联系最紧密的语言;而...
各位大神,小弟刚学的STM32,想写一个小程序,读取EEPROM中的一个字节,这个程序错在哪里?:
关注这个问题
用stm32写一个八位流水灯的程序:
//工程不管哦亲//默认共阳极//头文件自己写//这是.c文件注意函数声明哦亲void GPIO_I...
最近在学stm32,但是不清楚什么时候把变量定义成u8,什么时候定义成vu8,我知道u8是unsi:
看看这篇文章,或许对你有帮助 /yc_sunniwell...
不知有没有人对C++开发STM32感兴趣的,来讨论些问题:
  因为一开始我自学的就是C++,后来玩单片机以后才使用C语言来开发东西,也写过一些程序了,   但...
STM32 SPI 读写一个字节函数:
问题1:通过SPI发送0xFF,接收到的是SPI另一端缓冲区数据。 问题2:这里就是一个超时处理,免...
自学stm32时碰到的问题。串口有同步和异步模式。:
异步通信,是指数据传送以字符为单位,字符与字符间的传送是完全异步的,位与位之间的传送基本上是同步的。...
STM32外部中断void EXTI15_10_IRQHandler(void):
调用这个词不是很准确,假设你讲的是io对应的中断服务. stm32的每个io都可以对应一个exit中...
也许你也感兴趣的内容按键扫描问题【stm32吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:26,640贴子:
按键扫描问题收藏
void KEY_Init(void){GPIO_InitTypeDef GPIO_InitS RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);//使能PORTA,PORTC时钟//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试GPIO_InitStructure.GPIO_Pin
= GPIO_Pin_2 | GPIO_Pin_3;//PC2GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC2GPIO_InitStructure.GPIO_Pin
= GPIO_Pin_1;//PC1GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOA12// GPIO_WriteBit(GPIOA,GPIO_Pin_12,0);GPIO_ResetBits(GPIOC,GPIO_Pin_3);GPIO_SetBits(GPIOC,GPIO_Pin_2);} //按键处理函数//返回按键值//mode:0,不支持连续按;1,支持连续按;//返回值://0,没有任何按键按下u8 KEY_Scan(u8 mode){ static u8 key_up=1;//按键按松开标志if(mode)key_up=1; //
PCout(3)=0;//
PCout(2)=1;//PAout(12)=1;if(key_up&&GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)==0){
delay_ms(10);key_up=0;if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)==0)
return 1;}else if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)==1)key_up=1;
return 0;// 无按键按下}#include &stm32f10x.h&#include &pwm.h&#include &led.h&#include &sys.h&#include &key.h&#include &delay.h& void Delay(u32 count) {
for(;i&i++); } int main(void) {u8 t=0;KEY_Init();
t=KEY_Scan(0);switch(t){
PCout(2)=0;
delay_ms(10);}
}各位大神,程序的目的是PC3一直输出低电平给按键一端,用PC1检测按键另一端的电平,如果按键按下由PC2输出低电平,可是程序一直输出不了低电平,求解各位
大皇帝页游新区入口,三国SLG战争页游,点击领取礼包,新服送首冲高返利!
Afio是不是不开启啊
你开始就把PC2置位了,后面也没有改变,肯定一直是高电平啊。
登录百度帐号推荐应用匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。

我要回帖

更多关于 stm32 触摸按键 的文章

 

随机推荐