#include "KEY44.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
u8 key_num = 0;
int main(void)
{
uart_init(115200);
delay_init();
KEY44_Init();
while(1)
{
key_num = key44_Scan();
if(key_num != 0)
{
printf("KEY is %drn",key_num);
}
}
}
#include "KEY44.h"
#include "sys.h"
#include "delay.h"
void KEY44_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1 |GPIO_Pin_2 |GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5 |GPIO_Pin_6 |GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
unsigned char key44_Scan(void)
{
H_1 = 0;
H_2 = 1;
H_3 = 1;
H_4 = 1;
if( L_1 == 0)
{
delay_ms(10);
if(L_1 == 0)
{
while(!L_1);
return 1;
}
}
if(L_2 == 0)
{
delay_ms(10);
if(L_2 == 0)
{
while(!L_2);
return 2;
}
}
if(L_3 == 0)
{
delay_ms(10);
if(L_3 == 0)
{
while(!L_3);
return 3;
}
}
if(L_4 == 0)
{
delay_ms(10);
if(L_4 == 0)
{
while(!L_4);
return 4;
}
}
H_1 = 1;
H_2 = 0;
H_3 = 1;
H_4 = 1;
if(L_1 == 0)
{
delay_ms(10);
if(L_1 == 0)
{
while(!L_1);
return 5;
}
}
if(L_2 == 0)
{
delay_ms(10);
if(L_2 == 0)
{
while(!L_2);
return 6;
}
}
if(L_3 == 0)
{
delay_ms(10);
if(L_3 == 0)
{
while(!L_3);
return 7;
}
}
if(L_4 == 0)
{
delay_ms(10);
if(L_4 == 0)
{
while(!L_4);
return 8;
}
}
H_1 = 1;
H_2 = 1;
H_3 = 0;
H_4 = 1;
if(L_1 == 0)
{
delay_ms(10);
if(L_1 == 0)
{
while(!L_1);
return 9;
}
}
if(L_2 == 0)
{
delay_ms(10);
if(L_2 == 0)
{
while(!L_2);
return 10;
}
}
if(L_3 == 0)
{
delay_ms(10);
if(L_3 == 0)
{
while(!L_3);
return 11;
}
}
if(L_4 == 0)
{
delay_ms(10);
if(L_4 == 0)
{
while(!L_4);
return 12;
}
}
H_1 = 1;
H_2 = 1;
H_3 = 1;
H_4 = 0;
if(L_1 == 0)
{
delay_ms(10);
if(L_1 == 0)
{
while(!L_1);
return 13;
}
}
if(L_2 == 0)
{
delay_ms(10);
if(L_2 == 0)
{
while(!L_2);
return 14;
}
}
if(L_3 == 0)
{
delay_ms(10);
if(L_3 == 0)
{
while(!L_3);
return 15;
}
}
if(L_4 == 0)
{
delay_ms(10);
if(L_4 == 0)
{
while(!L_4);
return 16;
}
}
return 0;
}
#ifndef __KEY44_H
#define __KEY44_H
//PA0~PA3为推挽式输出
//PA4~PA7为上拉式输入
#define H_1 PAout(0)
#define H_2 PAout(1)
#define H_3 PAout(2)
#define H_4 PAout(3)
#define L_1 PAin(4)
#define L_2 PAin(5)
#define L_3 PAin(6)
#define L_4 PAin(7)
void KEY44_Init(void);
unsigned char key44_Scan(void);
#endif
关键字:STM32 矩阵键盘 串口3
引用地址:
STM32实战 2.矩阵键盘通过串口3输出
推荐阅读最新更新时间:2024-03-16 16:27
STM32中的串口通信的基础知识
串口通信基本原理 并行通信与串行通信 ① 并行通信传送八路信号,一次并行传送传送完整的一个字节信息。串行通信在一个方向上只能传送一路信号,一次只能传送一个二进制位,传送一个字节信息时,只能一位一位地依次传送; ② 串行的传输速度慢,但是对线路的要求低一些。 并行的对线路的要求高,但是速度快; ③ 串行线路仅使用一对信号线,线路成本低并且抗干扰能力强,因此可以用在长距离通讯上;而并行线路使用多对信号线(还不包括额外的控制线路),线路成本高并且抗干扰能力差,因此对通讯距离有非常严格的限制。 串行通信中单工,半双工和全双工的区别 单工,半双工和全双工是通过传输方向不同而分的。具体说明如下: 按通信方式不同又可分为异
[单片机]
STM32 HAL I2C库读指定寄存器的数据
Support for repeated start in STM32 HAL I2C library Q: I am working with a slave I2C device (Kionix KX022 acccelerometer) which uses a repeated start mechanism to send data requested by the master (STM32F405), e.g. to read two bytes of data (from register N and register N+1) the following sequence Master Slav
[单片机]
Ubuntu下安装Stm32的Eclipse的开发环境(1)
在Ubuntu下安装Stm32的Eclipse的开发环境(1)安装过程中发现了 然后我又在网上Ubuntu下安装Stm32的Eclipse的开发环境(2)的文章 执行 apt-get install openjdk-6-jre-headless 这些这个命令还是安装不成功 然后我就在网上找了一个下更新源的方法 很明显没有安装成功 但是能识别找到这个软件包 更新方法 https://blog.51cto.com/wellfinger/303748 我转载过了 Ubuntu下安装Stm32的Eclipse安装——ubuntu更新源(含9.10和10.04) 其中 sudo apt-get upgrade 这个该过程比较久
[单片机]
基于STM32和CC2520的TinyOS移植方法
TinyOS系统以其组件结构模型、事件驱动、并发型等优点成为目前最受关注的无线传感器网络操作系统。但TinyOS不支持STM32和CC2 520芯片。因此在分析TinyOS基本原理、NesC编程语言实现机制及其编译过程的基础上,介绍了基于STM32和CC2520的TinyOS移植方法,完成了STM32的I/O组件、Timer组件、USART组件、SPI组件和CC2520芯片驱动的移植。在实现CC2520的基本通信功能基础上,实现简单MAC协议。最后测试了各组件的移植效果。实验测试结果表明,节点可以稳定可靠地通信。 无线传感器网络(Wireless Sensor Network,WSN)是一种应用相关的网络。需要对某些操
[单片机]
关于STM32的ADC的扫描模式
下面这张截图是 我看的 STM32参考手册的关于ADC状态寄存器ADC1_SR的资料 我经过参考网上的资料 感觉EOC位 好像是每个通道转换结束 置位。而不是像书上这样说的 通道组转换结束时置位。 就像扫描模式,应该是每一个通道转换完就置一次,而不是等所有的通道都结束了才置位的。 不知道我理解的对不对? 书上写错了的? 1L: 额!这个还真不知道 2L(版主): 回复【楼主位】 utopia779 : --------------------------------- 这个要实验一下了.以实际实验结果为准. 3L: 应该是每一个通道转换完就置一次 这样的话DMA才能在每个通道转换完立即取出数据
[单片机]
STM32驱动DHT11温湿度传感器
DHT11 是一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。通过单片机等微处理器简单的电路连接就能够 实时的采集本地湿度和温度。 DHT11 与单片机之间能采用简单的单总线进行通信,仅仅需要一 个 I/O 口。传感器内部湿度和温度数据 40Bit 的数据一次性传给单片机,数据采用校验和方式 进行校验,有效的保证数据传输的准确性。DHT11 功耗很低,5V 电源电压下,工作平均最大 电流 0.5mA。 DHT11 的技术参数如下: 工作电压范围:3.3V -5.5V 工作电流 :平均 0.5mA 输出:单总线数字信号 测量范围:湿度 20~90%RH
[单片机]
基于STM32的心电采集设计
如今,心血管类疾病已经成为威胁人类身体健康的重要疾病之一,而清晰有效的心电图为诊断这类疾病提供了依据,心电采集电路是心电采集仪的 关键部分,心电信号属于微弱信号,其频率范围在0.03~100 Hz之间,幅度在0~5 mV之间,同时心电信号还掺杂有大量的干扰信号,因此,设计良好的滤波电路和选择合适的控制器是得到有效心电信号的关键。基于此,本文设计了以STM32 为控制核心,AD620和OP07为模拟前端的心电采集仪,本设计简单实用,噪声干扰得到了有效抑制。 1 总体设计方案 心电采集包括模拟采集和数字处理两部分,本设计通过AgCl电极和三导联线心电采集线采集人体心电信号,通过前置放大电路,带通滤波电路,50 Hz双T陷波后再经主放大
[单片机]
如何有效地使用串口通讯接收数据
引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口中断,在中断中读取数据就行了! 中断就是打断程序正常运行,怎么能保证高效呢?经常把主程序打断,主程序还要不要运行了? 同学B:串口可以配置成用DMA的方式接收数据,等接收完毕就可以去读取了! 这个同学是对的,我们可以使用DMA去接收数据,不过DMA需要定长才能产生接收中断,如何接收不定长的数据呢? DMA简介 题外话:其实,上面的问题是很有必要思考一下的,不断思考,才能进步。 什么是DMA DMA :全称Direct Memory Access,即直接存储器访问
[单片机]