[1-2]玩转MSP430F5529之按键输入

前言:

        在过往的日子里,由于电脑内存空间的捉襟见肘,我曾考虑卸载Code Composer Studio 12.3.0这款陪伴我度过无数日夜编程时光的利器。然而,每当我回想起那些与电赛并肩作战的日子,那些用CCS编写、调试的代码,它们不仅仅是一行行字符,更是我成长的足迹,是我技术路上坚实的基石。因此,我犹豫再三,终究不舍将这份宝贵的回忆一并删除。

        为了将这些珍贵的代码片段永久保存,也为了与更多热爱编程的同行交流学习,我决定将它们整理成篇,发布在CSDN博客上,以此作为自己技术之路上的里程碑。当时,我满怀激情地开始了我的第一篇博客之旅,但因种种原因,后续篇章的撰写被暂时搁置。

        如今,时光荏苒,我重拾起这份未竟的情怀,继续我的博客写作之路。在这里,我将分享我的编程经验、学习心得,以及那些陪伴我成长的代码片段。虽然我的文字可能还不够成熟,我的见解也许尚显浅薄,但我相信,每一次的分享都是一次成长的机会。

        因此,我诚挚地邀请各位读者,无论是技术大咖还是编程新手,都能在我的博客中留下宝贵的意见和建议。您的每一条评论、每一次私信,都是我前进的动力。让我们共同在编程的道路上携手前行,共同成长。

一、按键S2控制LED2

1、方法一:直接使用MSP430微控制器的GPIO端口来实现按键控制LED灯

#include <msp430.h> 
/**
 * MSP-EXP430F5529LP:
 * MSP-EXP4305529上有两个用户按键:P2.1->S1;P1.1->S2
 * 两个用户LED:P1.0->LED1;P4.7->LED2
 *
 * S2控制LED2
 */
int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;   // stop watchdog timer
    P1DIR=0x00;//设置P1.1的方向为输入
    P1REN=0x02;//启用P1.1的内部上下拉电阻
    P1OUT=0x02;//设置为上拉电阻
    P4DIR=0X80;//设置P4.7的方向为输出,控制绿色LED灯
    while(1)
    {
        if((P1IN&0x02)==0x00)//读取输入值,如果是低电平,则点亮LED2
        {
            P4OUT=0x80; //设置P4.7输出为高电平,点亮LED2
        }
        else
        {
            P4OUT=0x00; //设置P4.7输出为低电平,熄灭LED2
        }
    }
}

2、方法二:使用逻辑运算符位掩码操作来设置GPIO端口的方向,从而实现按键控制LED灯

#include <msp430.h> 
/**
 * MSP-EXP430F5529LP:
 * MSP-EXP4305529上有两个用户按键:P2.1->S1;P1.1->S2
 * 两个用户LED:P1.0->LED1;P4.7->LED2
 *
 * S2控制LED2
 */
int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	//P1DIR=0x00;//设置P1.1的方向为输入
	P1DIR &= 0xFD;
	//P1REN=0x02;//启用P1.1的内部上下拉电阻
	P1REN |= 0x02;
	//P1OUT=0x02;//设置为上拉电阻
	P1OUT |= 0x02;
	//P4DIR=0X80;//设置P4.7的方向为输出,控制绿色LED灯
	P4DIR |= 0x80;
	while(1)
	{
	    if((P1IN&0x02)==0x00)//读取输入值,如果是低电平,则点亮LED2
        {
	       // P4OUT=0x80; //设置P4.7输出为高电平,点亮LED2
	        P4OUT |= 0x80;
        }
        else
        {
           // P4OUT=0x00; //设置P4.7输出为低电平,熄灭LED2
            P4OUT =  P4OUT & ~(0x80);
        }
	}
}

二、按键S2控制LED1

1、方法一

#include <msp430.h> 
/**
 * MSP-EXP430F5529LP:
 * MSP-EXP4305529上有两个用户按键:P2.1->S1;P1.1->S2
 * 两个用户LED:P1.0->LED1;P4.7->LED2
 *
 * S2控制LED1
 */
int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;   // stop watchdog timer
    P1DIR &= 0xFD;//设置P1.1的方向为输入
   // P1DIR &= ~BIT1;
    P1REN |= 0x02;//启用P1.1的内部上下拉电阻
   //P1REN |= BIT1;
    P1OUT |= 0x02;//设置为上拉电阻
   // P1OUT |= BIT1;
   P1DIR |= 0x01;//设置P1.0的方向为输出,控制红色LED灯
   // P1DIR |= BIT0;
   // P1OUT &= ~BIT0;
    while(1)
    {
        if((P1IN&0x02)==0x00)//读取输入值,如果是低电平,则点亮LED1
        {
            P1OUT |= 0x01; //设置P1.0输出为高电平,点亮LED1
           // P1OUT |=BIT0;
        }
        else
        {
            P1OUT=P1OUT & ~(0x01); //设置P1.0输出为低电平,熄灭LED1
           // P1OUT &= ~(BIT0);
        }
    }
}

