📄 uart4800.c
字号:
// MSP-FET430P410 Demo - Timer_A, UART 4800 Echo, DCO SMCLK
// ACLK = LFXT1 = 32768Hz, MCLK = SMCLK = default DCO = 32 x ACLK = 1048576Hz
//
// MSP430F413
// -----------------
// /|\| XIN|-
// | | | 32.768kHz
// --|RST XOUT|-
// | |
// | P1.0/CCI0A/TX|--------->
// | | 4800 8N1
// | P1.1/CCI0B/RX|<---------
//
/*功能描述:计算 bcc 并存入 RXTXBUF[num]中 */
void checkbcc(unsigned char num)
{
unsigned char i,bcc=0;
bcc = 0;
for(i=0;i<num;i++) bcc += RXTXBUF[i];
RXTXBUF[num] = bcc&0x7f;
}
/************************************************************/
/*功能描述:发送N 个字节数据 */
/*函数说明: */
/*调用函数:delay(uint) TX_BYTE() */
/*全局变量: RXTXDATA RXTXBUF[0~14] */
/*输入: i 表示发送的数据长度 */
/************************************************************/
void TX_NBYTE(unsigned char i)
{
unsigned char j;
delay_ms(38);//延时38ms
P1DIR |= TXD;
RXTXDATA=0;
for(j=0;j<i;j++)
{
RXTXDATA=RXTXBUF[j];
TX_BYTE();
_NOP();
}
P1DIR &=~TXD;
CCTL0 =0;
}
/************************************************************/
/*功能描述:写time[0~2](ss:mm:hh) */
/*函数说明: */
/*调用函数:checkbcc() TX_NBYTE(uchar) */
/*全局变量: RXTXNUF[0~5] addr */
/*输入: RXTXBUF[7~9] */
/************************************************************/
void write_time_res(unsigned char *p)
{
unsigned char i;
for(i=0;i<3;i++)
{
if(*p>0x59|(*p&0x0f)>9){return;}
*p++;
}
p--;
if(i==3&*p<0x24)
{
time[2]=*p--;
time[1]=*p--;
time[0]=*p;
RXTXBUF[0]=0XE9;
RXTXBUF[1]=0X2C;
RXTXBUF[2]=0X04;
RXTXBUF[3]=addr;
RXTXBUF[5]=0XF0;
checkbcc(4);
TX_NBYTE(6);
}
}
/************************************************************/
/*功能描述:写地址 */
/*函数说明: 要求写入的地址在2~6之间 */
/*调用函数:checkbcc() TX_NBYTE(uchar)
WRNBYTE_I2C(uchar,uchar*,uchar) 程序在i2c.c 中 */
/*全局变量: RXTXBUF[0~5] addr */
/*输入: RXTXBUF[7] */
/************************************************************/
void write_address_res(unsigned char *p)//写地址
{
if(*p>1&*p<7)
{
addr=*p;
WRNBYTE_I2C(PEG1,a_addr,&addr,1);
RXTXBUF[0]=0XE9;
RXTXBUF[1]=0X28;
RXTXBUF[2]=0X04;
RXTXBUF[3]=addr;
RXTXBUF[5]=0XF0;
checkbcc(4);
TX_NBYTE(6);
}
}
/************************************************************/
/*功能描述:写wt_who[0~6] */
/*函数说明: 低位在前,高位在后 */
/*调用函数:checkbcc() TX_NBYTE(uchar) LCD_OUT(uchar*) main.c中
WRNBYTE_I2C(uchar,uchar*,uchar) 程序在i2c.c 中 */
/*全局变量: wt_who[0~6] RXTXBUF[0~5] addr */
/*输入: RXTXBUF[7,8,9] 低位在前,高位在后 */
/************************************************************/
void write_data_res(unsigned char *p)//写数据
{
unsigned char i;
for(i=3;i<7;i++)
{
wt_who[i]=*p++;
}
for(i=0;i<3;i++)
{
wt_who[i]=0;
}
RDNBYTE_I2C(PEG1,addr_who,wt_who+4,4);//读整数+小数地址
RDNBYTE_I2C(VAL_PEG,wt_who[7],wt_who,4);//读小数
if(lcd_show==0x55)
{
LCD_OUT(wt_who);
}
RXTXBUF[0]=0XE9;
RXTXBUF[1]=0X22;
RXTXBUF[2]=0X04;
RXTXBUF[3]=addr;
RXTXBUF[5]=0XF0;
checkbcc(4);
TX_NBYTE(6);
}
/************************************************************/
/*功能描述:写constant[0~2] */
/*函数说明: 低位在前,高位在后 */
/*调用函数:checkbcc() TX_NBYTE(uchar)
WRNBYTE_I2C(uchar,uchar*,uchar) 程序在i2c.c 中 */
/*全局变量: constant[0~2] RXTXBUF[0~5] addr */
/*输入:RXTXBUF[7~9]=constant[0~2] RXTXBUF[10~12]=yymmdd[0~2]*/
/************************************************************/
void write_constant_res(unsigned char *p)
{
unsigned char i;
unsigned char yymmdd[3];
for(i=0;i<3;i++)constant[i]=*p++;
for(i=0;i<3;i++)yymmdd[i]=*p++;
WRNBYTE_I2C(PEG1,constant_addr,constant,3);
WRNBYTE_I2C(PEG1,yymmdd_addr,yymmdd,3);
RXTXBUF[0]=0XE9;
RXTXBUF[1]=0X29;
RXTXBUF[2]=0X04;
RXTXBUF[3]=addr;
RXTXBUF[5]=0XF0;
checkbcc(4);
TX_NBYTE(6);
}
/************************************************************/
/*功能描述:写show_mode */
/*函数说明: 0,1有效,其它数据无效 */
/*调用函数:checkbcc() TX_NBYTE(uchar) LCD_OUT(uchar*) main.c中
WRNBYTE_I2C(uchar,uchar*,uchar) 程序在i2c.c 中 */
/*全局变量: show_mode RXTXBUF[0~5] wt_who[0~6] addr */
/*输入: RXTXBUF[7] */
/************************************************************/
void write_show_mode_res(unsigned char *p)
{
if(*p<2)
{
show_mode=*p;
WRNBYTE_I2C(PEG1,show_mode_addr,&show_mode,1);
RXTXBUF[0]=0XE9;
RXTXBUF[1]=0X2A;
RXTXBUF[2]=0X04;
RXTXBUF[3]=addr;
RXTXBUF[5]=0XF0;
checkbcc(4);
TX_NBYTE(6);
LCD_OUT(wt_who);
}
}
/************************************************************/
/*功能描述:写password[0~2] */
/*函数说明: 低位在前,高位在后 */
/*调用函数:checkbcc() TX_NBYTE(uchar)
WRNBYTE_I2C(uchar,uchar*,uchar) 程序在i2c.c 中 */
/*全局变量: password[0~2] addr 表地址 */
/*输入: RXTXBUF[7,8,9] 低位在前,高位在后 */
/************************************************************/
void write_password_res(unsigned char *p)
{
unsigned char i;
for(i=0;i<3;i++)password[i]=*p++;
WRNBYTE_I2C(PEG1,password_addr,password,3);
RXTXBUF[0]=0XE9;
RXTXBUF[1]=0X21;
RXTXBUF[2]=0X04;
RXTXBUF[3]=addr;
RXTXBUF[5]=0XF0;
checkbcc(4);
TX_NBYTE(6);
}
/************************************************************/
/*功能描述:写lcd_show */
/*函数说明:0x55 开显示 0xaa 关显示 */
/*调用函数:checkbcc() TX_NBYTE(uchar)
WRNBYTE_I2C(uchar,uchar*,uchar) 程序在i2c.c 中 */
/*全局变量: lcd_show addr */
/*输入: RXTXBUF[7] */
/************************************************************/
void write_lcd_show_res(unsigned char *p)
{
if(*p==0x55|*p==0xaa)
{
lcd_show=*p;
WRNBYTE_I2C(PEG1,lcd_show_addr,&lcd_show,1);
if(lcd_show==0x55)
{
/*液晶初始化*/
LCDCTL=LCDON+LCD4MUX+LCDP1;
BTCTL = BTFRFQ1;
P5SEL|=0XFC;
}
else
{
LCDCTL=0;
BTCTL=0;
P5SEL=0;
}
RXTXBUF[0]=0XE9;
RXTXBUF[1]=0X2F;
RXTXBUF[2]=0X04;
RXTXBUF[3]=addr;
RXTXBUF[5]=0XF0;
checkbcc(4);
TX_NBYTE(6);
}
}
/*************************************************************/
/*功能描述:写uart_mode */
/*函数说明:main中 uart_mode=0x55 水量每增加10L,发送一次数据*/
/*调用函数: checkbcc() TX_NBYTE(uchar)
WRNBYTE_I2C(uchar,uchar*,uchar) 程序在i2c.c 中 */
/*全局变量: uart_mode 0x55 or 0有效 其它数据无效 addr */
/*输入: RXTXBUF[7] */
/*************************************************************/
void write_uart_mode_res(unsigned char *p)
{
if(*p==0x55|*p==0)
{
uart_mode=*p;
WRNBYTE_I2C(PEG1,uart_mode_addr,&uart_mode,1);
RXTXBUF[0]=0XE9;
RXTXBUF[1]=0X26;
RXTXBUF[2]=0X05;
RXTXBUF[3]=addr;
RXTXBUF[5]=0XF0;
checkbcc(4);
TX_NBYTE(6);
}
}
/*************************************************************/
/*功能描述:向TCB发送time */
/*函数说明: time[0~2] ss:mm:hh */
/*调用函数: checkbcc() TX_NBYTE(uchar) */
/*全局变量: RXTXBUF[0~8] time[0~2] addr表地址 */
/*输入: */
/*************************************************************/
void read_time_res(void)
{
RXTXBUF[0]=0XE9;
RXTXBUF[1]=0X3C;
RXTXBUF[2]=0X07;
RXTXBUF[3]=addr;
RXTXBUF[4]=time[0];
RXTXBUF[5]=time[1];
RXTXBUF[6]=time[2];
checkbcc(7);
RXTXBUF[8]=0XF0;
TX_NBYTE(9);
}
/*************************************************************/
/*功能描述:向TCB发送addr */
/*函数说明: */
/*调用函数: checkbcc() TX_NBYTE(uchar) */
/*全局变量: RXTXBUF[0~5] addr表地址 */
/*输入: */
/*************************************************************/
void read_address_res(void)
{
RXTXBUF[0]=0XE9;
RXTXBUF[1]=0X38;
RXTXBUF[2]=0X04;
RXTXBUF[3]=addr;
RXTXBUF[5]=0XF0;
checkbcc(4);
TX_NBYTE(6);
}
/*************************************************************/
/*功能描述:向TCB发送data */
/*函数说明:data=12345.67m3 addr=5 0x12 0x34 0x56
addr!=5 0x23,0x45,0x67 发送时低位在前,高位在后 */
/*调用函数: checkbcc() TX_NBYTE(uchar) */
/*全局变量: RXTXBUF[0~10] addr表地址 wt_who */
/*输入: */
/*************************************************************/
void read_data_res(void)
{
RXTXBUF[0]=0XC0;
RXTXBUF[1]=0X22;
RXTXBUF[2]=0X69;
RXTXBUF[3]=0X6E;
RXTXBUF[4]=0x73;
RXTXBUF[5]=addr;
if(addr==0x05)
{
RXTXBUF[8]=wt_who[3];
RXTXBUF[7]=wt_who[4];
RXTXBUF[6]=wt_who[5];
}
else
{
RXTXBUF[8]=(wt_who[3]>>4)+(wt_who[4]<<4);
RXTXBUF[7]=(wt_who[4]>>4)+(wt_who[5]<<4);
RXTXBUF[6]=(wt_who[5]>>4)+(wt_who[6]<<4);
}
RXTXBUF[10]=0xD0;
checkbcc(9);
TX_NBYTE(11);
}
/*******************************************************************/
/*功能描述:向TCB发送constant以及写constant 的时间 */
/*函数说明:低位在前,高位在后 */
/*调用函数: checkbcc() TX_NBYTE(uchar) RDNBYTE_I2C(addr,uchar*,sum)*/
/*全局变量: RXTXBUF[0~10] addr表地址 constant[0~2] */
/*输入: */
/*******************************************************************/
void read_constant_res(void)
{
unsigned char yymmdd[3];
RDNBYTE_I2C(PEG1,yymmdd_addr,yymmdd,3);
RXTXBUF[0]=0XE9;
RXTXBUF[1]=0X39;
RXTXBUF[2]=0X0A;
RXTXBUF[3]=addr;
RXTXBUF[4]=constant[0];
RXTXBUF[5]=constant[1];
RXTXBUF[6]=constant[2];
RXTXBUF[7]=yymmdd[0];
RXTXBUF[8]=yymmdd[1];
RXTXBUF[9]=yymmdd[2];
RXTXBUF[11]=0XF0;
checkbcc(10);
TX_NBYTE(12);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -