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;//命令接收完畢
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/149162.html
標籤:python
