STM32main. * 4矩阵键盘程序#include“ led.h” #include“ delay.h” #include“ sys.h” #include“ key.h” #include“ usart.h” #include“ stdio .h“ int main(void){int x; SystemInit(); delay_init(72); //延迟初始化NVIC_Configuration(); uart_init(9600); LED_Init(); KEY_Init(); //初始化与按钮连接的硬件接口while(1){x = KEY_Scan() ; switch(x)//获取键值{case 0:// LED0 = 0; printf(“ D \ n”); break; case 1:printf(“ C \ n”); break; case 2:printf (“ B \ n”);中断;情况3:printf(“ A \ n”);中断;情况4:printf(“#\ n”);中断;情况5:printf(“ 9 \ n”);中断;情况6:printf(“ 6 \ n”);中断;情况7:printf(“ 3 \ n”);中断;情况8:printf(“ 0 \ n”);中断;情况9:printf(“ 8 \ n“);中断;情况10:printf(” 5 \ n“);中断;情况11:printf(” 2 \ n“);中断;情况12:printf(” * \ n“);中断; case 13:printf(“ 7 \ n”); break; case 14:printf(“ 4 \ n”); break; case 15:printf(“ 1 \ n”); break;}}} ///// /////////////////////////////////////////////////// /////////////////////////////// // ////////////////// /////////////////////////////////////////////////// //////////////////// // key.c #include“ stm32f10x.h” #include“ delay.h” #include“ key.h” //密钥扫描/ *功能该文件的n主要实现矩阵键盘的功能。
矩阵键盘使用引脚PB8至PB15。其中,PB8至PB11固定为推挽输出,而PB12至PB15固定为下拉输入。当没有按键时,即对应的PB12至PB15为0。当按键时,PB12至PB15的对应引脚为高。 * / void KEY_Init(void)//初始化矩阵键盘要使用的GPIO端口。 {GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,E NABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //定义PB8至PB11作为上拉输入。 ,GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11; GPIO_Init(GPIOB,&GPIO_InitStructure); = GPIO_InitStructure //定义PB15。GPIO_Mode下拉输入。
= GPIO_Mode_IPD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; //由于输出了上述定义的引脚,因此此处没有打开整个GPIOA =时钟// //需要函数RCC_APB2PeriphClockCmd()来打开时钟。 GPIO_Init(GPIOB,&GPIO_InitStructure); } int KEY_Scan(void)//实现矩阵键盘。返回值是每个按钮的键值,由用户定义。 {u8 KeyVal; // keyVal是返回的最后一个键值。 GPIO_Write(GPIOB,(GPIOB-> ODR&0xf0ff | 0x0f00)); //让PB8至PB11全部先输出高电平。if(((GPIOB-> IDR&0xf000) == 0x0000) // if PB12至PB15均为0,不按任何键,此时返回值为-1.return -1;否则{delay_ms(5); //延迟5ms进行去抖动。
if(((GPIOB-> IDR&0xf000) == 0x0000) ///如果经过5ms延迟后,PB12至PB15再次全部为0,则此时引脚的电势变化是由抖动引起的。 return -1;} GPIO_Write(GPIOB,(GPIOB-> ODR&0xf0ff | 0x0100)); //让PB11至PB8输出二进制000 1.switch(GPIOB-> IDR&0xf000) //是判断PB12到PB15的值输出不同的密钥值。{case 0x1000:KeyVal = 15; break; case 0x2000:KeyVal = 11; break; case 0x4000:KeyVal = 7; break; case 0x8000:KeyVal = 3; break; } GPIO_Write(GPIOB,(GPIOB-> ODR&0xf0ff | 0x0200)); //让PB11至PB8输出二进制0.开关(GPIOB-> IDR&0xf000)至PB15判断值输出不同{case 0x1000:KeyVal = 14; break; case 0x2000:KeyVal = 10; break; //对于PB12,case 0x4000:KeyVal = 6; break; case 0x8000:KeyVal = 2; break;} GPIO_Write(GPIOB,( GPIOB-> ODR&0xf0ff | 0x0400)); //让PB11至PB8输出二进制1011.开关(GPIOB-> IDR&0xf000)确定PB15的值,以输出不同的键值。
{情况0x1000:KeyVal = 13;打破;情况0x2000:KeyVal = 9;打破;情况0x4000:KeyVal = 5;打破;情况0x8000:KeyVal = 1; break;} //对于PB12GPIO_Write(GPIOB,(GPIOB-> ODR&0xf0ff | 0x0800))); //让PB11至PB8输出二进制0111.开关(GPIOB-> IDR&0xf000)至PB15至{case 0x1000:KeyVal = 12; break; case 0x2000:KeyVal = 8; break; //对于PB12,case 0x4000:KeyVal = 4; break; case 0x8000:KeyVal = 0; break; } return KeyVal;} ///// //////////////////////////////////////// ////////// /////////////////////////////////////////// ///////// /////////////////////////////////////////// //////// /////////////// key.h file #ifndef __KEY_H #define __KEY_H #include“ sys.h“ #define KEY0 PBin(8)#define KEY1 PBin(9)#define KEY2 PBin(10) #define KEY3 PBin(1 1)#define KEY4 PBin(12) #define KEY5 PBin(13)#define KEY6 PBin(14)#define KEY7 PBin(1 5) // PB8 // PB9 // PA10 // PA11 // PA12 // PA13 // PA14 // PA15void KEY_Init( void); // IO初始化int KEY_Scan(void); #endif ///////////////////////////// ///// ///////////////////////////////////////// / /////// ////////////////////////////////// ///////////////////////////////////密钥代码表为:{1 2 {4 5 {7 8 {* 0 3 6 9#A} B} C} D}这可以由您自己定义。
//////////////////////////////// // //////////////////////////////////////////////说明:和矩阵键盘为连接到STM32F103的PB8-PB15引脚。我以前使用过PB0-PB7引脚,但是有一个问题,就是PB4引脚不能输出低电平,这使得无法扫描键盘。检查原理图,发现PB4具有两种功能,另一种功能通过电阻连接。 VCC,并始终输出高电平。更换引脚后,这是正常的。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-344151-1.html
让台独份子折腾吧
多学一些知识
感觉中国现在是钱头外交
#吴亦凡#哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