------------------------------独立按键查询方式
查看原理图
查看用户手册
按键通过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"
/*宏定义*/
#defineKEY_DOWN0X01
#defineKEY_UP0X02
/*函数声明*/
uint8KeyValue(void);
intmain(void)
{
uint8OldKeyValue=0;
uint8NewKeyValue=0;
SysStartXOSC();//启动外部晶振
LCD12864_Init();//LCD初始化
//最大显示列数
LCD12864_DisStr(0,"helloretacn!");//行最多显示字符
LCD12864_DisStr(1,"KeyTest");
P0SEL&=~0X01;//设置为IO功能
P0DIR&=~0X01;//设置为输入功能
while(1)
{
NewKeyValue=KeyValue();//读取按键状态
if(OldKeyValue!=NewKeyValue)//按键状态改变
{
OldKeyValue=NewKeyValue;//保存当前按键状态
if(OldKeyValue==KEY_DOWN)
{
LCD12864_DisStr(3,"KeyDown");
}
else
{
LCD12864_DisStr(3,"KeyUp");
}
}
}
return0;
}
/*****************************************************************************
函数名:KeyValue
功能描述:读取按键的状态
输入参数:void
输出参数:无
返回值:
修改历史:
1.日期:2014年9月14日
作者:retacn
修改内容:创建
*****************************************************************************/
uint8KeyValue(void)
{
if((P0&0X01)==0X00)//按下为低电平
{
returnKEY_DOWN;
}
else
{
returnKEY_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"
/*宏定义*/
#defineKEY_DOWN0X01
#defineKEY_UP0X02
volatileuint8NewKeyValue=0;
intmain(void)
{
/*显存*/
charLCDBuf[21]={0};
/*按键次数*/
intKeyCnt=0;
SysStartXOSC();//启动外部晶振
LCD12864_Init();//LCD初始化
//最大显示列数
LCD12864_DisStr(0,"helloretacn!");//行最多显示字符
LCD12864_DisStr(1,"KeyTest");
P0SEL&=~0X01;//设置为IO功能
P0DIR&=~0X01;//设置为输入功能
P0IEN|=0X01;//P0.0设置为中断方式
PICTL|=0X01;//下降沿触发
IEN1|=0X20;//允许P0口中断
P0IFG=0x00;//清除中断标志位
EA=1;//开总中断
sprintf(LCDBuf,"KeyCount:%d",KeyCnt++);//按键计数
LCD12864_DisStr(3,LCDBuf);
while(1)
{
if(KEY_DOWN==NewKeyValue)//按键按下
{
SoftWaitUs(25000);//延时防抖
if((P0&0X01)==0X00)//再次确认按键是否按下
{
sprintf(LCDBuf,"KeyCount:%d",KeyCnt++);//按键计数
LCD12864_DisStr(3,LCDBuf);
}
else
{
NewKeyValue=KEY_UP;//按键松开
}
}
}
return0;
}
/*****************************************************************************
函数名:P0_ISR
功能描述:P0口中断处理
输入参数:void
输出参数:无
返回值:
修改历史:
1.日期:2014年9月14日
作者:retacn
修改内容:创建
*****************************************************************************/
#pragmavector=P0INT_VECTOR
__interruptvoidP0_ISR(void)
{
if(0x01&P0IFG)
{
NewKeyValue=KEY_DOWN;//记录按键按下
}
P0IFG=0;//清中断标志
P0IF=0;//清中断标志
}