先介绍一下上拉、下拉:
上拉、下拉
I/O端口中,有的上下拉电阻可以设置,有的不可以设置,有的是内置,有的是需要外接,I/O端口类似于一个三极管的集电极C,
•当C接通过一个电阻和电源连接在一起的时候,该电阻成为C上拉电阻,该端口常态时为高电平, 用于检测低电平的输入 ;
•如果C通过一个电阻和地连接在一起的时候,该电阻称为下拉电阻,使该端口常态时为低电平,用于检测高电平的输入 ;
实战:•按下按键S3使D1点亮。
图1 LED引脚图
图2 S3按键引脚图
上拉模式 :
#include <ioCC2530.h>
#define S3 P1_3
#define LED1 P1_0
void main(void)
{
//LED灯初始化:
P1SEL&=~(1<<0); // 仅将P1SEL第0位清0,P1_0定义为普通IO
P1DIR|=(1<<0); // 仅将P1DIR第0位置1,P1_0定义为输出
//按键初始化 上拉模式 :
P1SEL&=~(1<<3); // 仅将P1SEL第3位清0,P1_3定义为普通IO
P1DIR&=~(1<<3); // 仅将P1DIR第3位清0,P1_3定义为输入
P1INP&=~(1<<3); // 仅将P1INP第3位清0,P1_3定义为上拉/下拉模式
P2INP&=~(1<<6); // 仅将P2INP第6位清0,整个P1口定义为为上拉模式
while(1)
{
if(S3==0)
LED1=0;//按下按键S3,点亮LED1
else LED1=1;
}
}
下拉模式 :
#include <ioCC2530.h>
#define S3 P1_3
#define LED1 P1_0
void main(void)
{
//LED灯初始化:
P1SEL&=~(1<<0); // 仅将P1SEL第0位清0,P1_0定义为普通IO
P1DIR|=(1<<0); // 仅将P1DIR第0位置1,P1_0定义为输出
//按键初始化 下拉模式 :
P1SEL&=~(1<<3); // 仅将P1SEL第3位清0,P1_3定义为普通IO
P1DIR&=~(1<<3); // 仅将P1DIR第3位清0,P1_3定义为输入
P1INP&=~(1<<3); // 仅将P1INP第3位清0,P1_3定义为上拉/下拉模式
P2INP|=(1<<6); // 仅将P2INP第6位清0,整个P1口定义为为上拉模式
while(1)
{
if(S3==0)
LED1=0;//按下按键S3,点亮LED1
else LED1=1;
}
}
三态模式:
#include <ioCC2530.h>
#define S3 P1_3
#define LED1 P1_0
void main(void)
{
//LED灯初始化:
P1SEL&=~(1<<0); // 仅将P1SEL第0位清0,P1_0定义为普通IO
P1DIR|=(1<<0); // 仅将P1DIR第0位置1,P1_0定义为输出
//按键初始化 三态模式 :
P1SEL&=~(1<<3); // 仅将P1SEL第3位清0,P1_3定义为普通IO
P1DIR&=~(1<<3); // 仅将P1DIR第3位清0,P1_3定义为输入
P1INP|=(1<<3);//仅将P1INP第3位置1,P1_3定义为三态模式
while(1)
{
if(S3==0)
LED1=0;//按下按键S3,点亮LED1
else LED1=1;
}
}
实践表明:经过上述三个程序中设置P1INP,将引脚输入时设置为上拉、三态,都能检测到按键是否按下的状态。
在作为普通IO输入时 ,P1INP可不设置;在进行ADC转换时,必须将引脚设置成三态,否则电压采集不准。