cortex_m3_stm32嵌入式学习笔记(二):独立按键实验(IO输入)
来源:互联网 发布:转置矩阵公式 编辑:程序博客网 时间:2024/06/05 07:50
上一个也就是第一个实验做的是关于LED的,属于IO口的输出使用,这一节实验是独立按键的使用,即IO 口的输入使用
ministm32 开发板上一共有3个独立按键,分别为 KEY0 KEY1 WK_UP 原理图如下:
注意: KEY0 KEY1 是低电平有效(即它们为低电平时代表按键按下)而 WK_UP 是高电平有效,为什么呢。。很明显,这个问题要分析上面的原理图才能知道的,好吧本渣没学过数模电电路也就勉强70多分(半本书。。还没学完),就硬着头皮来分析一下吧(对错可不保证啊。。QAQ):很明显上图有两个不认识的符号,GND 和VCC 度娘了一下
GND是接地的意思 就是GND那端的电平为0,而VCC 大概是电压源(3.3V),意味着VCC端电平为1 首先KEY0,KEY1 都是跟GND接在一块的,所以它们想要起作用电平肯定是一致的,那么为什么是低电平有效?首先对于开关,想象一下一根导线被一个开关截断,然后这根导线就断开了,怎么让它接起来呢?如果在开关处使得两点电平一致。。那么这根导线不就连起来了么(。。好像有点牵强ORZ)
ok实在不行就先记住,接下就要配置按键了。。新建两个文件key.c key.h导入工程
#include "key.h"#include "delay.h"void KEY_Init(void){GPIO_InitTypeDef GPIO_ist;//使能PORTA,PORTC时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE); //关闭JTAG 使能SWDGPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //PC5-->KEY0GPIO_ist.GPIO_Pin=GPIO_Pin_5;GPIO_ist.GPIO_Mode=GPIO_Mode_IPU;//上拉输入GPIO_Init(GPIOC, &GPIO_ist);//PA15-->KEY1GPIO_ist.GPIO_Pin=GPIO_Pin_15;GPIO_ist.GPIO_Mode=GPIO_Mode_IPU;//上拉输入GPIO_Init(GPIOA, &GPIO_ist);//PA0-->WK-UPGPIO_ist.GPIO_Pin=GPIO_Pin_0;GPIO_ist.GPIO_Mode=GPIO_Mode_IPD;//下拉输入GPIO_Init(GPIOA, &GPIO_ist);}//参数mode:0 代表不支持连续按键 非0代表支持连续按键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 WK_UP_PRES;}else if(KEY0==1&&KEY1==1&&WK_UP==0) key_up=1;return 0;}GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); 这个语句。。首先看到KEY1 对应的PA15那个口后面还多了一堆JTDI PS 什么东西的,手册上说PA15占用了JTAG的一个IO,这条语句是禁止JTAG,开启SWD 让PA15用作普通IO输出(说实话 没懂)
再看下面那个按键扫描函数,由参数决定是否支持连续按键,好吧,分析一下不支持连续按键的情况吧,假如参数传入的是0,按下键后没松手,第一次扫描之后,key_up变为0了,注意第二次扫描的时候,由于用静态关键字static key_up并不会重新赋值1(这个可以度娘一下static用法),依旧是0,那么就会返回0,。。之后啥也不会执行了。。
直到松手
接下来写key.h 主要是一些关键字的宏定义
#ifndef _KEY_H#define _KEY_H#include "sys.h"#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#define KEY1_PRES 2#define WK_UP_PRES 3void KEY_Init(void);u8 KEY_Scan(u8 mode);#endif主函数(很简单的控制。。一眼就能看懂拉)
#include "led.h"#include "sys.h"#include "delay.h"#include "key.h"int main(void){u8 t;delay_init();LED_Init();KEY_Init();LED0=0;while(1){t=KEY_Scan(0);switch(t){case KEY0_PRES:LED0=!LED0;break;case KEY1_PRES:LED1=!LED1;break;case WK_UP_PRES:LED0=!LED0;LED1=!LED1;break;//default :delay_ms(10);}}}
忘记了既然用按键控制led当然也要配置led 可以把上次做led实验写的led.c led.h 添加的工程里面去
再贴一下吧
led.c
#include "led.h"void LED_Init(void){GPIO_InitTypeDef GPIO_ist;//LED0 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE); GPIO_ist.GPIO_Pin=GPIO_Pin_8;//LED0-->PA.8 GPIO_ist.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_ist.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_ist);GPIO_SetBits(GPIOA,GPIO_Pin_8);//LED1GPIO_ist.GPIO_Pin=GPIO_Pin_2; GPIO_Init(GPIOD,&GPIO_ist);GPIO_SetBits(GPIOD,GPIO_Pin_2); }
led.h
#ifndef _LED_H#define _LED_H#include "sys.h"#define LED0 PAout(8) //PA 8#define LED1 PDout(2) //PD 2void LED_Init(void);#endif
- cortex_m3_stm32嵌入式学习笔记(二):独立按键实验(IO输入)
- cortex_m3_stm32嵌入式学习笔记(五):独立看门狗实验(IWDG)
- cortex_m3_stm32嵌入式学习笔记(二十三):红外遥控实验(输入捕捉+解码)
- cortex_m3_stm32嵌入式学习笔记(十):输入捕捉实验(定时器的输入捕捉)
- cortex_m3_stm32嵌入式学习笔记(七):独立看门狗&窗口看门狗
- cortex_m3_stm32嵌入式学习笔记(一):建立工程模板+跑马灯实验(IO输出)
- cortex_m3_stm32嵌入式学习笔记(四):外部中断实验
- cortex_m3_stm32嵌入式学习笔记(六):窗口看门狗实验(WWDG)
- cortex_m3_stm32嵌入式学习笔记(二十):IIC实验(I2C串行总线)
- cortex_m3_stm32嵌入式学习笔记(二十四):内存管理实验(动态内存)
- cortex_m3_stm32嵌入式学习笔记(二十一):SPI实验(通信总线)
- cortex_m3_stm32嵌入式学习笔记(二十二):触摸屏实验(触摸屏驱动)
- cortex_m3_stm32嵌入式学习笔记(三):串口实验(串口通信)
- cortex_m3_stm32嵌入式学习笔记(八):定时器中断实验(定时器的更新中断)
- cortex_m3_stm32嵌入式学习笔记(九):PWM 输出实验(定时器的PWM输出)
- cortex_m3_stm32嵌入式学习笔记(十五):待机唤醒实验(WK_UP外部中断)
- cortex_m3_stm32嵌入式学习笔记(十六):ADC实验(模数转换)
- cortex_m3_stm32嵌入式学习笔记(十八):DAC实验(数模转换)
- IQueryable与IEnumberable的区别
- javascript自动刷新页面代码
- 【PHP】 php 如何操作json格式数据
- zookeeper分布式锁(八)
- Python 中文处理
- cortex_m3_stm32嵌入式学习笔记(二):独立按键实验(IO输入)
- FastDFS基于php的API
- 计算机网络期末考试
- SI存在的原因
- pat1008
- jquery $(document).ready() 与window.onload的区别
- java Timer ,TimerTask执行定时任务
- javascript:异步化编程,仿NodeJs的小样
- 在virtualbox+centOS下安装Python的全步骤和注意事项