Key

作者: 昨天剩下的一杯冷茶 | 来源:发表于2018-08-31 11:40 被阅读13次
#include "key.h"




void InitKey(void)
{
#ifdef INTERRUPT_KEY
  
  P0IEN |= BV(1);
  PICTL &= ~BV(0);
  IEN1 |= BV(5);
  P0IFG = 0x00;
  EA = 1;
  
#else
  P0SEL &= ~BV(1);
  P0DIR &= ~BV(1);
  P0INP &= ~BV(1);
#endif 
  
}

bool KeyPoll(void)
{
  if (KEY1 == 1)
  {
      return true;
  }
  return false;
}

#ifdef INTERRUPT_KEY

#pragma vector = P0INT_VECTOR
__interrupt void KEY1_ISR(void)
{
  SendSem(PRESS_KEY);
  P0IFG = 0;
  P0IF = 0;
  
}

#endif


//消息的函数==START================================
#define MAX_SEM 20
static ENUM_SEM EnumSem[MAX_SEM];
static unsigned char InSem=0;
static unsigned char OutSem=0;

void SendSem(ENUM_SEM Sem)
{
  EnumSem[InSem++] =Sem;
  InSem%=MAX_SEM;
}
void SemEmpty(void)
{
  OutSem = 0;
  InSem = 0;
}
ENUM_SEM GetSem(void)
{
    ENUM_SEM RetSem;
    if(OutSem!=InSem)
    {
        RetSem = EnumSem[OutSem++];
        OutSem%=MAX_SEM;
        return RetSem;
    }
    return NO_SEM;
}
//消息的函数==END================================


//头文件================================
#ifndef __KEY_H__
#define __KEY_H__

#include "all.h"


//#define INTERRUPT_KEY

typedef enum
{ 
  NO_SEM,
  PRESS_KEY,
}ENUM_SEM;

#define KEY1 P0_1       //定义P0.1为按键输入端口


bool KeyPoll(void);
void InitKey(void);



//消息的函数==START================================
void SendSem(ENUM_SEM Sem);
void SemEmpty(void);
ENUM_SEM GetSem(void);





#endif

//例子=================================================

#include "all.h" 
#include "led.h"
#include "timer.h"
#include "uart.h"
#include "adc.h"
#include "key.h"



void main(void)
{   
  char p_buf[]="hello world\r\n";

  CLKCONCMD &= ~0x40;               //设置系统时钟源为32MHZ晶振
  while(CLKCONSTA & 0x40);          //等待晶振稳定
  CLKCONCMD &= ~0x47;               //设置系统主时钟频率为32MHZ   

  InitLed();
  InitKey();
  Uart_Init(UART_BAUDRATE_115200);
  Uart_String(p_buf);
  SemEmpty();
  while(1)                     //死循环
  {
    #ifdef INTERRUPT_KEY
    if (NO_SEM != GetSem())
    {
      LED1= !LED1;
    }
#else
    if (KeyPoll())
    {
       LED1= 0;
    }else
    {
        LED1= 1;   
    }
#endif

  }    
}






``
按键(外部中断),当按键按下时,LED状态切换
按键(查询),当按键按下时,LED亮,否者灭。
这个按键(外部中断),还运用消息的机制。




相关文章

网友评论

      本文标题:Key

      本文链接:https://www.haomeiwen.com/subject/nsdswftx.html