#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亮,否者灭。
这个按键(外部中断),还运用消息的机制。
网友评论