------------------------------独立按键查询方式
查看原理图
查看用户手册
按键通过p0-0和cpu相联,当按键按下时为低电平,
读取p0-0口的电平就可以知道按键的状态
复制之前LCD程序
修改main所在c文件/******************************************************************************
版权所有 (C), 2014-2020
******************************************************************************
文 件 名 : KEY.c
版 本 号 : V1.0
作 者 : retacn
生成日期 : 2014年9月13日
功能描述 : 查询方式读取按键状态
函数列表 :
修改历史 :
1.日 期 : 2014年9月13日
作 者 : retacn
修改内容 : 创建文件
******************************************************************************/
/*----------------------------------------------*
* 包含头文件 *
*----------------------------------------------*/
#include <ioCC2540.h>
#include "Lcd12864.h"
/*宏定义*/
#define KEY_DOWN 0X01
#define KEY_UP 0X02
/*函数声明*/
uint8 KeyValue(void);
int main(void)
{
uint8 OldKeyValue = 0;
uint8 NewKeyValue = 0;
SysStartXOSC(); // 启动外部晶振
LCD12864_Init(); // LCD初始化
//最大显示列数
LCD12864_DisStr(0, "hello retacn!"); // 行最多显示字符
LCD12864_DisStr(1, " Key Test");
P0SEL &= ~0X01; // 设置为IO功能
P0DIR &= ~0X01; // 设置为输入功能
while(1)
{
NewKeyValue = KeyValue(); // 读取按键状态
if(OldKeyValue != NewKeyValue) // 按键状态改变
{
OldKeyValue = NewKeyValue; // 保存当前按键状态
if(OldKeyValue == KEY_DOWN)
{
LCD12864_DisStr(3, " Key Down ");
}
else
{
LCD12864_DisStr(3, " Key Up ");
}
}
}
return 0;
}
/*****************************************************************************
函 数 名 : KeyValue
功能描述 : 读取按键的状态
输入参数 : void
输出参数 : 无
返 回 值 :
修改历史 :
1.日 期 : 2014年9月14日
作 者 : retacn
修改内容 : 创建
*****************************************************************************/
uint8 KeyValue(void)
{
if((P0&0X01) == 0X00 ) // 按下为低电平
{
return KEY_DOWN;
}
else
{
return KEY_UP;
}
}
-----------------------------中断方式查询按键状态
按键通过p0-0和cpu相联,当按键按下触发中断
查看用户手册
设置为中断方式
上升沿触发还是下降沿触发
设置中断
复制key工程,修改main所在c文件
/******************************************************************************
版权所有 (C), 2014-2020
******************************************************************************
文 件 名 : KEY.c
版 本 号 : V1.0
作 者 : retacn
生成日期 : 2014年9月13日
功能描述 : 中断方式读取按键状态
函数列表 :
修改历史 :
1.日 期 : 2014年9月13日
作 者 : retacn
修改内容 : 创建文件
******************************************************************************/
/*----------------------------------------------*
* 包含头文件 *
*----------------------------------------------*/
#include <ioCC2540.h>
#include <stdio.h>
#include "Lcd12864.h"
#include "common.h"
/*宏定义*/
#define KEY_DOWN 0X01
#define KEY_UP 0X02
volatile uint8 NewKeyValue = 0;
int main(void)
{
/*显存*/
char LCDBuf[21]={0};
/*按键次数*/
int KeyCnt = 0;
SysStartXOSC(); // 启动外部晶振
LCD12864_Init(); // LCD初始化
//最大显示列数
LCD12864_DisStr(0, "hello retacn!"); // 行最多显示字符
LCD12864_DisStr(1, " Key Test");
P0SEL &= ~0X01; // 设置为IO功能
P0DIR &= ~0X01; // 设置为输入功能
P0IEN |= 0X01; // P0.0 设置为中断方式
PICTL |= 0X01; // 下降沿触发
IEN1 |= 0X20; // 允许P0口中断
P0IFG = 0x00; // 清除中断标志位
EA = 1; // 开总中断
sprintf(LCDBuf, " Key Count : %d", KeyCnt++); // 按键计数
LCD12864_DisStr(3, LCDBuf);
while(1)
{
if(KEY_DOWN == NewKeyValue) // 按键按下
{
SoftWaitUs(25000); // 延时防抖
if((P0&0X01) == 0X00) // 再次确认按键是否按下
{
sprintf(LCDBuf, " Key Count : %d", KeyCnt++); // 按键计数
LCD12864_DisStr(3, LCDBuf);
}
else
{
NewKeyValue = KEY_UP; // 按键松开
}
}
}
return 0;
}
/*****************************************************************************
函 数 名 : P0_ISR
功能描述 : P0口中断处理
输入参数 : void
输出参数 : 无
返 回 值 :
修改历史 :
1.日 期 : 2014年9月14日
作 者 : retacn
修改内容 : 创建
*****************************************************************************/
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
if(0x01&P0IFG)
{
NewKeyValue = KEY_DOWN; // 记录按键按下
}
P0IFG = 0; //清中断标志
P0IF = 0; //清中断标志
}