1
在本次课程中,我将向大家介绍单片机的输入口的使用。
在这里,我以最简单的检测一个按键是否被按下为例来向大家介绍。
一、STC15W408AS按键检测电路
下面是本例中按键检测的电路原理图,K1是一个按键,它接在单片机的P3.3口上,R2是一个与按键连接的上拉电阻。
二、按键检测原理
在本例中,按键与单片机的第14脚(P3.3引脚)相连。当按键没有按下时,P3.3的电平是高电平;当按键被按下时,按键将P3.3与地短接,此时P3.3的电平为低电平。
从分析可知,根据P3.3电平的变化状态,我们可以知道按键是否被按下。因此,我们只要检测P3.3电平的状态,就可以判断出按键的状态。
三、STC15W408AS输入模式配置方法
为了让单片机能检测按键,我们必须将单片机的P3.3口设置为输入口,也就信号是从单片机外输入到单片机内。因此,必须将单片机的IO口模式设置为输入模式。
如果要将STC15W408AS的引脚配置成输入模式,只需修改PxM0和PxM1两个寄存器的值。下面是STC15的STC15W408AS引脚的配置说明:
四、按键检测有关代码
下面是本例中,按键检测相关的代码:
#define Pin_KEY P33
#define Pin_KEY_M1 P3M1
#define Pin_KEY_M0 P3M0
#define Pin_KEY_BIT BIT3
#define GetKey_High() Pin_KEY==1
void PinKEY_DirIn(void)
{
Pin_KEY_M1 &=~Pin_KEY_BIT;
Pin_KEY_M0 &=~Pin_KEY_BIT;
}
五、本例中按键检测指示
为了显示按键的是否被按下,我们用上节课程中介绍的单片机点LED的亮灭状态来表示按键的状态。当按键没被按下时,LED不亮;当按键被按下时,LED灯点亮。
请看下面代码:
PinKEY_DirIn(); //将按键所在的口设置为输入模式
while(TRUE)
{
if(GetKey_High()) //如果检测到按键口是高电平
{
PinLed_High(); //则将LED所在口置高,LED不亮。
}else{
PinLed_Low(); //否则,将LED所在口置低,LED点亮
}
}
六、按键检测完整源程序
#define BIT0 0x01
#define BIT1 0x02
#define BIT2 0x04
#define BIT3 0x08
#define BIT4 0x10
#define BIT5 0x20
#define BIT6 0x40
#define BIT7 0x80
#define TRUE 1
#define FALSE 0
#define BEEP_ON 1
#define BEEP_OFF 0
#define Pin_LED P32
#define Pin_LED_M1 P3M1
#define Pin_LED_M0 P3M0
#define Pin_LED_BIT BIT2
#define PinLed_High() Pin_LED=1
#define PinLed_Low() Pin_LED=0
#define Pin_KEY P33
#define Pin_KEY_M1 P3M1
#define Pin_KEY_M0 P3M0
#define Pin_KEY_BIT BIT3
#define GetKey_High() Pin_KEY==1
void PinKEY_DirIn(void);
void PinLED_DirOut(void);
void main(void)
{
PinLED_DirOut();
PinKEY_DirIn();
PinLed_Low();
while(TRUE)
{
if(GetKey_High())
{
PinLed_High();
}else{
PinLed_Low();
}
}
}
void PinKEY_DirIn(void)
{
Pin_KEY_M1 &=~Pin_KEY_BIT;
Pin_KEY_M0 &=~Pin_KEY_BIT;
}
void PinLED_DirOut(void)
{
Pin_LED_M1 &=~Pin_LED_BIT;
Pin_LED_M0 |=Pin_LED_BIT;
}
全部0条评论
快来发表一下你的评论吧 !