1、#include “stm32f10x.h“#include “delay.h“/*本文件的函数,主要实现矩阵键盘的功能。矩阵键盘使用 PA0 到 PA7 引脚,其中,PA0到 PA3 固定为推挽输出,PA4 到 PA7 固定为下拉输入。即,无键按下时,对应 PA4 到 PA7 为 0,有键按下时,PA4 到 PA7 中,对应的引脚为高。此程序有一点要注意:要用到的 IO 口,必须是 PX0-PX7, ,不能是其他连续的数字。 。如果非要改。 。如:已经没有连续的 0-7 的 IO 口,需要在几个地方修改,请注意!此程序带有松手检测。 。 。 。*/void InitKey(void) /初始
2、化矩阵键盘要使用的 GPIO 口。GPIO_InitTypeDef GPIOStru;GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP; /定义 PA0 到 PA3 为推挽输出。GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;GPIOStru.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_Init(GPIOA,GPIOStru.GPIO_Mode = GPIO_M
3、ode_IPD; /定义 PA4 到 PA7 为下拉输入。GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;GPIOStru.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;/因为上面定义引脚为输出时,已经打开整个 GPIOA 的时钟了,所以此处不再需要函数 RCC_APB2PeriphClockCmd()来打开时钟了。GPIO_Init(GPIOA,int key(void) /实现矩阵键盘。返回值为,各按键的键值,此键值由用户自己定义。int KeyVal=0; /keyVal 为最后返回的键值。u1
4、6 WriteVal=0; /WriteVal 为要写给 PA 口的数据。GPIO_Write(GPIOA,(GPIOA-ODR /先让 PA0 到 PA3 全部输出高。if(GPIOA-IDR elsedelay_ms(5); /延时 5ms 去抖动。if(GPIOA-IDR GPIO_Write(GPIOA,(GPIOA-ODR /让 PA3 到 PA0 输出二进制的0001.switch(GPIOA-IDR break;case 0x0020: KeyVal=11; break;case 0x0040: KeyVal=7;break;case 0x0080: KeyVal=3;break
5、;GPIO_Write(GPIOA,(GPIOA-ODR /让 PA3 到 PA0 输出二进制的0010.switch(GPIOA-IDR break;case 0x0020: KeyVal=10; break;case 0x0040: KeyVal=6;break;case 0x0080: KeyVal=2;break;GPIO_Write(GPIOA,(GPIOA-ODR /让 PA3 到 PA0 输出二进制的0100.switch(GPIOA-IDR break;case 0x0020: KeyVal=9;break;case 0x0040: KeyVal=5;break;case 0x0080: KeyVal=1;break;GPIO_Write(GPIOA,(GPIOA-ODR /让 PA3 到 PA0 输出二进制的 1000. switch(GPIOA-IDR break;case 0x0020: KeyVal=8;break;case 0x0040: KeyVal=4;break;case 0x0080: KeyVal=0;break;return KeyVal;