当前位置:文档之家› msp430按键控制LED最基本程序

msp430按键控制LED最基本程序

按键篇
经过一短时间的学习,下面,亲自动手编写一下程序吧。
程序的目的是:按下按键,控制LED的亮和灭。短按键,则小灯亮1秒,然后灭; 长按键,小灯常亮。
首先,完成键盘的扫描程序。
第一点:如果是扫描,就要用到定时器。我想设计定时器每隔IOms扫描一次按
键。
定时器,我选用定时器A。它的定时中断函数如下:
函数名称:TimerA_ISR
Else
TIME_1_S=0;
If(FlagLcd==2)
TIME_L_S=1;
}
If((TIME_1_S>0)||( TIME_L_S==1))
功能:定时器A的中断服务函数
参 数:无
返回值 :无********************************************/#pragma vector=TIMERAO_VECTOR__interrupt void TimerA_ISR(void){
GetKey();
}
上面这个定时中断函数的意思就是:每当定时时间到了以后,就调用GetKey()函数一次。GetKey()函数就是扫描键盘按键的函数了。在GetKey()函数中,会 根据按键类型(长按/短按)返回不同的数值。根据返回的数值,做小灯亮法的 操作。那么,返回的这个值,我们需要保存在一个变量中,在这里定义一个变量ucharFlagLcd;来保存返回值。这个变量在全局变量中定义,以保证它的作用 域。
}
下面是键盘扫描函数:
Un Sig ned Char GetKeyO
{
Un Sig ned Char keyRetu=0; //返回的按键值
StatiC UnSigned Char s_keyState=0,keyTime=0; //按键状态,按键按下的时间
计数器
switch (s_keyState)
s_keyState=3; //转到状态3 keyTime=0; //清零按键时间计数器keyRetu=2; //输出2
}
}
break;
case 3: if((P1IN&0x01)==1) //检测到按键松开{
s_keyState=O; //状态转到状态O
}_
else
{
s_keyState=3; //转到状态3
{
s_keyState=0; //没有检测到按键,说明状态0检测到是一个抖动,重新转到状态0
}
break;
case 2: if((P1IN&0x01)==1) //检测到按键松开{
s_keyState=0; //状态转到状态0 keyRetu=1; //输出1
}
else
{if(++keyTime>=50) //按下时间>1s{
{
case 0:
if((P1IN&0x01)==0) //检测到有按键,转到状态1,相当于是消抖过程。((P1IN&0x01)==0判断P1.0口输
入是高还是低电平
{
s_keyState=1;
}
break;
case 1:
if((P1IN&0x01)==0) //再次检测到有按键,转到状态2
{
s_keyState=2; keyTime=0; //清零按键时间计数器}else
那么定时函数就变为
#pragma vector=TIMERAO_VECTOR
__interrupt void TimerA_ISR(void)
{
FlagLcd =GetKey();
}
定时器中断的时间间隔,我在主函数中定义。
这样写:
CCTLO = CCIE; //使能CCR冲断
CCRO=4O;//设定周期O.O1S
TACTL = TASSEL_1 +ID_3 +MC_1;//定时器A的时钟源选择ACLK增计数模 式这样,定时器这块就算完工了。那么,下面进行按键扫描程序。
按键的定义是这样的,根据我板子的按键原理图如下
Pl +
PlA
Pl了
这是一个矩阵键盘。其中KEY就是外部高电平3.3V。我只想用其中的P1.0作为 这次试验的按键。那么,做些设置就可以了。将P1.7方向设置为输出,并输出
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA_ISR(void)
{
FlagLcd =GetKey();
If(FlagLcd==1)
TIME_1_S=1;
If((TIME_1_S>0)&&( TIME_1_S<100))
TIME_1_S++;
在主程序中定义全局变量unsigned int TIME_1_S=0;然后再定时器中断函数中 做些改动
#pragma vector = TIMERA0_VECTOR
__interrupt void TimerA_ISR(void)
{
FlagLcd =GetKey();
If(FlagLcd==1)
TIME_1_S=1; If((TIME_1_S>0)&&( TIME_1_S<100))
电平为低。这样,才能实现当K1按下时,P1.0输入为低;当K1抬起时,P1.0输Pad(VOid)
{_
P1DIR = 0xfe; /∕P1.0设置为输入状态,P1.1~P1.7设置为输出状态
P10UT &= 0x7f; // P1.0~P1.6输出高电平,P1.7输出低电平
}_
break;
}
return keyRetu;
}
上面这个扫描函数,根据按键K1是长按还是短按,返回不同的值:长按,返回
2;短按,返回1。
获得了返回值以后,就要对LED进行操作了。
我的板子的LED如下图
LED是LED供电高电平,这里我只想用其中的
P2DIR = 0xff; //设置P2口方向为输出
P2OUT = 0xff; //设置P2口输出高电平那么P2OUT = 0xfe,贝U LED亮;P2OUT = 0xff,贝U LED灭。这个很好实现。但 是,怎么样才能持续亮1s呢?这个问题还需要定时器来解决。我在这里还利用 定时器A来完成这个任务。
TIME_1_S++;
Else
TIME_1_S=0;
}
这样,在控制LED的时候,可以这样写
If(TIME_1_S>0)
P2OUT=0xfe;
Else
P2OUT=0xff;
就实现了亮1S的效果。
那么长按键的时候呢,则需要再做一下处理。
在主程序中定义全局变量unsigned int TIME_L_S=0;然后再定时器中断函数中做些改动
相关主题