STM32矩阵键盘程序44.docx
《STM32矩阵键盘程序44.docx》由会员分享,可在线阅读,更多相关《STM32矩阵键盘程序44.docx(9页珍藏版)》请在冰豆网上搜索。
STM32矩阵键盘程序44
STM32-矩阵键盘程序4×4
D
}
/*------------------------------矩阵键盘扫描--------------------------------------------*功能:
扫描矩阵键盘,并返回键值
*参数:
*输入:
无
*返回:
有键按下返回该键值
*无键按下时则返回0
--------------------------------------------------------------------------------------*/
u8Read_KeyValue(void)
{
u8KeyValue=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_1|GPIO_Pin_2|GPIO_Pin_3);
switch(GPIO_ReadInputData(GPIOA)&0xff)
{
case0x11:
KeyValue=1;break;
case0x21:
KeyValue=5;break;
case0x41:
KeyValue=9;break;
case0x81:
KeyValue=13;break;
}
GPIO_SetBits(GPIOA,GPIO_Pin_1);
GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3);
switch(GPIO_ReadInputData(GPIOA)&0xff)
{
case0x12:
KeyValue=2;break;
case0x22:
KeyValue=6;break;
case0x42:
KeyValue=10;break;
case0x82:
KeyValue=14;break;
}
GPIO_SetBits(GPIOA,GPIO_Pin_2);
GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3);
switch(GPIO_ReadInputData(GPIOA)&0xff)
{
case0x14:
KeyValue=3;break;
case0x24:
KeyValue=7;break;
case0x44:
KeyValue=11;break;
case0x84:
KeyValue=15;break;
}
GPIO_SetBits(GPIOA,GPIO_Pin_3);
GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);
switch(GPIO_ReadInputData(GPIOA)&0xff)
{
case0x18:
KeyValue=4;break;
case0x28:
KeyValue=8;break;
case0x48:
KeyValue=12;break;
case0x88:
KeyValue=16;break;
}
GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|
GPIO_Pin_7);
while((GPIO_ReadInputData(GPIOA)&0xff)!
=0x0f);
returnKeyValue;
}
}
return0;
}
/*--------------------------------THEEND--------------------------------------------*/
/*--------------------------------------------------------------------------------------*矩阵键盘驱动
*文件:
keyboard.h
*编写人:
LiuHui
*描述:
扫描4x4矩阵键盘输入,并返回键值
*适用范围:
驱动为ST3.5库编写,适用于STM32F10x系列单片机
*所用引脚:
PA0-PA7
*编写时间:
2013年11月22日
*版本:
1.0
--------------------------------------------------------------------------------------*/
#ifndef__KEYBOARD_H
#define__KEYBOARD_H
voidKeyBoard_Init(void);
u8Read_KeyValue(void);
#endif
/*----------------------------------THEEND------------------------------------------*
#include"stm32f10x.h"
voidKeyBoard_Init(void)
{
GPIO_InitTypeDefGPIO_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.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,PB
voidDelay_ms(inttime){
inti=0;
while(time--)
{
i=12000;
while(i--);
}
}
u8Read_KeyValue(void)
{
u8KeyValue=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_4|GPIO_Pin_5|GPIO_Pin_6);
switch(GPIO_ReadInputData(GPIOB)&0xff)
{
case0x11:
KeyValue=7;break;
case0x21:
KeyValue=4;break;
case0x41:
KeyValue=1;break;
case0x81:
KeyValue=0;break;
}
GPIO_SetBits(GPIOB,GPIO_Pin_4);
GPIO_ResetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_6);
switch(GPIO_ReadInputData(GPIOB)&0xff)
{
case0x12:
KeyValue=8;break;
case0x22:
KeyValue=5;break;
case0x42:
KeyValue=2;break;
case0x82:
KeyValue=0;break;
}
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_6);
switch(GPIO_ReadInputData(GPIOB)&0xff)
{
case0x14:
KeyValue=9;break;
case0x24:
KeyValue=6;break;
case0x44:
KeyValue=3;break;
case0x84:
KeyValue=0;break;
}
GPIO_SetBits(GPIOB,GPIO_Pin_6);
GPIO_ResetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);
switch(GPIO_ReadInputData(GPIOB)&0xff)
{
case0x18:
KeyValue=0;break;
case0x28:
KeyValue=0;break;
case0x48:
KeyValue=0;break;
case0x88:
KeyValue=0;break;
}
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);
//while((GPIO_ReadInputData(GPIOB)&0xff)!
=0x0f);
returnKeyValue;
}
}
return0;
}
uint16_ttable[]={0xEB,0x28,0xB3,0xBA,0x78,0xDA,0xDB,0xA8,0xFB,0xFA};
intmain(){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
KeyBoard_Init();
intkeyvalue=Read_KeyValue();
GPIO_Write(GPIOA,table[keyvalue]);
/*while
(1){
inti;
for(i=0;i<10;i++){
GPIO_Write(GPIOA,table[i]);
Delay_ms(500);
}
}*/
/*u8keyvalue;
for(inti=0;;i++){
KeyBoard_Init();
keyvalue=Read_KeyValue();
GPIO_Write(GPIOA,table[keyvalue]);
Delay_ms(500);
}*/
}
#include"stm32f10x.h"
voidKeyBoard_Init(void)
{
GPIO_InitTypeDefGPIO_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|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_8|GPIO_Pin_9|GPIO_Pin_10);
}
voidDelay_ms(inttime){
inti=0;
while(time--)
{
i=12000;
while(i--);
}
}
u8Read_KeyValue(void)
{
if((GPIO_ReadInputData(GPIOB)&0xff)!
=0x73)
//在这个程序下为什么无论是GPIO_ReadInputData(GPIOB)&0xff)!
=0x73还是GPIO_ReadInputData(GPIOB)&0xff)==0x73都能往下运行,而在屏蔽Delay_ms(10)后则只能运行一种,是因为这个Delay_ms(10)对if里的判断有影响吗?
{
Delay_ms(10);
GPIO_Write(GPIOA,0x33);
}
return0;
}
intmain(){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
KeyBoard_Init();
Read_KeyValue();
}