历史上的今天
今天是:2025年06月21日(星期六)
2019年06月21日 | stm32之按键实验
2019-06-21 来源:eefocus
前言:这个实验比较简单,就是对io口的配置。
实验现象
up键用来打开led灯,down键用于关闭led灯,left键用于打开蜂鸣器,right用于关闭蜂鸣器。
操作步骤
1.初始化用到的io口
void key_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//打开io口的时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);//打开io口的时钟
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;//上键,模式为输入模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//设定管脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN;//下啦模式
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;//RIGHT、down、left KEY
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上啦模式
GPIO_Init(GPIOE,&GPIO_InitStructure);
}
注意:这里按键的io口为输入功能,所以模式为输入模式。另外上啦和下拉根据电路图而定。还有,因为为输入模式,所以之前有一个输出模式选择(推挽输出)就没有了。
2.按键的检测
void key_scan()
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)//这个函数用于读取管脚的电平
{
delay_ms(10);//消抖
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)//再次判断
{
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0));//看是否按键抬起来了
GPIO_ResetBits(GPIOF,GPIO_Pin_10);//open the led
}
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)==0)
{
delay_ms(10);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)==0)
{
while(!(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)));
GPIO_SetBits(GPIOF,GPIO_Pin_10);//turn off the led
}
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)==0)//open beep
{
delay_ms(10);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)==0)
{
while(!(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)));
GPIO_ResetBits(GPIOF,GPIO_Pin_8);
}
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)//close beep
{
delay_ms(10);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)
{
while(!(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)));
GPIO_SetBits(GPIOF,GPIO_Pin_8);
}
}
}
说明:在这里的程序我没有按照教程里的程序里来写,而是根据自己的理解方式来写的。我这里将按键的检测和相应的操作写在了一起。如果你觉得麻烦,你也可以另写一个操作函数。
注意:这里的消抖程序一定要记住
主函数:
int main()
{
RCC_HSE_Config(8,336,2,7);//设置系统时钟。注意这个函数要自己写放在主函数前。
Beep_Init();//蜂鸣器初始化
SysTick_Init(168);//设置systick的时钟源
key_init();
LED_Init();
while(1)
{
key_scan();//不停的去检测按键的状态
}
}
补充:这个实验的原理是不断去检测按键的状态,而如果用中断就会很方便,让系统自己去检测按键的状态
史海拾趣
|
其实,现在无论TI也好、Xilinx、Altera、微星,ADI、飞思卡尔等世界级大公司都将自己生产的设备用inlined wraper s-function或代码继承工具写成了一个个的simulink模块,还有一些经过实践验证的常用算法MathWorks也用这些工具把他们变成了算法模型 ...… 查看全部问答> |
|
Wince5.0 上菜单 build project和build OS的区别 菜单build project和build OS下都有build,sysgen,make image,两个菜单下的功能有什么区别啊… 查看全部问答> |
|
请教win7下WM设备中心与WinCE5仿真器或设备无法连接的问题 windows mobile设备中心的状态始终是未连接,并且无论通过仿真器还是通过USB连真机都这样。 难道是WIN7太高级了,不愿认wince5的东西了? 请教应用如何配置?… 查看全部问答> |
|
(悭钱十月)活跃一下板块,我给大家说道说道怎么免费搞到开发板!! 不知不觉已经大四很长时间了。回首看看,这四年的成果,除了一个个五花八门的证书外,作为电子人,比别人更多的是攒了四年的元器件和开发板。 今天就给大家说道说道,俺的开发板都是怎么来的。其实每个开发板的背后都有着一段,一见钟情,刻骨铭心 ...… 查看全部问答> |
|
自用机器,因买了周立功的X8故闲置便宜出售,无任何质量问题,专用电源+主机。 支持淘宝交易,有问题您退给我,350RMB,包全世界快递费。 http://item.taobao.com/auction/item_detail.htm?item_num_id=7751583002 … 查看全部问答> |
|
外部完成定时器设定修改的方法 PLC控制系统在使用过程中,经常要修改一些参数,最常见的就是修改定时器的设定值。为了操作员方便修改定时器的设定值,可用下列方法来实现: 1、 使用人机界面 PLC可以用触摸屏、文本显示器或工控机作人机界面,方便 ...… 查看全部问答> |
|
STM8S105S4 I2C这样配置可以从机发数据,从机接数据就不行,是什么问题 //I2C端口初始化 GPIO_Init(GPIOE,GPIO_PIN_1|GPIO_PIN_2, GPIO_MODE_OUT_OD_HIZ_SLOW); void I2C_init(void) { I2C_CCRH = 0; //标 ...… 查看全部问答> |
|
void TIM2_INIT() { RCC->APB1ENR |= (1<<0); //TIM2EN 定时器2时钟使能 TIM2->PSC |= 63999 ...… 查看全部问答> |
|
请教一下: 刚刚下载一个3.40的30天试用版,但是看不了build之后的代码大小报告 XXXX BYTE RAM,XXXX byte FLASH..... 另外,我是在安装IAR之前与之后设置了两个系统还原点(XP系统) 如果30天之后,我运行系统还原的话.....???会有什么结果呢?… 查看全部问答> |




