/*--------------------------------------------------------------------------------------* 矩阵键盘驱动
* 文 件: keyboard.c
* 编写人: LiuHui
* 描述: 扫描4x4 矩阵键盘输入,并返回键值
* 适用范围: 驱动采用ST3.5 库编写,适用于STM32F10x 系列单片机
* 所用引脚: PB14,PD8,PD10,PD12,PD14,PG2,PG4
* 编写时间: 2014 年5 月20 日
--------------------------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "keyboard.h"
#include "delay.h"
/*--------------------------------矩阵键盘初始化----------------------------------------* 功能: 初始化stm32 单片机GPIO //PA0-PA7
* 参数传递:
* 输入: 无
* 返回值:无
--------------------------------------------------------------------------------------*/
void KeyBoard_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOG,ENABLE);//使能PORTB,PORTD,PORTG时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_5| GPIO_Pin_7;//PD8,PD10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_8;//PD12,PD14
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_12;//PG2,PG4
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOG, GPIO_Pin_3 | GPIO_Pin_5| GPIO_Pin_7);
GPIO_ResetBits(GPIOC, GPIO_Pin_6 | GPIO_Pin_8);
GPIO_ResetBits(GPIOA, GPIO_Pin_8 | GPIO_Pin_12);
}
/*------------------------------矩阵键盘扫描--------------------------------------------* 功能: 扫描矩阵键盘,并返回键值
* 参数:
* 输入: 无
* 返回: 有键按下返回该键值
* 无键按下时则返回0
--------------------------------------------------------------------------------------*/
u8 Read_KeyValue(void)
{
u8 KeyValue=0;
u8 Scan=0;
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6))
{Scan|=0x08;
}
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8))
{Scan|=0x04;
}
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8))
{Scan|=0x02;
}
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12))
{Scan|=0x01;
}
if((Scan&0x0f)!=0x00)
{
delay_ms(10);
if((Scan&0x0f)!=0x00)
{
GPIO_ResetBits(GPIOG, GPIO_Pin_5 | GPIO_Pin_7);//第一排扫描
GPIO_SetBits(GPIOG, GPIO_Pin_3);
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6))
{Scan|=0x08;
}
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8))
{Scan|=0x04;
}
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8))
{Scan|=0x02;
}
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12))
{Scan|=0x01;
}
switch(Scan&0x0f)
{
case 0x01: KeyValue = 11; break;
case 0x02: KeyValue = 12; break;
case 0x04: KeyValue = 13; break;
case 0x08: KeyValue = 14; break;
}
GPIO_ResetBits(GPIOG, GPIO_Pin_3 | GPIO_Pin_7);//第一排扫描
GPIO_SetBits(GPIOG, GPIO_Pin_5);
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6))
{Scan|=0x08;
}
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8))
{Scan|=0x04;
}
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8))
{Scan|=0x02;
}
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12))
{Scan|=0x01;
}
switch(Scan&0x0f)
{
case 0x01: KeyValue = 21; break;
case 0x02: KeyValue = 22; break;
case 0x04: KeyValue = 23; break;
case 0x08: KeyValue = 24; break;
}
GPIO_ResetBits(GPIOG, GPIO_Pin_3 | GPIO_Pin_5);//第一排扫描
GPIO_SetBits(GPIOG, GPIO_Pin_7);
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6))
{Scan|=0x08;
}
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8))
{Scan|=0x04;
}
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8))
{Scan|=0x02;
}
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12))
{Scan|=0x01;
}
switch(Scan&0x0f)
{
case 0x01: KeyValue = 31; break;
case 0x02: KeyValue = 32; break;
case 0x04: KeyValue = 33; break;
case 0x08: KeyValue = 34; break;
}
GPIO_SetBits(GPIOG, GPIO_Pin_3 | GPIO_Pin_5| GPIO_Pin_7);
GPIO_ResetBits(GPIOC, GPIO_Pin_6 | GPIO_Pin_8);
GPIO_ResetBits(GPIOA, GPIO_Pin_8 | GPIO_Pin_12);
//while((GPIO_ReadInputData(GPIOA)&0xff)!=0x0f);
return KeyValue;
}
}
return 0;
}
/*--------------------------------THE END--------------------------------------------*/
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>