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); } } }