STM32学习第一周之 按键矩阵

2019-08-19来源: eefocus关键字:STM32  按键矩阵  蜂鸣器

添加一个矩阵键盘,STM32 检测到不同按键按下,实现不同功能:

键 1-7 按下,依次点亮红、绿、蓝、黄、青、紫、白

键 8-14 按下,依次熄灭红、绿、蓝、黄、青、紫、白

键 15 按下,蜂鸣器响 ; 键 16 按下,蜂鸣器不响


如有好的优化建议,还请不吝赐教


直接上代码

keypad.h


#include "sys.h"


#ifndef _KeyPad_H

#define _KeyPad_H


void KeyInit(void);

//判断是否有键按下u8 

u8 KeyDown(void);

//矩阵按键扫描,返回一个键值

u8 KeyCheck(void);

//功能实现

void KeySwitch(void);


#endif`



keypad.c


#include "keypad.h"

#include "stm32f10x.h"

#include "delay.h"

#include "RGBLED.h"

#include "BEEP.h"

 

void KeyInit(void)//按键初始化

{

GPIO_InitTypeDef GPIO_InitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;   

GPIO_Init(GPIOA,&GPIO_InitStruct);

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD; 

GPIO_Init(GPIOA,&GPIO_InitStruct);

GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);

GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);

}


u8 KeyDown(void)

{

if((GPIO_ReadInputData(GPIOA) & 0xf0) != 0x0)//判断是否有键按下

return 1;//keydown

}

else return 0; 

}


u8 KeyCheck(void)

{

if(KeyDown())

{

delay_ms(10);//消抖10ms


if(KeyDown())

{

u8 KeyValue = 0;

GPIO_SetBits(GPIOA,GPIO_Pin_0);

GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);

if (KeyDown())

{

switch(GPIO_ReadInputData(GPIOA) & 0xf0)

{

case (0x10): KeyValue = 1; break;

case (0x20): KeyValue = 4; break;

case (0x40): KeyValue = 7; break;

case (0x80): KeyValue = '*'; break;

}

}

GPIO_SetBits(GPIOA,GPIO_Pin_1);

GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3);

if (KeyDown())

{

switch(GPIO_ReadInputData(GPIOA) & 0xf0)

{

case (0x10): KeyValue = 2; break;

case (0x20): KeyValue = 5; break;

case (0x40): KeyValue = 8; break;

case (0x80): KeyValue = 0; break;

}

}

GPIO_SetBits(GPIOA,GPIO_Pin_2);

GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3);

if (KeyDown())

{

switch(GPIO_ReadInputData(GPIOA) & 0xf0)

{

case (0x10): KeyValue = 3; break;

case (0x20): KeyValue = 6; break;

case (0x40): KeyValue = 9; break;

case (0x80): KeyValue = '#'; break;

}

}

GPIO_SetBits(GPIOA,GPIO_Pin_3);

GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_0);

if (KeyDown())

{

switch(GPIO_ReadInputData(GPIOA) & 0xf0)

{

case (0x10): KeyValue = 'A'; break;

case (0x20): KeyValue = 'B';   break;

case (0x40): KeyValue = 'C'; break;

case (0x80): KeyValue = 'D'; break;

}

return KeyValue;

}

return 20;   //这里不能返回0,0已经作为按键的返回值

}


void KeySwitch(void)

{

switch(KeyPad_Check())

{

case 1:RGBLED_Display( RED, 1);break;

case 2:RGBLED_Display( GREEN, 1);break;

case 3:RGBLED_Display( BLUE, 1);break;

case 4:RGBLED_Display( YELLOW, 1);break;

case 5:RGBLED_Display( NAVY, 1);break;

case 6:RGBLED_Display( PURPLE, 1);break;

case 7:RGBLED_Display( WHITE, 1);break;

case 8:RGBLED_Display( RED, 0);break;

case 9:RGBLED_Display( GREEN, 0);break;

case '*':RGBLED_Display( BLUE, 0);break;

case 0:  RGBLED_Display( YELLOW, 0);break;

case '#':RGBLED_Display( NAVY, 0);break;

case 'A':RGBLED_Display( PURPLE, 0);break;

case 'B':RGBLED_Display( WHITE, 0);break;

case 'C': BEEP = 0;break;

case 'D': BEEP = 1;break;

}

}


