历史上的今天
今天是:2025年07月21日(星期一)
2018年07月21日 | STM32按键控制开关灯
2018-07-21 来源:eefocus
1.按键操作的原理
1.在stm32f103rc中,存在三个按键(不包括复位),分别为key0(PC5),key1(PA15),wkup(PA0),按下key0和key1时对应的io口输出低电平,按下wkup对应io口输出高电平
2.所以可以采用库函数读取io口的电平,从而用不同的情况来控制灯的开闭
GPIO_ReadInputDataBit(GPIOX,GPIO_PIN_a)读取相应接口电平
#define KEY0 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)
#define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)
#define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define KEY0_PRES 1 //KEY0
#define KEY1_PRES 2 //KEY1
#define WKUP_PRES 3 //wkup
3.实现按键的初始化和扫描功能
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
//防止串口复用
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//³õʼ»¯PC5
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PA0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
4.实现按键扫描
1.建立static变量,从而实现短按按钮功能
2.短按按钮:首先扫描上一次的电平,如果为关闭状态(说明没按),然后再进行下一次操作
3.长按按钮:重新创建一个变量,实现长按按钮功能(函数中途不存在间断)
4.注意消抖
u8 KEY_Scan(u8 mode)//扫描
{
static u8 key_up=1;
if(mode)key_up=1;
if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
{
delay_ms(10);
key_up=0;
if(KEY0==0)return KEY0_PRES;
else if(KEY1==0)return KEY1_PRES;
else if(WK_UP==1)return WKUP_PRES;
}
else if
(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;
return 0;
}
5.主函数部分
//reset , wk_up(PA0),KEY0(PC5),KEY1(PA15)
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "LED.H"
void LED_init(void);
void key_init();
int main(void)
{
u8 t;
delay_init();
LED_Init();
KEY_Init();
GPIO_SetBits(GPIOA,GPIO_Pin_8);//¶ÔÓÚPA8Êä³ö¸ßµçƽ
GPIO_SetBits(GPIOD,GPIO_Pin_2);//¶ÔÓÚPD2Êä³ö¸ßµçƽ
while(1)
{
t=KEY_Scan(0);
switch(t)
{
case KEY0_PRES:
GPIO_ResetBits(GPIOA,GPIO_Pin_8);//low
break;
case KEY1_PRES:
GPIO_ResetBits(GPIOD,GPIO_Pin_2);//low
break;
case WKUP_PRES:
GPIO_ResetBits(GPIOA,GPIO_Pin_8);//low
GPIO_ResetBits(GPIOD,GPIO_Pin_2);//low
break;
default:
delay_ms(10);
}
}
}
史海拾趣
|
问题如下: 1. PC 能和该设备直接用网线点对点连接吗? 怎么设置两者的IP.? 2. 在VS2008下开发了一个WinCE程序,运行在模拟器中,能否实验第一个问题,我安装了Vir ...… 查看全部问答> |
|
摘要:本文介绍了在单片机的键盘上实现“一键多用”的方法和技巧。并给出了程序流程图和单片机的汇编语言程序。 关键词:单片机 键盘 I/O接口 键盘是实现人机对话的重要窗口。在许多由MCS-51系列单片机组成的“嵌入式” ...… 查看全部问答> |
|
我使用开发板带的BSP自己定制了一个wince5.0的系统,加入了Hive-based Registry功能 在没有加入.Net Compact Framework 2.0的时候,系统可以正常启动,注册表信息也可以保存 但加入.Net Compact Framework 2.0后,未做任何其他修改的情况下,内核 ...… 查看全部问答> |
|
Platform Manager server failed??这是什么原因? 我的程序在:pocket pc 上可以运行 但是选择:standardsdk 总是报错: Platform Manager server failed 为什么不可以啊? Transpor配置好了 Startup怎么配置啊? … 查看全部问答> |
|
我们用的是STM32F101x4,客户返回来维修的机子很多是单片机短路的,特别是电源脚和34脚对地短路。我们做老化试验时,只是开机充放电,老化一段时间后,有一台机子莫名其妙的单片机也坏了。 对于STM32单片机的测试应该重点测试什么呢?什么最容易引 ...… 查看全部问答> |
|
对于自制的螺旋天线,安装需要注意哪些常见事项?如果安装在塑料壳子中有些什么影响么? 自制需要注意什么事项? 对于其它类型天线也能不能介绍介绍?请这种针对操作方面的事项。 发射端想用小一点的不露在外边的天线… 查看全部问答> |
|
分享一份我们自己做的L293D电机驱动模块资料,希望多多捧场哈! 顺便打个小广告哈,新开小店,微麦电子(研究生科创团队):电子模块销售、项目承接、产品定制! 微麦电子://shop109927709.taobao.com … 查看全部问答> |
|
有下面的资料UART就ok了。P20.P21.是EUSCI的输出端口。 还要知道5969的时钟结构 然后参考例程。例程在CCS下的library下可以找到 实际使用只需要修改EUSCI的时钟源,以及采样参数,TI提供了在线计算,地址: http://software-dl.ti.com/ms ...… 查看全部问答> |




