我又改了一下:
#include "key.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK miniSTM32开发板
//LED驱动代码
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/2
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
//初始化PA8和PD2为输出口.并使能这两个口的时钟
//LED IO初始化
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能PA,PD端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6; //LED0-->PA.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOE, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 ; //LED0-->PA.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOE, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; //LED1-->PD.2 端口配置, 推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
}
void Hang_Output(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能PA,PD端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 ; //LED0-->PA.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOE, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; //LED1-->PD.2 端口配置, 推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
}
void Hang_Input(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能PA,PD端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 ; //LED0-->PA.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOE, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; //LED1-->PD.2 端口配置, 推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
}
void Lie_Input(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //使能PA,PD端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6; //LED0-->PA.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOE, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8
}
void Lie_Output(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //使能PA,PD端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6; //LED0-->PA.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOE, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8
}
unsigned char GetKey(void)
{
unsigned char keyvalue = 0;
uint16_t hangvalue=0;
// 第1回合第1步
KEY_Init();
delay_us(20);
GPIO_ResetBits(GPIOE,GPIO_Pin_6); //PE.6,5,4,3 输出低
GPIO_SetBits(GPIOE,GPIO_Pin_5);
GPIO_SetBits(GPIOE,GPIO_Pin_4);
GPIO_SetBits(GPIOE,GPIO_Pin_3);
hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
if (hangvalue != 0x1f)// 从IO口输入,读IO口
{
// 读出的不是0x0f说明有按键被按下
// 第1回合第2步:读出端口从读出值来判断是哪一行
delay_ms(20);
GPIO_ResetBits(GPIOE,GPIO_Pin_6); //PE.6,5,4,3 输出低
GPIO_SetBits(GPIOE,GPIO_Pin_5);
GPIO_SetBits(GPIOE,GPIO_Pin_4);
GPIO_SetBits(GPIOE,GPIO_Pin_3);
hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
if (hangvalue != 0x1f)// 从IO口输入,读IO口
{
Hang_Output();
Lie_Input();
delay_us(20);
// 第一回合中算出行号
switch (hangvalue)
{
case 0x0F:
keyvalue=4;
break;
case 0x17:
keyvalue=5;
break;
case 0x1b:
keyvalue=1;
break;
case 0x1d:
keyvalue=2;
break;
case 0x1e:
keyvalue=3;
break;
default: break;
}
Hang_Input();
Lie_Output();
delay_us(20);
GPIO_ResetBits(GPIOE,GPIO_Pin_6 ); //PE.6,5,4,3 输出低
GPIO_SetBits(GPIOE, GPIO_Pin_5 );
GPIO_SetBits(GPIOE, GPIO_Pin_4 );
GPIO_SetBits(GPIOE, GPIO_Pin_3 );
hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
while (hangvalue != 0x1f)
{
hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
}
//return keyvalue;
}
}
KEY_Init();
delay_us(20);
GPIO_SetBits(GPIOE,GPIO_Pin_6 ); //PE.6,5,4,3 输出低
GPIO_ResetBits(GPIOE, GPIO_Pin_5 );
GPIO_SetBits(GPIOE, GPIO_Pin_4 );
GPIO_SetBits(GPIOE, GPIO_Pin_3 );
hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
if (hangvalue != 0x1f)// 从IO口输入,读IO口
{
// 读出的不是0x0f说明有按键被按下
// 第1回合第2步:读出端口从读出值来判断是哪一行
delay_ms(20);
GPIO_SetBits(GPIOE,GPIO_Pin_6 ); //PE.6,5,4,3 输出低
GPIO_ResetBits(GPIOE, GPIO_Pin_5 );
GPIO_SetBits(GPIOE, GPIO_Pin_4 );
GPIO_SetBits(GPIOE, GPIO_Pin_3 );
hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
if (hangvalue != 0x1f)// 从IO口输入,读IO口
{
Hang_Output();
Lie_Input();
delay_us(20);
// 第一回合中算出行号
switch (hangvalue)
{
case 0x0F:
keyvalue=9;
break;
case 0x17:
keyvalue=10;
break;
case 0x1b:
keyvalue=6;
break;
case 0x1d:
keyvalue=7;
break;
case 0x1e:
keyvalue=8;
break;
default: break;
}
Hang_Input();
Lie_Output();
delay_us(20);
GPIO_SetBits(GPIOE,GPIO_Pin_6 ); //PE.6,5,4,3 输出低
GPIO_ResetBits(GPIOE, GPIO_Pin_5 );
GPIO_SetBits(GPIOE, GPIO_Pin_4 );
GPIO_SetBits(GPIOE, GPIO_Pin_3 );
hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
while (hangvalue != 0x1f)
{
hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
}
//return keyvalue;
}
}
KEY_Init();
delay_us(20);
GPIO_SetBits(GPIOE,GPIO_Pin_6 ); //PE.6,5,4,3 输出低
GPIO_SetBits(GPIOE, GPIO_Pin_5 );
GPIO_ResetBits(GPIOE, GPIO_Pin_4 );
GPIO_SetBits(GPIOE, GPIO_Pin_3 );
hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
if (hangvalue != 0x3f)// 从IO口输入,读IO口
{
// 读出的不是0x0f说明有按键被按下
// 第1回合第2步:读出端口从读出值来判断是哪一行
delay_ms(20);
GPIO_SetBits(GPIOE,GPIO_Pin_6 ); //PE.6,5,4,3 输出低
GPIO_SetBits(GPIOE, GPIO_Pin_5 );
GPIO_ResetBits(GPIOE, GPIO_Pin_4 );
GPIO_SetBits(GPIOE, GPIO_Pin_3 );
hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
if (hangvalue != 0x3f)// 从IO口输入,读IO口
{
Hang_Output();
Lie_Input();
delay_us(20);
// 第一回合中算出行号
switch (hangvalue)
{
case 0x1F:
keyvalue=14;
break;
case 0x2F:
keyvalue=15;
break;
case 0x37:
keyvalue=16;
break;
case 0x3B:
keyvalue=11;
break;
case 0x3D:
keyvalue=12;
break;
case 0x3E:
keyvalue=13;
break;
default: break;
}
Hang_Input();
Lie_Output();
delay_us(20);
GPIO_SetBits(GPIOE,GPIO_Pin_6 ); //PE.6,5,4,3 输出低
GPIO_SetBits(GPIOE, GPIO_Pin_5 );
GPIO_ResetBits(GPIOE, GPIO_Pin_4 );
GPIO_SetBits(GPIOE, GPIO_Pin_3 );
hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
while (hangvalue != 0x3f)
{
hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
}
//return keyvalue;
}
}
KEY_Init();
delay_us(20);
GPIO_SetBits(GPIOE,GPIO_Pin_6 ); //PE.6,5,4,3 输出低
GPIO_SetBits(GPIOE, GPIO_Pin_5 );
GPIO_SetBits(GPIOE, GPIO_Pin_4 );
GPIO_ResetBits(GPIOE, GPIO_Pin_3 );
hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
if (hangvalue != 0x3f)// 从IO口输入,读IO口
{
// 读出的不是0x0f说明有按键被按下
// 第1回合第2步:读出端口从读出值来判断是哪一行
delay_ms(20);
GPIO_SetBits(GPIOE,GPIO_Pin_6 ); //PE.6,5,4,3 输出低
GPIO_SetBits(GPIOE, GPIO_Pin_5 );
GPIO_SetBits(GPIOE, GPIO_Pin_4 );
GPIO_ResetBits(GPIOE, GPIO_Pin_3 );
hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
if (hangvalue != 0x3f)// 从IO口输入,读IO口
{
Hang_Output();
Lie_Input();
delay_us(20);
// 第一回合中算出行号
switch (hangvalue)
{
case 0x1F:
keyvalue=20;
break;
case 0x2F:
keyvalue=21;
break;
case 0x37:
keyvalue=22;
break;
case 0x3B:
keyvalue=17;
break;
case 0x3D:
keyvalue=18;
break;
case 0x3E:
keyvalue=19;
break;
default: break;
}
Hang_Input();
Lie_Output();
delay_us(20);
GPIO_SetBits(GPIOE,GPIO_Pin_6 ); //PE.6,5,4,3 输出低
GPIO_SetBits(GPIOE, GPIO_Pin_5 );
GPIO_SetBits(GPIOE, GPIO_Pin_4 );
GPIO_ResetBits(GPIOE, GPIO_Pin_3 );
hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
while (hangvalue != 0x3f)
{
hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
}
//return keyvalue;
}
}
return keyvalue;;
}
好了一点,没那么频繁了,还有点问题。
|