关键字:STM32  按键矩阵  蜂鸣器

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471624.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32矩阵键盘4*4扫描程序(无延时消抖,测试稳定)
下一篇:STM32学习第一周之 红外光电

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8S学习01——SPI&IIC

1、温习IIC总线协议1)I2C 总线的一些特征1> 只要求两条总线线路 一条串行数据线 SDA 一条串行时钟线 SCL2> 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机 从机关系软件设定地址 主机可以作为主机发送器或主机接收器3> 它是一个真正的多主机总线 如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁,防止数据被破坏4> 串行的 8 位双向数据传输位速率在标准模式下可达 100kbit/s 快速模式下可达 400kbit/s 高速模式下可达 3.4Mbit/s5> 片上的滤波器可以滤去总线数据线上的毛刺波 保证数据完整6> 连接到相同总线的 IC 数量只受到总线的
发表于 2019-09-16

STM8S学习02——ADC

一、ADC_转换模式1、ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式。2、单次模式在单次转换模式中, ADC仅在由ADC_CSR寄存器的CH[3:0]选定的通道上完成一次转换。该模式是在当CONT位为0时通过置位ADC_CR1 寄存器的ADON位来启动的。一旦转换完成,转换后的数据存储在ADC_DR寄存器中, EOC(转换结束)标志被置位,如果EOCIE被置位将产生一个中断。3、连续和带缓存的连续模式在连续转换模式中,ADC在完成一次转换后就立刻开始下一次的转换。当CONT位被置位时即将ADC设为连续模式,该模式是通过置位ADC_CR1寄存器的 ADON 位来启动的。(1)如果缓冲功能没有
发表于 2019-09-16

STM8S学习05——EEPROM读写操作C语言程序

/*这两天项目开发中,用到STM8的EEPROM功能,几个数据要掉电保存,在网上也查了一下EEPROM操作,发现网上出现的问题主要有两点:1、EEPROM读写不成功;2、EEPROM读写的时间太长;看了一下ST的库函数,自己测试了一下,没有发现什么问题,比较正常;在读写EEPROM期间,也有动态扫描LED数码管,没有发现数码管有闪烁。操作过程中:1、开发平台:STM8S105K4T6 IAR6.3 ST库版本 V2.1.02、操作EEPROM,使用到的库函数:  FLASH_Unlock(FLASH_MEMTYPE_DATA);  while (FLASH_GetFlagSt
发表于 2019-09-16

STM8S学习04——网关学习

连接到另一个网络的“关口”。也就是网络关卡。网关(Gateway)又称网间连接器、协议转换器。默认网关在网络层上以实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关的结构也和路由器类似,不同的是互连层。网关既可以用于广域网互连,也可以用于局域网互连。说明:由于历史的原因,许多有关TCP/IP的文献曾经把网络层使用的路由器称为网关,在今天很多局域网采用都是路由来接入网络,因此通常指的网关就是路由器的IP!在OSI中,网关有两种:一种是面向连接的网关,一种是无连接的网关。当两个子网之间有一定距离时,往往将一个网关分成两半,中间用一条链路连接起来,我们称之为半网关。(OSI是Open Syst
发表于 2019-09-16

STM8S学习03——寄存器版本的一些程序

();while(1){GPIO_WriteReverse(GPIOG, GPIO_PIN_0);Delay(50000);}}void Delay(unsigned int t){while(t--);}#ifdef USE_FULL_ASSERT;void assert_failed(u8 *file, u32 line){while(1){}}#endif/* stm8s_it.c 中的代码如下: *//*...INTERRUPT_HANDLER(CLK_IRQHandler,2){//清除中断标志位CLK_ClearITPendingBit(CLK_IT_SWIF);//完成切换CLK_ClockSwitchCmd(ENABLE
发表于 2019-09-16

解决stm8会卡在串口中断的问题

原因串口进入了OR(过载错误)中断解决方法必须添加if(UART1_GetITStatus(UART1_IT_RXNE )!= RESET),若不添加,会导致UART1->DR被异常读取,不断进入中断处理函数若UART的RXNE状态位已经被置1,串口又收到数据,将会进入OR(过载错误)中断,需要先读取UART_SR,再读取UART_DR才可把OR位中断状态清零,调用UART1_GetITStatus(UART1_IT_RXNE )即是读取UART_SR在调用UART1_ReceiveData8()读取了UART1->DR后即可清除中断UART1_IT_RXNE标志位INTERRUPT_HANDLER
发表于 2019-09-16

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved