LK32T102单片机 操作GPIO实现 主按钮、矩阵按键 和 蜂鸣器
前言:
这里我们接着上一次的LK32T102 单片机 操作GPIO实现流水灯(1)来继续深入学习LK32T102 单片机的GPIO口操作。这里我们为大家讲解一下GPIO口 如何实现(主板按钮 与 矩阵按钮)按键扫描和蜂鸣器的启动与停止。
一、蜂鸣器
由这张原理图我们可以知道蜂鸣器的IO口是PA12,所以我们就可以直接通过对这个IO口置0或者置1来达到操作蜂鸣器开启与关闭。
<BEEP.h>
#ifndef __BEEP_H
#define __BEEP_H #include <SC32F5832.h>
#include <GPIO.h>#define BUZ_TGL PA_OUT_TOGGLE(12) //翻转蜂鸣器#define BUZ_OFF PA_OUT_HIGH(12) //PA12输出高电平 关闭蜂鸣器
#define BUZ_ON PA_OUT_LOW(12) //PA12输出低电平 开启蜂鸣器void BUZ_init(void); //蜂鸣器初始化#endif
<BEEP.c>
#include <SC32F5832.h>
#include <DevInit.h>
#include "delay.h"
#include <LED.h>
#include <GPIO.h>
#include <BEEP.h>/***************************************************************蜂鸣器初始化
****************************************************************/
void BUZ_init(void)
{//蜂鸣器 -> PA12 初始化IO口GPIO_AF_SEL(DIGITAL, PA, 12, 0); //使能蜂鸣器接口为输出PA_OUT_ENABLE(12); //关蜂鸣器buzzer_off;
}
<Devlint.c>
#include <SC32F5832.h>
#include <DevInit.h>
#include "delay.h"
#include "CLK.h"
#include <LED.h>
#include <KEY.h>
#include <BEEP.h>
#include <OLED.h>
#include "ULN2003.h"
#include "HC_SR501.h"
#include "GY302.h"
#include "smg_4.h"
#include <DS2.h>/***************************************************************系统初始化
****************************************************************/
void Device_Init()
{//-- 时钟 初始化 --//SysCLK_Init(); // 系统时钟初始化//-- 元器件 初始化 --//BUZ_init(); // 蜂鸣器 初始化
}
<main.c>
/* Includes ------------------------------------------------------------------*/
#include <SC32F5832.h>
#include <DevInit.h>
#include "delay.h"
#include <GPIO.h>
#include <LED.h>
#include <BEEP.h>
#include <KEY.h>
#include <OLED.h>
#include "ULN2003.h"
#include "HC_SR501.h"
#include "GY302.h"
#include "keybroad4x4.h"
#include "LCD12864.h"int main()
{delay_ms(100); //延时100ms Device_Init(); //系统初始化,我将 蜂鸣器初始化函数 放在了这里面while(1){BUZ_ON;delay_ms(1000);BUZ_OFF;delay_ms(1000); // 蜂鸣器以1HZ 一响一停}
}
二、主控板按钮
这里的主控板按钮指的就是主板上的四个主按钮(S2、S3、S4、S5),S1为复位按钮不需要我们进行操作。操作主按钮的方式与51单片机的操作方法大致相同。使用 if 函数 对主按钮来进行按键扫描,在按键扫描函数过后加入按键功能。由下图可知,主控按钮分别对应这PA0、PA1、PA10、PA11这四个IO口。
<key.h>
#ifndef __KEY_H
#define __KEY_H #include <SC32F5832.h>
#include <GPIO.h>#define S2 ((Key_TrgValue >> 0) & 0x01)
#define S3 ((Key_TrgValue >> 1) & 0x01)
#define S4 ((Key_TrgValue >> 10) & 0x01)
#define S5 ((Key_TrgValue >> 11) & 0x01)void KEY_init(void); //主板按键初始化
void Key_ReadSta_Task(void); //主板按键扫描
void Key_Ctrl(void); //主板按键控制#endif
<key.c>
#include <SC32F5832.h>
#include <DevInit.h>
#include <KEY.h>
#include "delay.h"
#include <LED.h>
#include <BEEP.h>uint16_t Key_TrgValue;
uint16_t Key_ContValue;/***************************************************************主板按键初始化
****************************************************************/
void KEY_init(void)
{//按键 PA0 -> S2 PA1 -> S3 PA10 -> S4 PA11 -> SB5GPIO_AF_SEL(DIGITAL, PA, 0, 0); // 按键S2GPIO_AF_SEL(DIGITAL, PA, 1, 0); // 按键S3GPIO_AF_SEL(DIGITAL, PA, 10, 0); // 按键S4GPIO_AF_SEL(DIGITAL, PA, 11, 0); // 按键S5//按键端口配置 浮空GPIO_PUPD_SEL(PUPD_PU, PA, 0 );GPIO_PUPD_SEL(PUPD_PU, PA, 1 );GPIO_PUPD_SEL(PUPD_PU, PA, 10 );GPIO_PUPD_SEL(PUPD_PU, PA, 11 );//IO口输入使能 PA_OUT_DISABLE(0); PA_OUT_DISABLE(1); PA_OUT_DISABLE(10); PA_OUT_DISABLE(11);}/***************************************************************主板按键控制函数
****************************************************************/
void Key_Ctrl(void)
{Key_ReadSta_Task();if(S2 == 1) {LED_TGL(0); // 按下LED1在 亮与灭 之间切换}if(S3 == 1) {BUZ_TGL; // 按下蜂鸣器 在 响与不响 之间切换}if(S4 == 1){LED_TGL(2);LED_TGL(3); // 按下LED3、LED4在 亮与灭 之间切换}if(S5 == 1){LED_TGL(4); LED_TGL(5);LED_TGL(6); // 按下LED5、LED6、LED7在 亮与灭 之间切换}
}/***************************************************************主板按键S2、S3、s4、s5扫描
****************************************************************/
void Key_ReadSta_Task(void)
{ uint16_t ReadKey_Data = 0; ReadKey_Data = (PA -> PIN) ^ 0x0c03;//读取按键输入数据ReadKey_Data &= 0x0c03; //将原键值取反Key_TrgValue = ReadKey_Data & ( ReadKey_Data ^ Key_ContValue ); //保存键值Key_ContValue = ReadKey_Data; //保存键值作为按键松开标志
}
<Devlint.c>
#include <SC32F5832.h>
#include <DevInit.h>
#include "delay.h"
#include "CLK.h"
#include <LED.h>
#include <KEY.h>
#include <BEEP.h>
#include <OLED.h>
#include "ULN2003.h"
#include "HC_SR501.h"
#include "GY302.h"
#include "smg_4.h"
#include <DS2.h>/***************************************************************系统初始化
****************************************************************/
void Device_Init()
{//-- 时钟 初始化 --//SysCLK_Init(); // 系统时钟初始化//-- 元器件 初始化 --//KEY_init(); // 按键 初始化LED_init(); // LED 初始化BUZ_init(); // 蜂鸣器 初始化
}
<main.c>
/* Includes ------------------------------------------------------------------*/
#include <SC32F5832.h>
#include <DevInit.h>
#include "delay.h"
#include <GPIO.h>
#include <LED.h>
#include <BEEP.h>
#include <KEY.h>
#include <OLED.h>
#include "ULN2003.h"
#include "HC_SR501.h"
#include "GY302.h"
#include "keybroad4x4.h"
#include "LCD12864.h"int main()
{delay_ms(100); //延时100ms Device_Init(); //系统初始化while(1){Key_Ctrl(); }
}
三、矩阵按键
因为矩阵按键式4x4的点阵,所以我们采用的是行、列扫描的方式,这里为四行的IO口置1,四列的IO口置0;当没有按键按下时, 四行的IO检测出来就全是高电平;如果有按键按下,那个按键所处的哪一行的IO口就会变为高电平。然后再反过来四行的IO口置0,四列的IO口置1,当没有按键按下时, 四列的IO检测出来就全是高电平;如果有按键按下,那个按键所处的哪一列的IO口就会变为高电平。这样我们相当于知道了x、y的坐标,这样我们就可以直接 知道那个按键被按下。
<keybroad.c>
/*
上拉输入:有上拉电阻按键未按下时端口接高电平,即高电平 1 状态---3.3v按键按下时端口接低电平,即低电平 0 状态-------0
下拉输入:有下拉电阻按键未按下时端口接低电平,即低电平 0 状态---0v按键按下时端口接高电平,即高电平 1 状态------3.3v
*//**
* 4*4矩阵键盘接线说明
* PB8 -> R1 //row
* PB9 -> R2
* PB10 -> R3
* PB11 -> R4* PB12 -> C1 //column
* PB13 -> C2
* PB14 -> C3
* PB15 -> C4
*/#include <SC32F5832.h>
#include <DevInit.h>
#include "LED.h"
#include "BEEP.h"
#include "keybroad4x4.h"
#include "LCD12864.h" //采用翻转扫描的方法( PE口的高8位 )
//程序放在定时器中断函数中 10ms扫描一次#define PORTE PB -> PIN //读PB口引脚电压
u8 key = 22;uint8_t key_scanf()
{uint8_t row = 0;uint8_t column = 0;uint8_t key_value = 0;uint8_t tmp = 0;static uint8_t count = 0;/*------------- PB 高8位端口配置 -------------*/PB->OUTEN|=0XFF00; //高8位 输出使能PB->OUT &= 0X00FF; //低8位(H)PB->OUT |= 0XF000; //高8位:低4(L),高4(H)//GPIOE 高8位端口 高4位为 上拉输入PB -> OUTEN &= 0X0FFF;//高8位:低4位(输入使能)GPIO_PUPD_SEL(PUPD_PU, PB, 12 );GPIO_PUPD_SEL(PUPD_PU, PB, 13 );GPIO_PUPD_SEL(PUPD_PU, PB, 14 );GPIO_PUPD_SEL(PUPD_PU, PB, 15 );tmp = PORTE>>8;if(tmp != 0XF0){if(count < 2){count ++;}}else{count = 0;}if(count == 2){column = tmp & 0XF0;/*------------- PB 高8位端口配置 -------------*/PB->OUTEN|=0XFF00; //高8位 输出使能PB->OUT &= 0X00FF; //低8位(H)PB->OUT |= 0X0F00; //高8位:低4(H),高4(L)//GPIOE 高8位端口 高4位为 上拉输入PB -> OUTEN &= 0XF0FF;//高8位:低4位(输入使能)GPIO_PUPD_SEL(PUPD_PU, PB, 8 );GPIO_PUPD_SEL(PUPD_PU, PB, 9 );GPIO_PUPD_SEL(PUPD_PU, PB, 10 );GPIO_PUPD_SEL(PUPD_PU, PB, 11 );row = (PORTE>>8) & 0X0F;switch(column|row){//按键对应的码表 可根据需求调整返回值 case 0XEE:key_value = 1; //keyboard 1break;case 0XDE: key_value = 2; //keyboard 2break; case 0XBE:key_value = 3; //keyboard 3break; case 0X7E:key_value = 4; //keyboard Abreak; case 0XED:key_value = 5; //keyboard 4break;case 0XDD: key_value = 6; //keyboard 5 break;case 0XBD:key_value = 7; //keyboard 6break;case 0X7D:key_value = 8; //keyboard Bbreak; case 0XEB: key_value = 9; //keyboard 7break;case 0XDB:key_value = 10; //keyboard 8break;case 0XBB:key_value = 11; //keyboard 9break;case 0X7B:key_value = 12; //keyboard Cbreak; case 0XE7:key_value = 13; //keyboard *break;case 0XD7:key_value = 14; //keyboard 0break;case 0XB7:key_value = 15; //keyboard #break;case 0X77:key_value = 16; //keyboard Dbreak;default: break; }}if((PORTE &0xff00) == 0XF000){count = 0;}return key_value;
}void Key4x4(void)
{uint16_t i = 0;i = key_scanf();switch (i){case 1 :LED_TGL(1);break;case 2:LED_TGL(0);break;case 3:LED_TGL(2);break;case 4 :LED_TGL(3);break;case 5:LED_TGL(4);break;case 6:LED_TGL(5);break;case 7:LED_TGL(6);break;case 8:LED_TGL(7);break;case 9:BUZ_TGL;break;case 10:;break;case 11:;break;case 12:;break;case 13:;break;case 14:;break;case 15:;break;case 16:;break;}
}
这里我就给了1-9的按键赋予了功能,之后的没有赋予功能的按键,我们就用空语句。
<keybroad.h>
#ifndef _keybroad4x4_h_
#define _keybroad4x4_h_#include <SC32F5832.h>
#include <DevInit.h>uint8_t key_scanf(void); // 按钮扫描 函数
void Key4x4(void); // 按键功能 函数#endif
<main.c>
/* Includes ------------------------------------------------------------------*/
#include <SC32F5832.h>
#include <DevInit.h>
#include "delay.h"
#include <GPIO.h>
#include <LED.h>
#include <BEEP.h>
#include <KEY.h>
#include <OLED.h>
#include "ULN2003.h"
#include "HC_SR501.h"
#include "GY302.h"
#include "keybroad4x4.h"
#include "LCD12864.h"int main()
{delay_ms(100); //延时100ms Device_Init(); //系统初始化while(1){Key4x4(); // 按钮功能 函数}
}
LK32T102单片机 操作GPIO实现 主按钮、矩阵按键 和 蜂鸣器相关推荐
- 51单片机学习记录(五)矩阵按键
文章目录 1.矩阵按键的控制原理 2.矩阵按键实现 1.行列式法实现矩阵按键 2.线翻转法实现矩阵按键 3.按键实战 1.矩阵按键的控制原理 独立按键与单片机连接时, 每一个按键都需要单片机的一个 I ...
- 51单片机双机通信实验——甲机矩阵按键输入乙机数码管显示
一.实验目的 单片机A发送矩阵键盘输入自己学号后8位,单片机B接收后用8位数码管动态显示. 二.实验原理 1. 矩阵键盘原理 行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平.当接收到的数 ...
- LK32T102 单片机 四位数码管
前言: 之前我们学习了解了LK32T102单片机 操作GPIO实现 主按钮.矩阵按键 和 蜂鸣器,今天我们来学习一下 LK32T102 单片机的显示部分:数码管: 我们常用的数码管 根据 公共端接 地 ...
- 三行代码按键消抖 独立按键 矩阵按键 长按 短按 双击
九层妖塔 起于垒土 直接跳转到三行代码 三行代码按键消抖 独立按键 矩阵按键 长按 短按 双击 一.基本理论 0.按键的常见名词: ①按键抖动 ②按键稳定闭合时间 1.按键的扫描: 2.按键的消抖 ...
- 学习笔记二.矩阵按键
#学习笔记二:GPIO的探索与矩阵按键 ##1.在配置cubemx时,对gpio的配置有开漏输出和推挽输出两种方式, ###这里有一篇文章(别人的文章)讲的很详细link戳这里跳转 通俗来讲,推挽输出 ...
- LPC2124单片机的基础操作——GPIO、外部中断、定时器和串口
LPC2124单片机的基础操作--GPIO.外部中断.定时器和串口 LPC2124的简介 LPC2124之GPIO GPIO简介 编程习惯 代码编写 LPC2124之EINT(外部中断) EINT简介 ...
- 恒烁M0+系列CX32L003单片机及其GPIO的操作
对于CX32L003芯片,其基本性能参数已经在之前的文章<分享一款性价比超高的国产MCU芯片>介绍过.其性能几乎能满足许多产品的需求,其功耗,FLASH资源都具有竞争性. 本篇及之后部分文 ...
- c语言单片机实现按钮互锁,用单片机数码管和矩阵按键实现密码锁功能 附原理图+源程序...
#include "digdisplay.h" //矩阵按键输入10(键表面为S11,程序中默认都是数值)为密码确认,矩阵按键输入11 ...
- 嵌入式学习笔记——使用寄存器编程操作GPIO
使用寄存器编程操作GPIO 前言 GPIO相关的寄存器 GPIO 端口模式寄存器 (GPIOx_MODER) (x = A..I) 位操作 GPIO 端口输出类型寄存器 (GPIOx_OTYPER) ...
最新文章
- R语言修改标题、坐标轴刻度、坐标轴名称的大小(cex.axis、cex.lab、cex.main函数)...
- python 正则 去除字符串中异常字符
- Maven引入外部jar的几种方法
- Python打断点(亲测)
- C# WebBrowser 设置代理
- 口碑网发布2010吃住玩消费风向指数
- 快速傅里叶变换(FFT)——按时间抽取DIT的基
- Linux的proc文件系统详解
- python 多条件 选择 算法_浅析Python中的多条件排序实现
- AngularJS-模型和控制器
- java掠夺_Editing Java版指南/村庄与掠夺 (section)
- PgSQL · 应用案例 · 逻辑订阅给业务架构带来了什么?
- 九章基础算法02:栈和队列
- mosaic数据增强_YoloV4当中的Mosaic数据增强方法(附代码详细讲解)
- webpack入门+路由配置
- python中for循环遍历文件_Python中的用for,while循环遍历文件实例
- Python读取pdf无框线表格_Python将PDF数据解析为表格形式
- Keras机器翻译实战
- 需求预测——Gallat: A Spatiotemporal Graph Attention Network for Passenger Demand Prediction
- 生则决定生,去则实不去
热门文章
- python用bbp公式计算圆周率_圆周率π现在已经算到多少位了?具体是什么数字?...
- 【转载】基于多层结构的网络游戏平台的研究与应用
- 小米刷机OTA、 Recovery、 FASTBOOT三种方法直接的区别和联系
- 丰巢互动媒体的新玩法,智能柜焕新“皮肤”了解一下
- eigen冲突 sophus 安装_svo_edgelet
- 电脑怎么安装excel表格
- drf实现图片验证码功能
- 亚马逊跟卖还能做吗?
- ARM架构Generic Interrupt Controller(GIC)之Distributor和CPU interface功能介绍
- k8s查看pod的命令