快速入门msp430g2553

1.如何新建一个工程
在这里插入图片描述

在这里插入图片描述

2.点亮一个led灯

在这里插入图片描述

首先知道led1的io口是1.0

/*将P1.0设置为输出,P1DIR是P1口的方向寄存器*/
    P1DIR |= BIT0;
    /*将P1.0设置为高电平,点亮LED1*/
    P1OUT |= BIT0;

led2(闪烁)的io口是1.6

/*初始化LED2所在IO口P1.6为输出*/
    P1DIR |= BIT6;
    /*初始化LED2所在IO口P1.6为低电平,LED2初始状态为灭*/
    P1OUT &= ~BIT6;
    while(1)
    {
    	P1OUT ^= BIT6;
    	/*此语句等效为P1OUT = P1OUT ^ BIT6
    	 
    	__delay_cycles(500000);
	}

3.按键控制led

知道按键是p1.3口

这里需要知道上拉电阻在这里插入图片描述
(如果没有启动上拉电阻的话,按键灯带到效果)

    /*初始化按键所在IO口P1.3为输入*/
    P1DIR &= ~BIT3;
    /*使能P1.3口的上拉电阻*/
    P1REN |= BIT3;
    P1OUT |= BIT3;
    
 	if(P1IN & BIT3)//如果P1.3口为高电平,证明按键没被按下
    	{
    		P1OUT &= ~BIT6;//熄灭LED2
    	}
    	else//如果P1.3为低电平,按键被按下
    	{
    		P1OUT |= BIT6;//点亮LED2
    	} 

4.主时钟相关概念

在这里插入图片描述

    /*设置MCLK频率*/
    DCOCTL = CALDCO_8MHZ;
    BCSCTL1 = CALBC1_8MHZ;

5.串口调试发送数据

在这里插入图片描述

	/*配置DCO为1MHz*/
    DCOCTL = CALDCO_1MHZ;
    BCSCTL1 = CALBC1_1MHZ;
    /*配置SMCLK的时钟源为DCO*/
	BCSCTL2 &= ~SELS;
    /*SMCLK的分频系数置为1*/
    BCSCTL2 &= ~(DIVS0 | DIVS1);

    /*复位USCI_Ax*/
    UCA0CTL1 |= UCSWRST;

    /*选择USCI_Ax为UART模式*/
    UCA0CTL0 &= ~UCSYNC;

    /*配置UART时钟源为SMCLK*/
    UCA0CTL1 |= UCSSEL1;

    /*配置波特率为9600@1MHz*/
    UCA0BR0 = 0x68;
    UCA0BR1 = 0x00;
    UCA0MCTL = 1 << 1;
    /*使能端口复用*/
    P1SEL |= BIT1 + BIT2;
    P1SEL2 |= BIT1 + BIT2;
    /*清除复位位,使能UART*/
    UCA0CTL1 &= ~UCSWRST;

后期我们可以封装,便于观看

void InitSystemClock(void)
{
    /*配置DCO为1MHz*/
    DCOCTL = CALDCO_1MHZ;
    BCSCTL1 = CALBC1_1MHZ;
    /*配置SMCLK的时钟源为DCO*/
    BCSCTL2 &= ~SELS;
    /*SMCLK的分频系数置为1*/
    BCSCTL2 &= ~(DIVS0 | DIVS1);
}

void InitUART(void)
{
    /*复位USCI_Ax*/
    UCA0CTL1 |= UCSWRST;

    /*选择USCI_Ax为UART模式*/
    UCA0CTL0 &= ~UCSYNC;

    /*配置UART时钟源为SMCLK*/
    UCA0CTL1 |= UCSSEL1;

    /*配置波特率为9600@1MHz*/
    UCA0BR0 = 0x68;
    UCA0BR1 = 0x00;
    UCA0MCTL = 1 << 1;
    /*使能端口复用*/
    P1SEL |= BIT1 + BIT2;
    P1SEL2 |= BIT1 + BIT2;
    /*清除复位位,使能UART*/
    UCA0CTL1 &= ~UCSWRST;

}

主函数里面直接

InitSystemClock();
InitUART();

我通过按键去发送数据,与此同时我判断发送的寄存器是否忙(比如我很快的按下2次,就会发现可能只发了一次)

在这里插入图片描述

在这里插入图片描述

6.IO中断

在这里插入图片描述

    /*打开P1.3口中断*/
    P1IE |= BIT3;
    /*设定为下降沿触发*/
    P1IES |= BIT3;
    /*清除中断标志位*/
    P1IFG &= ~BIT3;
    /*打开全局中断*/
    __bis_SR_register(GIE);

在最后加入

__interrupt void Port1_ISR(void)
{
	if(P1IFG & BIT3)//判断是否是P1.3产生中断
	{
		P1IFG &= ~BIT3;//清除标志位
		P1OUT ^= BIT6;
	}
}

7.串口接收

新建函数

void Execute(uint8_t *combuff)
{
	const uint8_t charbuff[5][10] = {"王龙?","米靳隆?","班长?","LED1 On!","LED Off!"};//保存预置命令
	if(combuff[0] == charbuff[0][0] && combuff[1] == charbuff[0][1])//王龙?
	{
		UARTSendString("萌萌哒!!(⊙o⊙)",16);//
	}
	else if(combuff[0] == charbuff[1][0] && combuff[1] == charbuff[1][1])//米靳隆?
	{
		UARTSendString("我想吃烹鱼宴( ▼-▼ )",21);
	}
	else if(combuff[0] == charbuff[2][0] && combuff[1] == charbuff[2][1])//班长?
	{
		UARTSendString("团支书!!╮(╯-╰)╭",20);
	}
	else if(combuff[0] == charbuff[3][0] && combuff[6] == charbuff[3][6])//LED1 On!
	{
		UARTSendString("Yes!My Lord!(^^ゞ",17);
		P1OUT |= BIT0;
	}
	else if(combuff[0] == charbuff[4][0] && combuff[6] == charbuff[4][6])//LED1 Off!
	{
		UARTSendString("Yes!My Highness!(^^ゞ",21);
		P1OUT &= ~BIT0;
	}
	else
	{
		UARTSendString("What Are You Fucking Talking!(╬▔皿▔)凸",41);
	}
}

主函数

P1DIR |= BIT0;
P1OUT &= ~BIT0;
__bis_SR_register(GIE);//打开全局中断
while(1)
{
if(iscomend)
{
iscomend = 0;//清除标志位,防止重复执行
Execute(combuff);//执行命令
}
}
return 0;
__interrupt void UART_Receive_ISR(void)
{
	static uint8_t cnt = 0;
	if(IFG2 & UCA0RXIFG)//检测是否是USCI_A0的接收中断,USCI_A0和USIC_B0的接收中断共享同一向量
	{
		IFG2 &= ~UCA0RXIFG;//清除标志位
		combuff[cnt++] = UCA0RXBUF;//保存命令
		cnt %= 20;//防止cnt大于20,导致缓冲区溢出
		if(combuff[cnt - 1] == '\n')//如果检测到命令结束符(以换行作为命令结束)
		{
			cnt = 0;//复位计数器
			iscomend = 1;//命令接收完毕
		}
	}
}
  • 11
    点赞
  • 110
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jun_军

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值