📄 main.c
字号:
#include "msp430x13x.h"
// #include "f123flash.h"
#define FLASH_ADDRESS 0x01000
#define uchar unsigned char
uchar txbuf,i=0,flag=0;
uchar sum=0,led=0;
uchar databuf[3],buffer[20];
char *pcflash;
int *pflash;
void init_uart();
void delay(unsigned int);
void communicate();
void protocol();
void main(void)
{
pflash=(int *)FLASH_ADDRESS;
pcflash=(char *)FLASH_ADDRESS;
_DINT();
//WDTCTL=WDTPW+WDTHOLD;
IE1&=~OFIE; //禁止振荡器失效中断
BCSCTL1|=XTS; //选择LFTX1振荡器
BCSCTL2|=SELM1+SELM0; //用LFTX1CLK作为MCLK的时钟源
do{
IFG1&=~OFIFG;
delay(255); //等待晶振转换完成
}
while((IFG1&OFIFG)!=0);
IFG1&=~OFIFG;
WDTCTL=WDT_MRST_32;
init_uart();
TACTL=TASSEL1+TACLR+ID_3; // TA定时
CCTL0=CCIE;
CCR0=60000;
TACTL|=MC0;
//TACTL&=~MC0;
_EINT();
while(1)
{WDTCTL=WDT_MRST_32;
if(flag==1)
//communicate();
{
flag=0;
protocol();
//P2OUT^=BIT0;
//Flash_clr(pflash);
//Flash_wb(pcflash,buffer[1]);Flash_wb(pcflash+1,buffer[2]);
}
else
{
// _NOP();
P2OUT=led;}
}
}
void init_uart()
{
UCTL0&=~SWRST; //SWRST复位,USART允许
UCTL0|=CHAR; //8 位数据位,1位停止位,无校验
UBR00=0XC0;
UBR10=0X00; //使用 波特率为19200 BPS
UMCTL0=0X00; //位调整
UTCTL0|=SSEL0;
ME1|=UTXE0+URXE0; //发送及接收模块允许
P3SEL=0X30;
P3DIR=0X10;
IE1|=URXIE0; //接收中断允许
P1DIR=0X00;
P2DIR=0X01;
P2OUT&=~BIT0;
//P3OUT=0XFF;
}
void delay(unsigned int v) //延时程序
{while(v!=0){v--;WDTCTL=WDT_MRST_32;}
}
#pragma vector=UART0RX_VECTOR
__interrupt void uart0rx(void)
{
LPM3_EXIT;
if(flag==0)
{
buffer[i]=RXBUF0;
//i++;
while((IFG1&UTXIFG0)==0);
TXBUF0=RXBUF0;
if(buffer[0]==0x7e)
{
i++;}
else i=0;
if(i==5)
{
sum=buffer[1]+buffer[2];
while((IFG1&UTXIFG0)==0);
TXBUF0=sum;
if(buffer[4]==0x7e&&sum==buffer[3]){flag=1;i=0;}
else
{flag=0;i=0;sum=0;}
}
else {flag=0;}
}
}
void communicate()
{
uchar j,bytes;
_DINT();
P3DIR=0XDF;
P1DIR=BIT4;
P3OUT&=~BIT2; // intterupt
delay(10);
P3OUT|=BIT2;
for(bytes=0;bytes<3;bytes++)
{txbuf=buffer[bytes+1];
for(j=0;j<8;j++)
{//P1OUT&=~BIT4; //clk=0
delay(10);
//P3OUT&=~BIT6;
if(txbuf&0x80)
{
P3OUT|=BIT6; //dat=1
}
else{ P3OUT&=~BIT6;} //dat=0
P1OUT&=~BIT4; //clk=0
delay(10);
P1OUT|=BIT4; //clk=1
txbuf=txbuf<<1;
}
}
flag=0;
//P3OUT|=BIT6;
P3DIR=0X10;
P1DIR=0X00;
_EINT();
}
void protocol()
{uchar j;
if(buffer[1]==0&&buffer[2]==0)
{P2OUT&=~BIT0;
_BIS_SR(LPM3_bits);}
else if(buffer[1]==0x80)
{
for(j=0;j<2;j++)
{txbuf=*(pcflash+j);
while((IFG1&UTXIFG0)==0);
TXBUF0=txbuf;
}
}
else if(buffer[1]==0x88){;}
// {Flash_clr(pflash);
// Flash_wb(pcflash,buffer[1]);Flash_wb(pcflash+1,buffer[2]);}
else{P2OUT^=BIT0;}
}
#pragma vector=TIMERA0_VECTOR //定时器中断
__interrupt void Timer_A(void)
{
//P6OUT^=BIT1;
led^=BIT0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -