不用延时去抖的按键程序
//主函数 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
延时去抖按键程 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)