2、方法二

#include <msp430.h> 
/**
 *MSP-EXP430F5529LP:
 * MSP-EXP4305529上有两个用户按键:P2.1->S1;P1.1->S2
 * 两个用户LED:P1.0->LED1;P4.7->LED2
 *
 * S2控制LED1
 */
int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;   // stop watchdog timer
    //P1DIR &= 0xFD;//设置P1.1的方向为输入
    P1DIR &= ~BIT1;
    // P1REN |= 0x02;//启用P1.1的内部上下拉电阻
    P1REN |= BIT1;
    // P1OUT |= 0x02;//设置为上拉电阻
    P1OUT |= BIT1;
    //P1DIR |= 0x01;//设置P1.0的方向为输出,控制红色LED灯
    P1DIR |= BIT0;
   // P1OUT &= ~BIT0;//初始化灯的状态,熄灭
    while(1)
    {
        if((P1IN&0x02)==0x00)//读取输入值,如果是低电平,则点亮LED1
        {
            //P1OUT |= 0x01; //设置P1.0输出为高电平,点亮LED1
            P1OUT |=BIT0;
        }
        else
        {
            //P1OUT=P1OUT & ~(0x01); //设置P1.0输出为低电平,熄灭LED1
            P1OUT &= ~(BIT0);
        }
    }
}

三、单击按键控制LED,按下S2,LED1亮,再按LED1灭

#include <msp430.h> 
/**
 *MSP-EXP430F5529LP:
 *MSP-EXP4305529上有两个用户按键:P2.1->S1;P1.1->S2
 *两个用户LED:P1.0->LED1;P4.7->LED2
 *
 *S2控制LED1:
 *
 *按键消抖
 *按键释放
 *
 *基本功能:按键S2控制LED1;
 *思考与扩展:按键S1控制LED2;
 */
int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	/*
	 * PIDIR xxxx xxxx
	 * BIT1  0000 0010
	 * ~BIT1 1111 1101
	 * &     xxxx xx0x 只是把特定的比特位清零
	 */
	P1DIR &= ~BIT1;//设置P1.1的方向为输入,屏蔽无关位,指定位清零,P1有8个引脚,即8个比特位
	P1REN |= BIT1;//启用P1.1的内部上下拉电阻
	P1OUT |= BIT1;//设置为上拉电阻
	P1DIR |= BIT0;//设置P1.0的方向为输出,控制红色LED灯
	P1OUT &= ~BIT0;//初始化灯的状态,熄灭
	while(1)
	     {
	        /*
	         * 读取引脚P1.1,如果是低电平,则点亮LED
	         * P1IN & BIT1——》屏蔽无关位,P1有8个引脚,即8个比特位
	         * P1IN  xxxx xxxx
	         * BIT1  0000 0000
	         * &     0000 00x0-->只保留P1.1的输入值
	         * 此时,
	         * P1.1为高电平(按键未动),0000 0010=BIT1
	         * P1.1为低电平(按键按下),0000 0010=0x00
	         *
	         */
	        if((P1IN&BIT1)==0x00)//读取输入值,如果是低电平,则点亮LED1
	        {
	            /*
	             * 延时周期函数nop()
	             * 每个周期是多长时间呢? 默认的时频率~1MHZ
	             */
	            _delay_cycles(20000);//20ms延时
	            _no_operation();
	        }
	        if((P1IN&BIT1)==0x00)//读取输入值,如果是低电平,则点亮LED1
	        {
	            P1OUT ^= BIT0;//取反操作,原来亮的LED变灭,原来亮的变亮
	            while((P1IN&0x02)==0x00);//等待按键释放
	        }
	    }
}

四、按键分别控制LED

#include <msp430.h> 
/**
 *MSP-EXP430F5529LP:
 *MSP-EXP4305529上有两个用户按键:P2.1->S1;P1.1->S2
 *两个用户LED:P1.0->LED1;P4.7->LED2
 *
 *S1控制LED1
 *S2控制LED2
 *每次按下时,改变LED的状态
 *
 *思考:
 *如果按住按键S1不松开,会有什么现象 不变,长按亮松开还是亮,再长按灭松开还是灭
 *按住S1不松开的同时,按S2,会有响应吗?没有反应,长按S2不松开的同时,按S1也不会有反应
 *
 *引入按键键值的概念
 */
