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;//命令接收完毕
}
}
}