《STM32-矩阵键盘程序.docx》由会员分享,可在线阅读,更多相关《STM32-矩阵键盘程序.docx(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、STM32-矩阵键盘程序 44 LtD/*-* 矩阵键盘驱动* 文 件: keyboard.c* 编写人: LiuHui* 描述: 扫描 4x4 矩阵键盘输入,并返回键值* 适用范围: 驱动承受 ST3.5 库编写,适用于STM32F10x 系列单片机* 所用引脚: PA0-PA7* 编写时间: 2021 年 5 月 20 日-*/#include “stm32f10x.h“ #include “keyboard.h“ #include “dealy.h“/*- 矩 阵 键 盘 初 始 化-* 功能: 初始化stm32 单片机 GPIO /PA0-PA7* 参数传递:* 输入: 无* 返回值:
2、无-*/void KeyBoard_Init(void)GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed= GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GP
3、IO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed= GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPD;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5
4、 | GPIO_Pin_6 | GPIO_Pin_7);/*-矩 阵 键 盘 扫 描-* 功能: 扫描矩阵键盘,并返回键值* 参数:* 输入: 无* 返回: 有键按下返回该键值* 无键按下时那么返回 0-*/u8 Read_KeyValue(void)u8 KeyValue=0; if(GPIO_ReadInputData(GPIOA)&0xff)!=0x0f)Delay_ms(10); if(GPIO_ReadInputData(GPIOA)&0xff)!=0x0f)GPIO_SetBits(GPIOA, GPIO_Pin_0); GPIO_ResetBits(GPIOA,GPIO_Pin_
5、1|GPIO_Pin_2 | GPIO_Pin_3); switch(GPIO_ReadInputData(GPIOA)&0xff)case 0x11: KeyValue = 1; break; case 0x21: KeyValue = 5; break; case 0x41: KeyValue = 9; break; case 0x81: KeyValue = 13;break;GPIO_SetBits(GPIOA, GPIO_Pin_1);GPIO_ResetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_3);GPIO_Pin_0|switch(GPIO_ReadI
6、nputData(GPIOA)&0xff)case 0x12: KeyValue = 2; break; case 0x22: KeyValue = 6; break; case 0x42: KeyValue = 10;break; case 0x82: KeyValue = 14;break;GPIO_SetBits(GPIOA, GPIO_Pin_2);GPIO_ResetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_3);GPIO_Pin_0|switch(GPIO_ReadInputData(GPIOA)&0xff)case 0x14: KeyValue = 3;
7、 break; case 0x24: KeyValue = 7; break; case 0x44: KeyValue = 11;break; case 0x84: KeyValue = 15;break;GPIO_SetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);GPIO_Pin_0|switch(GPIO_ReadInputData(GPIOA)&0xff)case 0x18: KeyValue = 4; break; case 0x28: KeyValue = 8; break; case
8、0x48: KeyValue = 12;break; case 0x88: KeyValue = 16;break;GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);GPIO_Pin_4|while(GPIO_ReadInputData(GPIOA)&0xff)!=0x0f);return KeyValue;return 0;/*THEEND*/*-* 矩阵键盘驱动* 文 件: keyboa
9、rd.h* 编写人: LiuHui* 描述: 扫描 4x4 矩阵键盘输入,并返回键值* 适用范围: 驱动为 ST3.5 库编写,适用于STM32F10x 系列单片机* 所用引脚: PA0-PA7* 编写时间: 2013 年 11 月 22 日* 版本: 1.0-*/#ifndefKEYBOARD_H #defineKEYBOARD_Hvoid KeyBoard_Init(void); u8 Read_KeyValue(void); #endif/*THEEND*#include “stm32f10x.h“void KeyBoard_Init(void)GPIO_InitTypeDef GPIO
10、_InitStructure; GPIO_InitStructure.GPIO_Pin= GPIO_Pin_All; GPIO_InitStructure.GPIO_Speed= GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All; GPIO_InitStructure.GPIO_Speed= GPIO_Speed_2MHz; GPIO_InitStructure
11、.GPIO_Mode= GPIO_Mode_IPD;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6);GPIO_ResetBits(GPIOB,GPIO_Pin_7|GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);/ PA,PBvoid Delay_ms(int time) int i=0;while(time-)i=12000;while(i-);u8 Read_KeyValue(void)u8 Key
12、Value=1; if(GPIO_ReadInputData(GPIOB)&0xff)!=0x0f)Delay_ms(10); if(GPIO_ReadInputData(GPIOB)&0xff)!=0x0f)GPIO_SetBits(GPIOB, GPIO_Pin_3);GPIO_ResetBits(GPIOB, GPIO_Pin_5 | GPIO_Pin_6);GPIO_Pin_4|switch(GPIO_ReadInputData(GPIOB)&0xff)case 0x11: KeyValue = 7; break; case 0x21: KeyValue = 4; break; cas
13、e 0x41: KeyValue = 1; break; case 0x81: KeyValue = 0; break;GPIO_SetBits(GPIOB, GPIO_Pin_4);GPIO_ResetBits(GPIOB, GPIO_Pin_5 | GPIO_Pin_6);GPIO_Pin_3|switch(GPIO_ReadInputData(GPIOB)&0xff)case 0x12: KeyValue = 8; break; case 0x22: KeyValue = 5; break; case 0x42: KeyValue = 2; break; case 0x82: KeyVa
14、lue = 0; break;GPIO_SetBits(GPIOB, GPIO_Pin_5);GPIO_ResetBits(GPIOB, GPIO_Pin_4 | GPIO_Pin_6);GPIO_Pin_3|switch(GPIO_ReadInputData(GPIOB)&0xff)case 0x14: KeyValue = 9; break; case 0x24: KeyValue = 6; break; case 0x44: KeyValue = 3; break; case 0x84: KeyValue = 0; break;GPIO_SetBits(GPIOB, GPIO_Pin_6
15、);GPIO_ResetBits(GPIOB, GPIO_Pin_4 | GPIO_Pin_5);GPIO_Pin_3|switch(GPIO_ReadInputData(GPIOB)&0xff)case 0x18: KeyValue = 0; break; case 0x28: KeyValue = 0; break; case 0x48: KeyValue = 0;break; case 0x88: KeyValue = 0;break;GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6);GPIO_Rese
16、tBits(GPIOB,GPIO_Pin_7|GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);/while(GPIO_ReadInputData(GPIOB)&0xff)!=0x0f);return KeyValue;return 0;uint16_t table=0xEB,0x28,0xB3,0xBA,0x78,0xDA,0xD B,0xA8,0xFB,0xFA;int mainRCC_APB2PeriphClockCmd(RCC_APB2Perip h_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Perip h_G
17、PIOB,ENABLE);KeyBoard_Init;int keyvalue=Read_KeyValue; GPIO_Write(GPIOA, tablekeyvalue);/*while(1) int i;for(i=0;i10;i+) GPIO_Write(GPIOA, tablei);Delay_ms(500);*/*u8 keyvalue; for(int i=0;i+)KeyBoard_Init; keyvalue=Read_KeyValue; GPIO_Write(GPIOA,tablekeyvalue); Delay_ms(500);*/#include “stm32f10x.
18、h“void KeyBoard_Init(void)GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin= GPIO_Pin_All; GPIO_InitStructure.GPIO_Speed= GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin= GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5
19、|GPIO_ Pin_6|GPIO_Pin_7|GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed= GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPD;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6);GPIO_ResetBits(GPIOB,GPIO_Pin_7|GPIO_Pin
20、_8 | GPIO_Pin_9 | GPIO_Pin_10);void Delay_ms(int time) int i=0;while(time-)i=12000;while(i-);u8 Read_KeyValue(void)if(GPIO_ReadInputData(GPIOB)&0xff)!=0x 73)/ 在 这 个 程 序 下 为 什 么 无 论 是GPIO_ReadInputData(GPIOB)&0xff)!=0x73 还是GPIO_ReadInputData(GPIOB)&0xff)=0x73 都能往下运行,而在屏蔽 Delay_ms(10)后那么只能运行一种,是由于这个 Delay_ms(10)对 if 里的推断有影响吗?Delay_ms(10); GPIO_Write(GPIOA,0x33);return 0;int mainRCC_APB2PeriphClockCmd(RCC_APB2Perip h_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Perip h_GPIOB,ENABLE);KeyBoard_Init; Read_KeyValue;