mai.c
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "key.h"
extern unsigned char flag_1ms;
u8 sysstat=0;
int main (void)
{
uint8_t key;
SysTick_Config(72000000/1000); //定时1毫秒
Led_Init(); //led gpio初始化
Key_Init(); //按键初始化
while(1)
{
if(flag_1ms==1) //1毫秒进来一次
{
flag_1ms=0;
Led_Poll(); //LED循环显示
key = Key_Scan();
if(key==1)
{
sysstat++;
if(sysstat>3){sysstat=0;}
}
else if(key==2)
{
if(sysstat==0){sysstat=3;}
else{sysstat--;}
}
switch(sysstat)
{
case 0:LED1_ON;LED2_OFF;LED3_OFF;break; //led1 亮
case 1:LED2_ON;LED1_OFF;LED3_OFF;break; //led2 亮
case 2:LED3_ON;LED1_OFF;LED2_OFF;break; //led3 亮
case 3:Led_Poll();break; //LED循环显示
}
}
}
}
led.h
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
/* 定义LED连接的GPIO端口, 用户只需要修改下面的代码即可改变控制的LED引脚 */
// R-红色
#define LED1_GPIOB GPIOB /* GPIO端口 */
#define LED1_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED1_GPIO_PIN GPIO_Pin_5 /* 连接到SCL时钟线的GPIO */
// G-绿色
#define LED2_GPIOB GPIOB /* GPIO端口 */
#define LED2_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED2_GPIO_PIN GPIO_Pin_0 /* 连接到SCL时钟线的GPIO */
// B-蓝色
#define LED3_GPIOB GPIOB /* GPIO端口 */
#define LED3_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED3_GPIO_PIN GPIO_Pin_1 /* 连接到SCL时钟线的GPIO */
//方法1:
#define LED1_ON GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET) //点亮LED1
#define LED1_OFF GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET) //熄灭LED1
#define LED2_ON GPIO_WriteBit(GPIOB,GPIO_Pin_1,Bit_RESET) //点亮LED2
#define LED2_OFF GPIO_WriteBit(GPIOB,GPIO_Pin_1,Bit_SET) //熄灭LED2
#define LED3_ON GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_RESET) //点亮LED2
#define LED3_OFF GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_SET) //熄灭LED2
//方法2:
//#define LED1_ON GPIO_WriteBit(GPIOB,GPIO_Pin_0,(BitAction)(0)); //点亮LED1
//#define LED1_OFF GPIO_WriteBit(GPIOB,GPIO_Pin_0,(BitAction)(1)); //熄灭LED1
//#define LED2_ON GPIO_WriteBit(GPIOB,GPIO_Pin_1,(BitAction)(0)); //点亮LED2
//#define LED2_OFF GPIO_WriteBit(GPIOB,GPIO_Pin_1,(BitAction)(1)); //熄灭LED2
//#define LED3_ON GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(0)); //点亮LED2
//#define LED3_OFF GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1)); //熄灭LED2
//方法3:
//#define LED1_OFF GPIO_SetBits(GPIOB,GPIO_Pin_0); // LED灯都为高电平
//#define LED1_ON GPIO_ResetBits(GPIOB,GPIO_Pin_0); // LED灯都为低电平
//#define LED2_OFF GPIO_SetBits(GPIOB,GPIO_Pin_1); // LED灯都为高电平
//#define LED2_ON GPIO_ResetBits(GPIOB,GPIO_Pin_1); // LED灯都为低电平
//#define LED3_OFF GPIO_SetBits(GPIOB,GPIO_Pin_5); // LED灯都为高电平
//#define LED3_ON GPIO_ResetBits(GPIOB,GPIO_Pin_5); // LED灯都为低电平
void Led_Init(void); //led gpio初始化
void Led_OFF(void); // LED3全灭
void Led_Poll(void); //LED循环显示
#endif /* __LED_H */
led.c
#include "led.h"
typedef struct //led变量成员
{
u8 timer;
u16 num;
}led_ctr_type;
led_ctr_type led_ctr = {0,0}; //变量初始化
void Led_Init(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*开启LED相关的GPIO外设时钟*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
/*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN|LED2_GPIO_PIN|LED3_GPIO_PIN;
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化GPIO*/
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void Led_OFF(void) // LED3全灭
{
LED1_OFF;
LED2_OFF;
LED3_OFF;
}
void Led_Poll(void) // LED循环显示
{
switch(led_ctr.timer) //index每500毫秒加一次,隔执行500毫秒case(X) 跳转一次
{
case 0:LED1_ON; break; // LED1亮
case 1:Led_OFF(); break; // LED全灭
case 2:LED2_ON;break; //LED2亮
case 3:Led_OFF(); break; // LED全灭
case 4:LED3_ON;break; //LED3亮
case 5:Led_OFF(); break; // LED全灭
}
led_ctr.num++;
if(led_ctr.num>=500) //定时500毫秒
{
led_ctr.num=0;
led_ctr.timer++; //index每500毫秒加一次
if(led_ctr.timer>5){led_ctr.timer=0;} //timer设置小于5,因为case只写到5
}
}
key.h
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
#include "led.h"
#include "delay.h"
#define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define KEY2 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)
void Key_Init(void);//初始化
u8 Key_Scan(void); //按键扫描函数
#endif
key.c
#include "key.h"
void Key_Init(void){ //微动开关的接口初始化
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO的初始化枚举结构
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //选择引脚号(0~15或all)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //选择IO接口工作方式 //下拉电阻
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //选择引脚号(0~15或all)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //选择IO接口工作方式 //下拉电阻
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
u8 Key_Scan(void) //按键扫描函数
{
static u16 timer1=0,timer2=0;
//按键1处理
if(KEY1==1)
{
timer1++;
if(timer1==10) //定时10毫秒返回KEY1
{
return(1);
}
else if(timer1==1000){timer1=500;return(1);} //否则长按不停返回有效值
}
else{timer1=0;}
//按键2处理
if(KEY2==1)
{
timer2++;
if(timer2==10) //定时10毫秒返回KEY1
{
return(2);
}
else if(timer2==1000){timer2=500;return(2);} //否则长按不停返回有效值
}
else{timer2=0;}
return(0);
}