矩阵键盘通过串口3输出

KEY44.h文件
#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
KEY44.c文件
#include "KEY44.h"
#include "sys.h"
#include "delay.h"
 
//PA0~PA3 为推挽式输出
//PA4~PA7 为上拉式输入



void  KEY44_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	//PA0~PA3 为推挽式输出
	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);
	//PA4~PA7 为上拉式输入
	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;

}
USART3.h文件
#ifndef _USART3_H_
#define _USART3_H_
#include "sys.h"

void USART3_Init(u32 bound);

#endif
USART3.c文件
#include "USART3.h"
#include <stdio.h>

//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
	while((USART3->SR&0X40)==0);//循环发送,直到发送完毕   
    USART3->DR = (u8) ch;      
	return ch;
}

void USART3_Init(u32 bound)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	//开启GPIOB复用功能的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO,ENABLE);
	//开启USART3的时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
	//PB10 -> TX 配置为复用推挽式输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	//PB11 -> RX 配置为浮空输入
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	

USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//波特率
USART_InitStructure.USART_StopBits = USART_StopBits_1;//起始位
USART_InitStructure.USART_Parity = USART_Parity_No;//奇偶
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_Init(USART3, &USART_InitStructure);

USART_Cmd(USART3,ENABLE);//使能串口

USART_ClearFlag(USART3,USART_FLAG_TC);//解决发送第一个字节丢失的问题

}

main.c主函数
#include "sys.h"
#include "USART3.h"
#include "KEY44.h"
#include "delay.h"
#include "string.h"
#include <stdio.h>

u8 key_num = 0;


int main(void)
{
	
	USART3_Init(115200);
	delay_init();
	KEY44_Init();

	while(1)
	{
		key_num = key44_Scan();
		if(key_num != 0)
		{
			printf("KEY Num is %d\r\n",key_num);
		}
	}
	
}




猜你喜欢

转载自blog.csdn.net/MOO520/article/details/80382650
今日推荐