实现功能:
1、短按0~1s,led亮
2、长按2~6s,ledmie
一、按键部分程序
#include "key.h"
u8 KeyAge=0,KeyPressed=0,KeyProssed=0;
#define Short_Time 0 //100ms
#define Long_Time 1 //500ms
//按键初始化
void KEY2Init()
{
GPIO_Init(GPIOD , GPIO_PIN_7 , GPIO_MODE_IN_PU_NO_IT);//无外部中断输入
}
#ifndef __KEY_
#define __KEY_
#include "stm8s.h"
#include "led.h"
#include "timer4.h"
#define KEY0 GPIO_ReadInputPin(GPIOD, GPIO_PIN_7)
void KEY2Init();
#endif /*__KEY_*/
二、led部分程序
#include "led.h"
/*******************************************************************************
**函数名称:void InitLED()
**功能描述:初始化LED函数
**入口参数:无
**输出:无
*******************************************************************************/
void InitLED()
{
//设置PD2为输出 ,LED1
GPIO_Init(GPIOD , GPIO_PIN_2 , GPIO_MODE_OUT_PP_LOW_FAST);
//设置PD3为输出 ,LED2
GPIO_Init(GPIOD , GPIO_PIN_3 , GPIO_MODE_OUT_PP_LOW_FAST);
//设置PD0为输出 ,LED3
GPIO_Init(GPIOD , GPIO_PIN_0 , GPIO_MODE_OUT_PP_LOW_FAST);
//设置PC4为输出 ,LED4
GPIO_Init(GPIOC , GPIO_PIN_4 , GPIO_MODE_OUT_PP_LOW_FAST);
LED1_OFF(); //点灭LED1
LED2_OFF(); //点灭LED2
LED3_OFF(); //点灭LED3
LED4_OFF(); //点灭LED4
}
/*******************************************************************************
**函数名称:void delay(unsigned int ms) Name: void delay(unsigned int ms)
**功能描述:大概延时
**入口参数:unsigned int ms 输入大概延时数值
**输出:无
*******************************************************************************/
void delay(unsigned int ms)
{
unsigned int x , y;
for(x = ms; x > 0; x--) /* 通过一定周期循环进行延时*/
for(y = 3000 ; y > 0 ; y--);
}
#ifndef __LED_
#define __LED_
#include "lib.h"
#define LED1_ON() GPIO_WriteLow(GPIOD , GPIO_PIN_2)
#define LED2_ON() GPIO_WriteLow(GPIOD , GPIO_PIN_3)
#define LED3_ON() GPIO_WriteLow(GPIOD , GPIO_PIN_0)
#define LED4_ON() GPIO_WriteLow(GPIOC , GPIO_PIN_4)
#define LED1_OFF() GPIO_WriteHigh(GPIOD , GPIO_PIN_2)
#define LED2_OFF() GPIO_WriteHigh(GPIOD , GPIO_PIN_3)
#define LED3_OFF() GPIO_WriteHigh(GPIOD , GPIO_PIN_0)
#define LED4_OFF() GPIO_WriteHigh(GPIOC , GPIO_PIN_4)
void InitLED();
void delay(unsigned int ms);
#endif /*__LED_*/
三、定时器处理程序,timer4.c
#include "timer4.h"
u16 ms_count = 0;
//定时器3中断服务函数调用
u8 num = 0;
/*******************************************************************************
**函数名称:void TIM4_Init()
**功能描述:定时器4参数初始化
**入口参数:无
**输出:无
*******************************************************************************/
void TIM4_Init()
{
TIM4_DeInit();
TIM4_TimeBaseInit(TIM4_PRESCALER_128 , //定时器4时钟 = 16MHz / 128 = 125KHZ
125 //设定定时器产生1毫秒重装载时的计数值125,255是最大值
);
TIM4_ITConfig(TIM4_IT_UPDATE , ENABLE); //使能定时器4更新中断
TIM4_ARRPreloadConfig(ENABLE); //允许自动仲裁
TIM4_Cmd(ENABLE); //启动定时器4开始计数
}
INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
{
if(TIM4_GetITStatus(TIM4_IT_UPDATE) == SET )
{
TIM4_ClearFlag(TIM4_FLAG_UPDATE); //清除中断标志
ms_count++; //对毫秒数记录
num++;
}
}
//按键处理程序
void display()
{
if(KEY0 == 0) //按键按下时
{
for(num = 0;num<10;);
while(KEY0 == 0) //消抖
{
for(num = 0;num<10;);
if((ms_count> 5)&&(ms_count<1300) ) //ms_count每加一次相当于+1ms,在5ms~1s之间按下,led1亮
{
LED1_ON();
}
if((ms_count > 4000)&&(ms_count<6000) ) //在4s~6s之间按下,led1灭,led2亮
{
LED2_ON();
LED1_OFF();
}
}
ms_count = 0;//清零
}
}
定时器程序头文件,timer4.h
#ifndef __TIMER4_
#define __TIMER4_
#include "lib.h"
extern u16 ms_count;
void TIM4_Init();
INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23);
extern u8 key_fall_flag;
void display();
#endif /*__TIMER4_*/
四、主程序
#include "key.h"
/* 主函数 */
int main(void)
{
disableInterrupts(); //先禁止系统总中断
//内部时钟为1分频 = 16Mhz
CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);
TIM4_Init();
InitLED(); //调用LED初始化函数
enableInterrupts(); //使能系统总中断
while(1)
{
display();
}
}