微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 不用延时去抖的按键程序

不用延时去抖的按键程序

时间:11-13 来源:互联网 点击:
今天完成一个很好的按键程序,一般教科书上写的都是延时去抖,那样一旦进入按键扫描子程序就不得不等待延时,这样会影响cpu做其他的事。一种高效的按键扫描方法是用定时扫描。把所有程序都附在下面,希望大家能看懂,也请多多指教。本程序的主要功能是采样定时扫描的高效按键扫描程序设置电压电流的值,实时显示在lcd1602上,在1602上可左移、右移,数值加减,以及设置/确认(复用键),还有一个短路键。

//主函数 main

#include msp430x14x.h>
#include "key.h"
#include "lcd1602.h"

uchar Key_Flag=0;
uchar Keyval = 0;
uchar Respond_Key_Flag=0; //响应键
uchar Set_Confirm_Flag=0; //设设置/确认标志

uchar Volt_buf[5]={1,2,.,2,6};
uchar Curr_buf[5]={0,5,.,5,4};

void Init_port();
void Init_SysClk();
void Init_TimerB();
void key_process();
//////////////////主函数///////////////
void main()
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
Init_port();
Init_LCD() ;
Init_SysClk();
Init_TimerB();
_EINT();

Disp1Char(0,0,U) ;
Disp1Char(1,0,:) ;
DispNChar(3,0, 5,Volt_buf);
Disp1Char(0x0F,0,V) ;

Disp1Char(0,1,I) ;
Disp1Char(1,1,:) ;
DispNChar(3,1, 5,Curr_buf);
Disp1Char(0x0F,1,A) ;

while(1)
{
key_process();

}

}
/*******************************************
函数名称:key_process
功 能:根据按键值执行任务
参 数:无
返回值 :无
********************************************/
void key_process()
{
static uchar x=3;
uchar keyvalue;
static uchar key_one_flag=0;

keyvalue = Key_Scan();
Keyval = 0;
if(Set_Confirm_Flag == 1)
{
if(keyvalue == 1) //设置/确认键
{
key_one_flag ^= 1;
if(key_one_flag==1)
{
write_cmd(0x0f); //打开显示屏,显示光标,光标所在位置的字符闪烁
LocateXY(3,0); //向液晶写入显示字符位置的坐标信息
}
else
{
write_cmd(0x0c);//开显示, 关光标,光标所在位置的字符不闪烁
Set_Confirm_Flag =0;
}
}

if((keyvalue == 2)&&( Respond_Key_Flag==1)) //短路键
{

Respond_Key_Flag=0;
Disp1Char(3,0,Z) ;
//TACCR0 = 65535; //PWM占空比设置为百分之百
}

if((keyvalue == 3)&&( Respond_Key_Flag==1)) //左移
{

Respond_Key_Flag=0;
if(x >3)
{
--x;
if(x<8)
LocateXY(x,0);
else
LocateXY(x-5,1);
}
else
{
x=12;
LocateXY(x-5,1);
}
}

if((keyvalue == 4)&&( Respond_Key_Flag==1)) //右移
{
Respond_Key_Flag=0;

if(x < 12)
{
++x;
if(x<8)
LocateXY(x,0);
else
LocateXY(x-5,1);
}
else
{
x=3;
LocateXY(x,0);
}

}

if((keyvalue == 5)&&( Respond_Key_Flag==1)) //数值"+"键
{
Respond_Key_Flag=0;

if(x<3 || x>12)
{
write_data( ) ;
}
else if(x==5||x==10)
{
write_data(.) ;
if(x==5)
LocateXY(x,0);
if(x==10)
LocateXY(x-5,1);

}
else
{
if((x>=3)&&(x<=7))
{
if(Volt_buf[x-3]<9)
Volt_buf[x-3] += 1;
else Volt_buf[x-3]=0;
Disp1Char(x,0,Volt_buf[x-3]) ;
LocateXY(x,0);
}
else
{
if(Curr_buf[x-8]<9)
Curr_buf[x-8] += 1;
else Curr_buf[x-8]=0;
Disp1Char(x-5,1,Curr_buf[x-8]) ;
LocateXY(x-5,1);
}
}
}

if((keyvalue == 6)&&( Respond_Key_Flag==1)) //数值"-"键
{
Respond_Key_Flag=0;

if(x<3 || x>12)
{
write_data( ) ;
}
else if(x==5||x==10)
{
write_data(.) ;
if(x==5)
LocateXY(x,0);
if(x==10)
LocateXY(x-5,1);

}
else
{
if((x>=3)&&(x<=7))
{
if(Volt_buf[x-3]>0)
Volt_buf[x-3] -= 1;
else Volt_buf[x-3]=9;
Disp1Char(x,0,Volt_buf[x-3]) ;
LocateXY(x,0);
}
else
{
if(Curr_buf[x-8]>0)
Curr_buf[x-8] -= 1;
else Curr_buf[x-8]=9;
Disp1Char(x-5,1,Curr_buf[x-8]) ;
LocateXY(x-5,1);
}
}
}

}

}

/*============================================
函数名称:Init_port
功 能:初始化I/O端口
参 数:无
返回值 :无
==============================================*/
void Init_port()
{
/*下面六行程序关闭所有的IO口*/
P1DIR = 0XFF;P1OUT = 0XFF;
P2DIR = 0XFF;P2OUT = 0XFF;
P3DIR = 0XFF;P3OUT = 0XFF;
P4DIR = 0XFF;P4OUT = 0XFF;
P5DIR = 0XFF;P5OUT = 0XFF;
P6DIR = 0XFF;P6OUT = 0XFF;
P6DIR |= BIT2;P6OUT |= BIT2; //关闭电平转换
//定义液晶端口

P4DIR = 0XFF; //数据口
P4OUT = 0;
//定义按键端口
P1DIR =BIT6 + BIT7; //设置P1.0~P.3为输入状态,P.7为输出

}
/*============================================
函数名称:Init_SysClk
功 能:初始化系统时钟
参 数:无
返回值 :无
==============================================*/

void Init_SysClk()
{

unsigned int i;

BCSCTL1 &= ~XT2OFF; // XT2= HF XTAL

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top