STM8S103学习之旅——按键长按短按

实现功能:

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();
    }   

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值