/********** (C) COPYRIGHT 2008 STMicroelectronics **********
* File Name : main.c
* Description : 主函数
***********************************************************/
/* Includes ----------------------------------------------*/
#include "stm32f10x_lib.h"
/* Private typedef 自定义同义关键字 ----------------------*/
typedef enum
{
KeyScanState_0=0x00,
KeyScanState_1=0x01,
KeyScanState_2=0x02,
}KeyScanState_Typedef;
/* Private define 自定义参数宏 ---------------------------*/
#define KEYPORT GPIOA
#define KEY0PIN GPIO_Pin_0
#define KEY1PIN GPIO_Pin_8
#define LEDPORT GPIOD
#define LED0PIN GPIO_Pin_8
#define LED1PIN GPIO_Pin_9
/* Private macro 自定义函数宏 ----------------------------*/
/* Private variables 自定义变量 --------------------------*/
/* Private function prototypes 自定义函数声明 ------------*/
/* Private functions -------------------------------------*/
void RccInitialisation(void);
void GpioInitialisation(void);
void SystickInitialisation(void);
/***********************************************************
* Function Name : main
* Description : main函数
* Input : None
* Output : None
* Return : None
***********************************************************/
int main(void)
{
vu16 KeyPortStatus=0;
KeyScanState_Typedef KeyScanState; /*定义按键扫描状态枚举变量*/
RccInitialisation(); /*设置系统时钟*/
GpioInitialisation(); /*设置GPIO端口*/
SystickInitialisation();/*设置Systick定时器*/
while(1)
{
if(SysTick_GetFlagStatus(SysTick_FLAG_COUNT)==SET) /*查询20ms到?*/
{
KeyPortStatus=GPIO_ReadInputData(KEYPORT)&0x000f; /*读取I/O电平*/
switch(KeyScanState) /*进入状态机流程*/
{
/*状态一:判断有否按键按下*/
case KeyScanState_0:
{
if(KeyPortStatus!=0x000f)
{
KeyScanState=KeyScanState_1; /*有按键按下,更新状态标志*/
}
break;
}
/*状态2:判断是否抖动*/
case KeyScanState_1:
{
if(KeyPortStatus)
{
/*非抖动,确认按键按下,执行相应操作*/
if(GPIO_ReadInputDataBit(KEYPORT,KEY0PIN)==0)
{GPIO_WriteBit(LEDPORT,LED0PIN,
(BitAction)(1-GPIO_ReadOutputDataBit(LEDPORT,LED0PIN)));}
else if(GPIO_ReadInputDataBit(KEYPORT,KEY1PIN)==0)
{GPIO_WriteBit(LEDPORT,LED1PIN,
(BitAction)(1-GPIO_ReadOutputDataBit(LEDPORT,LED1PIN)));}
KeyScanState=KeyScanState_2; /*更新状态标志*/
}
else
{
KeyScanState=KeyScanState_0; /*抖动,确认按键未按下,更新状态标志*/
}
break;
}
/*状态3:松手检测*/
case KeyScanState_2:
{
if(KeyPortStatus==0x000f)
{
KeyScanState=KeyScanState_0; /*松手,更新状态标志*/
}
break;
}}}}}
/***********************************************************
* Function Name : RccInitialisation
* Description : 设置系统各部分时钟
* Input : None
* Output : None
* Return : None
***********************************************************/
void RccInitialisation(void)
{
{/*本部分代码为RccInitialisation函数内部部分代码,见附录A程序清单A.1*/}
}
/***********************************************************
* Function Name : GpioInitialisation
* Description : 设置各GPIO端口功能
* Input : None
* Output : None
* Return : None
***********************************************************/
void GpioInitialisation(void)
{
/*定义GPIO初始化结构体GPIO_InitStructure*/
GPIO_InitTypeDef GPIO_InitStructure;
/*打开APB2总线上的GPIOD时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOA,ENABLE);
/*设置S3、S4为浮空输入(外部已加入上拉电阻,所以不用设置为上拉输入)*/
GPIO_InitStructure.GPIO_Pin = KEY0PIN | KEY1PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(KEYPORT, &GPIO_InitStructure);
/*设置GPIOD.8~9为推挽输出,最大翻转频率为50MHz*/
GPIO_InitStructure.GPIO_Pin=LED0PIN | LED1PIN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(LEDPORT,&GPIO_InitStructure);
}
/***********************************************************
* Function Name : Systick_Configuration
* Description : 设置Systick定时器,重装载时间为20ms
* Input : None
* Output : None
* Return : None
***********************************************************/
void SystickInitialisation(void)
{
SysTick_CounterCmd(SysTick_Counter_Disable);/*失能Systick定时器*/
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);/*选择HCLK为Systick时钟源*/
SysTick_CounterCmd(SysTick_Counter_Clear);/*清除Systick计数器*/
/*主频为72MHz,配置计数值为72000*20可以得到20ms定时间隔*/
SysTick_SetReload(72000*20);//设置Systick定时器的重装载值
SysTick_CounterCmd(SysTick_Counter_Enable);/*启动Systick定时器*/
}
--------------------------------------------------
我用的是火牛板,所以管脚改了一下,用了两个按键和两个led灯,都没反应啊,哪位大神来帮我看一下
* File Name : main.c
* Description : 主函数
***********************************************************/
/* Includes ----------------------------------------------*/
#include "stm32f10x_lib.h"
/* Private typedef 自定义同义关键字 ----------------------*/
typedef enum
{
KeyScanState_0=0x00,
KeyScanState_1=0x01,
KeyScanState_2=0x02,
}KeyScanState_Typedef;
/* Private define 自定义参数宏 ---------------------------*/
#define KEYPORT GPIOA
#define KEY0PIN GPIO_Pin_0
#define KEY1PIN GPIO_Pin_8
#define LEDPORT GPIOD
#define LED0PIN GPIO_Pin_8
#define LED1PIN GPIO_Pin_9
/* Private macro 自定义函数宏 ----------------------------*/
/* Private variables 自定义变量 --------------------------*/
/* Private function prototypes 自定义函数声明 ------------*/
/* Private functions -------------------------------------*/
void RccInitialisation(void);
void GpioInitialisation(void);
void SystickInitialisation(void);
/***********************************************************
* Function Name : main
* Description : main函数
* Input : None
* Output : None
* Return : None
***********************************************************/
int main(void)
{
vu16 KeyPortStatus=0;
KeyScanState_Typedef KeyScanState; /*定义按键扫描状态枚举变量*/
RccInitialisation(); /*设置系统时钟*/
GpioInitialisation(); /*设置GPIO端口*/
SystickInitialisation();/*设置Systick定时器*/
while(1)
{
if(SysTick_GetFlagStatus(SysTick_FLAG_COUNT)==SET) /*查询20ms到?*/
{
KeyPortStatus=GPIO_ReadInputData(KEYPORT)&0x000f; /*读取I/O电平*/
switch(KeyScanState) /*进入状态机流程*/
{
/*状态一:判断有否按键按下*/
case KeyScanState_0:
{
if(KeyPortStatus!=0x000f)
{
KeyScanState=KeyScanState_1; /*有按键按下,更新状态标志*/
}
break;
}
/*状态2:判断是否抖动*/
case KeyScanState_1:
{
if(KeyPortStatus)
{
/*非抖动,确认按键按下,执行相应操作*/
if(GPIO_ReadInputDataBit(KEYPORT,KEY0PIN)==0)
{GPIO_WriteBit(LEDPORT,LED0PIN,
(BitAction)(1-GPIO_ReadOutputDataBit(LEDPORT,LED0PIN)));}
else if(GPIO_ReadInputDataBit(KEYPORT,KEY1PIN)==0)
{GPIO_WriteBit(LEDPORT,LED1PIN,
(BitAction)(1-GPIO_ReadOutputDataBit(LEDPORT,LED1PIN)));}
KeyScanState=KeyScanState_2; /*更新状态标志*/
}
else
{
KeyScanState=KeyScanState_0; /*抖动,确认按键未按下,更新状态标志*/
}
break;
}
/*状态3:松手检测*/
case KeyScanState_2:
{
if(KeyPortStatus==0x000f)
{
KeyScanState=KeyScanState_0; /*松手,更新状态标志*/
}
break;
}}}}}
/***********************************************************
* Function Name : RccInitialisation
* Description : 设置系统各部分时钟
* Input : None
* Output : None
* Return : None
***********************************************************/
void RccInitialisation(void)
{
{/*本部分代码为RccInitialisation函数内部部分代码,见附录A程序清单A.1*/}
}
/***********************************************************
* Function Name : GpioInitialisation
* Description : 设置各GPIO端口功能
* Input : None
* Output : None
* Return : None
***********************************************************/
void GpioInitialisation(void)
{
/*定义GPIO初始化结构体GPIO_InitStructure*/
GPIO_InitTypeDef GPIO_InitStructure;
/*打开APB2总线上的GPIOD时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOA,ENABLE);
/*设置S3、S4为浮空输入(外部已加入上拉电阻,所以不用设置为上拉输入)*/
GPIO_InitStructure.GPIO_Pin = KEY0PIN | KEY1PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(KEYPORT, &GPIO_InitStructure);
/*设置GPIOD.8~9为推挽输出,最大翻转频率为50MHz*/
GPIO_InitStructure.GPIO_Pin=LED0PIN | LED1PIN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(LEDPORT,&GPIO_InitStructure);
}
/***********************************************************
* Function Name : Systick_Configuration
* Description : 设置Systick定时器,重装载时间为20ms
* Input : None
* Output : None
* Return : None
***********************************************************/
void SystickInitialisation(void)
{
SysTick_CounterCmd(SysTick_Counter_Disable);/*失能Systick定时器*/
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);/*选择HCLK为Systick时钟源*/
SysTick_CounterCmd(SysTick_Counter_Clear);/*清除Systick计数器*/
/*主频为72MHz,配置计数值为72000*20可以得到20ms定时间隔*/
SysTick_SetReload(72000*20);//设置Systick定时器的重装载值
SysTick_CounterCmd(SysTick_Counter_Enable);/*启动Systick定时器*/
}
--------------------------------------------------
我用的是火牛板,所以管脚改了一下,用了两个按键和两个led灯,都没反应啊,哪位大神来帮我看一下
