前言:
在过往的日子里,由于电脑内存空间的捉襟见肘,我曾考虑卸载Code Composer Studio 12.3.0这款陪伴我度过无数日夜编程时光的利器。然而,每当我回想起那些与电赛并肩作战的日子,那些用CCS编写、调试的代码,它们不仅仅是一行行字符,更是我成长的足迹,是我技术路上坚实的基石。因此,我犹豫再三,终究不舍将这份宝贵的回忆一并删除。
为了将这些珍贵的代码片段永久保存,也为了与更多热爱编程的同行交流学习,我决定将它们整理成篇,发布在优快云博客上,以此作为自己技术之路上的里程碑。当时,我满怀激情地开始了我的第一篇博客之旅,但因种种原因,后续篇章的撰写被暂时搁置。
如今,时光荏苒,我重拾起这份未竟的情怀,继续我的博客写作之路。在这里,我将分享我的编程经验、学习心得,以及那些陪伴我成长的代码片段。虽然我的文字可能还不够成熟,我的见解也许尚显浅薄,但我相信,每一次的分享都是一次成长的机会。
因此,我诚挚地邀请各位读者,无论是技术大咖还是编程新手,都能在我的博客中留下宝贵的意见和建议。您的每一条评论、每一次私信,都是我前进的动力。让我们共同在编程的道路上携手前行,共同成长。
一、按键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++);
}
}