一、原理图
按键输入原理图如上所示,默认接口P01通过电阻上拉到VCC3.3,当按键按下时P01会处于低电平。
二、GPIO控制器
在闪烁LED实验,已经使用了IO功能选择和IO方向寄存器,本次按键输入实验还需要使用IO输入模式寄存器PxINP,定义如下:
从图中可以看出,对于端口1只能使用P12~P17。
使能S1按键,操作步骤如下:
• 1. 配置P0SEL,设置P01为普通IO口
• 2. 配置P0DIR,设置P01口为输入
• 3. 配置P0INP,设置P01上拉
三、代码实现
#include <ioCC2530.h>
#define KEY P0_1
#define LED1 P1_0
typedef unsigned char uchar;
typedef unsigned int uint;
void DelayMS(uint msec)
{
uint i,j;
for (i=0; i<msec; i++)
for (j=0; j<535; j++);
}
uchar Keyscan(void)
{
if(KEY == 0) {
DelayMS(100); //延时100MS消抖
if(KEY == 0) {
while(!KEY); //直到按键松开
return 1; //有按键按下
}
}
return 0; //默认无按键按下
}
void InitKEY(void)
{
P0SEL &= ~0X02; //配置为通用IO模式
P0DIR &= ~0X02; //配置为输出模式
P0INP &= ~0X02; //配置为上下拉模式
}
void InitLED(void)
{
P1SEL &= 0XFE; //配置为通用IO模式
P1DIR |= 0X01; //配置为输出模式
}
void main(void)
{
InitLED(); //LED寄存器初始化
InitKEY(); //KEY寄存器初始化
while(1) {
if(Keyscan()) LED1 = !LED1;
}
}
代码实现功能,每当有按键按下,LED的状态取反。
uchar Keyscan(void)
{
if(KEY == 0) {
DelayMS(100); //延时100MS消抖
if(KEY == 0) {
while(!KEY); //直到按键松开
return 1; //有按键按下
}
}
return 0; //默认无按键按下
}
该函数为按键状态扫描函数,由于物理特性,按键按下瞬间会多次置为1/0,俗称抖动所以我们第一次判断出P0_1为0时,需要给一个合理的延时然后再次判断P0_1是否为0如果仍然为0,表示按键按下。
注意:这种让CPU卡死的延时效率很低,后期可以使用定时器功能实现