void main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	P1DIR &= ~BIT1;//设置P1.1为输入
	P1REN |= BIT1;//设置P1.1的内部上下拉电阻,且设置为上拉
	P1OUT |= BIT1;
	P2DIR &= ~BIT1;//设置P2.1为输入
	P2REN |= BIT1;//启用P2.1的内部上下拉电阻,且设置为上拉
	P2OUT |= BIT1;
	P1DIR |= BIT0;//设置P1.0为输出
	P1OUT &= ~BIT0;//初始化灯的状态,熄灭
	P4DIR |= BIT7;//设置P4.7为输出
	P4OUT &=~BIT7;//初始化灯的状态,熄灭
	while(1)
	{
	    //读取引脚P1.1,如果是低电平,则点亮LED
	    if((P1IN&BIT1)==0x00)
	    {
	        /*
	         * 延时周期函数nop()
	         * 每个周期是多长时间呢? 默认的时频率~1MHZ
	         */
	        _delay_cycles(20000);//20ms延时
	        if((P1IN&BIT1)==0x00)
	        {
	            P4OUT ^= BIT7;//取反操作:原来亮的LED变灭,原来灭的LED变亮
	            while((P1IN&BIT1)==0x00);//等待按键释放
	        }
	    }
	    //读取引脚P2.1,如果是低电平,则点亮LED
	    if((P2IN&BIT1)==0x00)
	    {
	        _delay_cycles(20000);//20ms延时
	        if((P2IN&BIT1)==0x00)
	        {
	            P1OUT ^= BIT0;//取反操作:原来亮的LED变灭,原来灭的LED变亮
	            while((P2IN&BIT1)==0x00);//等待按键释放
	        }
	    }
	}
}

五、 按键控制LED的闪烁速度

#include <msp430.h> 
/**
 * 按键控制LED的闪烁速度
 *MSP-EXP430F5529LP:
 *MSP-EXP4305529上有两个用户按键:P2.1->S1;P1.1->S2
 *两个用户LED:P1.0->LED1;P4.7->LED2
 *
 * 上电后LED闪烁:通过按键S1,S2调整闪烁的频率,8种闪烁的频率
 *按键S1,闪烁的速度加快,到最快的时候,回到最慢
 *按键S2,闪烁的速度变慢,到最慢的时候,回到最快
 *思考:
 *有哪些操作可以提取成函数的?
 */
unsigned int const u16DelayTable[]={3000,5000,8000,10000,15000,30000,50000,60000};
void main(void)
{
    unsigned int u16_deley_temp;
    unsigned int u16_deley_config;
    unsigned char u8_config_index;
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	P1DIR &= ~BIT1;//设置P1.1为输入
	P1REN |= BIT1;//设置P1.1的内部上下拉电阻,且设置为上拉
    P1OUT |= BIT1;
    P2DIR &= ~BIT1;//设置P2.1为输入
	P2REN |= BIT1;//启用P2.1的内部上下拉电阻,且设置为上拉
	P2OUT |= BIT1;
	P1DIR |= BIT0;//设置P1.0为输出
	P1OUT &= ~BIT0;//初始化灯的状态,熄灭
	u8_config_index=4;
	u16_deley_config=u16DelayTable[u8_config_index];
	while(1)
	    {
	        //读取按键S2,引脚P1.1,如果是低电平,则点亮LED
	        if((P1IN&BIT1)==0x00)
	        {
	            _delay_cycles(20000);//20ms延时
	            if((P1IN&BIT1)==0x00)
	            {
	                /*
	                 * 一共8给档,下标对应0-7
	                 * 如果已经是7,则从0开始,加1档
	                 */
	                if(u8_config_index == 7)
	                {
	                    u8_config_index=0;
	                }
	                else
	                {
	                    u8_config_index++;
	                }
	                u16_deley_config=u16DelayTable[u8_config_index];
	                while((P1IN&BIT1)==0x00);//等待按键释放
	            }
	        }
	        //读取按键S1,引脚P2.1,如果是低电平,则点亮LED
	        if((P2IN&BIT1)==0x00)
	        {
	            _delay_cycles(20000);//20ms延时
	            if((P2IN&BIT1)==0x00)
	            {
	                /*
	                 * 一共8给档,下标对应0-7
	                 * 如果已经是0,则回到7开始,减1档
	                 */
	                if(u8_config_index==0)
	                {
	                    u8_config_index=7;
	                }
	                else
	                {
	                    u8_config_index--;
	                }
	                u16_deley_config=u16DelayTable[u8_config_index];
	                while((P2IN&BIT1)==0x00);//等待按键释放
	            }
	        }
	        //LED以特定的参数进行闪烁控制
	        P1OUT ^= BIT0;
	        for(u16_deley_temp=0;u16_deley_temp<u16_deley_config;u16_deley_temp++);
	    }
}

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值