源程序为:有两种一种为while(!SWITCH1);一直在等待,一种是采用查询状态为操作;自我感觉后一种好不影响其它程序;尤其是任务数多的时候
/**************************************************
** 本程序只供学习使用,未经作者许可,不得用于其它任何用途
** 作者: shizhe
** 创始时间:2014-05-08
** 修改人:shizhe
** 修改时间:2014-05-08
** 修改人:shizhe
** 修改时间:2014-05-08
** 描述:
** 按键功能操作查询…
** 版权所有,盗版必究。
** Copyright(C) 联控智能 2014-2020
** All rights reserved
*************************************************/
#include
#define uint unsigned int
#define uchar unsigned char
#define LED1 P0_5
#define LED2 P1_0
#define LED3 P1_1
#define SWITCH1 P1_2
uchar ch;
uchar sw_back;
/****************************
延时函数
*****************************/
void Delayms(uint xms) //i=xms
{
uint i,j;
for(i=xms;i>0;i--)
for(j=600;j>0;j--);
}
/****************************
LED初始化函数
*****************************/
void InitLed(void)
{
P1SEL &= ~0x03; //P1_0,P1_1定为普通IO口
P1DIR |= 0x03; //P1_0,P1_1定义为输出
P0SEL &= ~0x20; //P0_5定为普通IO口
P0DIR |= 0x20; //P0_5定义为输出
LED1 = 0; //LED1灯熄灭
LED2 = 0; //LED2灯熄灭
LED3 = 0; //LED3灯熄灭
}
/****************************
按键初始化函数
*****************************/
void InitKey()
{
P1SEL &= ~0X04; //设置P1_2为普通IO口
P1DIR &= ~0X04; //按键在P1_2 口,设置为输入模式
P1INP &= ~0x04; //配置P1_2为输入模式
P2INP &= ~0x40; //p配置P1_2为上拉输入
}
void main()
{
InitLed();
InitKey();
while(1)
{
if(sw_back != 0x00){ //状态位判断按键松开操作
if(SWITCH1 == 0x00){
Delayms(100);
if(SWITCH1 == 0x00){
sw_back = 0x00;
ch++;
if(ch > 3) ch = 1;
}
// while(!SWITCH1); //死循环在等待按键松开
}
}
if(SWITCH1) sw_back = 0x01; //状态位判断按键松开操作
switch(ch) //switch 选择语句
{
case 0x01:
LED1 = 1; //LED1灯熄灭
LED2 = 0; //LED2灯熄灭
LED3 = 0; //LED3灯熄灭
break;
case 0x02:
LED1 = 0; //LED1灯熄灭
LED2 = 1; //LED2灯熄灭
LED3 = 0; //LED3灯熄灭
break;
case 0x03:
LED1 = 0; //LED1灯熄灭
LED2 = 0; //LED2灯熄灭
LED3 = 1; //LED3灯熄灭
break;
default:
break;
}
}
}
下面我为大家介绍另一种控制按键的方法,引脚边沿中断方法;首先得配置引脚中断寄存器;
看下面配置:
P1IEN |= 0X04; //P1_2 设置为中断方式
PICTL &=~ 0X02; // 下降沿触发
IEN2 |= 0X10; // 允许P1_2口中断;
P1IFG = 0x00; // 初始化中断标志位
EA = 1;
源程序如下:
/**************************************************
** 本程序只供学习使用,未经作者许可,不得用于其它任何用途
** 蓝牙4.0底板开发板
** 作者: shizhe
** 创始时间:2014-05-08
** 修改人:shizhe
** 修改时间:2014-05-08
** 修改人:shizhe
** 修改时间:2014-05-08
** 描述:
** 按键功能操作引脚中断…
** 版权所有,盗版必究。
** Copyright(C) 联控智能 2014-2020
** All rights reserved
*************************************************/
#include
#define uint unsigned int
#define uchar unsigned char
#define LED1 P0_5
#define LED2 P1_0
#define LED3 P1_1
#define SWITCH1 P1_2
uchar ch;
void delay(unsigned int i)
{
unsigned int j;
for(j=0;j
}
}
/****************************
LED初始化函数
*****************************/
void InitLed(void)
{
P1SEL &= ~0x03; //P1_0,P1_1定为普通IO口
P1DIR |= 0x03; //P1_0,P1_1定义为输出
P0SEL &= ~0x20; //P0_5定为普通IO口
P0DIR |= 0x20; //P0_5定义为输出
LED1 = 0; //LED1灯熄灭
LED2 = 0; //LED2灯熄灭
LED3 = 0; //LED3灯熄灭
}
/****************************
按键初始化函数
*****************************/
void InitKey()
{
P1IEN |= 0X04; //P1_2 设置为中断方式
PICTL &=~ 0X02; // 下降沿触发
IEN2 |= 0X10; // 允许P1_2口中断;
P1IFG = 0x00; // 初始化中断标志位
EA = 1;
}
void main()
{
InitLed();
InitKey();
while(1)
{
switch(ch)
{
case 0x01:
LED1 = 1; //LED1灯熄灭
LED2 = 0; //LED2灯熄灭
LED3 = 0; //LED3灯熄灭
break;
case 0x02:
LED1 = 0; //LED1灯熄灭
LED2 = 1; //LED2灯熄灭
LED3 = 0; //LED3灯熄灭
break;
case 0x03:
LED1 = 0; //LED1灯熄灭
LED2 = 0; //LED2灯熄灭
LED3 = 1; //LED3灯熄灭
break;
default:
break;
}
}
}
/****************************
中断处理函数
*****************************/
#pragma vector = P1INT_VECTOR //格式:#pragma vector = 中断向量,紧接着是中断处理程序
__interrupt void P1_ISR(void)
{
ch++;
if(ch > 3) ch = 1;
P1IFG = 0; //清中断标志
P1IF = 0; //清中断标志
}
按键就介绍到这里,在一个项目,甚至一个小产品中,按键是很重要的角色;如何把按键做的很稳定,实时性高是一门学问,其实还有一种方法,利用定时器中断时间去去抖,既不影响系统实时性,也能起到抗干扰作用,一举两得,这就作为课后练习了。至于组合按键和4*4键盘,程序我会在后面项目中体现,谢谢!