#pragma language=extended
#include <stdio.h>
#include <io430x14x.h>
#include <intrinsics.h>
#include <math.h>
#include <string.h>
#include "yc.h"
#include "yc1.h"
/*FLASH操作函数*/
void flash_init(void)
{
FCTL2=FWKEY+FSSEL1+FN0; //时钟源:SMCLK,不分频
}
void flash_clear(INT16S *p)
{
while((FCTL3&BUSY)==BUSY);
FCTL1=FWKEY+ERASE; //段擦除
FCTL3=FWKEY; //解锁
*p=0; //空写
}
void flash_clear_byte(INT8U *p)
{
while((FCTL3&BUSY)==BUSY);
FCTL1=FWKEY+ERASE; //段擦除
FCTL3=FWKEY; //解锁
*p=0; //空写
}
void flash_wt_word(INT16S *p,INT16S value)
{
while((FCTL3&BUSY)==BUSY);
FCTL3=FWKEY; //解锁
FCTL1=FWKEY+WRT; //编程
*p=value;
FCTL1=FWKEY; //不编程
FCTL3=FWKEY+LOCK; //闭锁
while((FCTL3&BUSY)==BUSY);
}
void flash_wt_byte(INT8U *p,INT8U value)
{
while((FCTL3&BUSY)==BUSY);
FCTL3=FWKEY; //解锁
FCTL1=FWKEY+WRT; //编程
*p=value;
FCTL1=FWKEY; //不编程
FCTL3=FWKEY+LOCK; //闭锁
while((FCTL3&BUSY)==BUSY);
}
/*FLASH操作函数*/
INT8U sum_check(INT8U *check_data,INT8U len)
{
INT16U v;
INT8U i,sum;
v=0;
for(i=0;i<len;i++)
v+=*(check_data+i);
sum=v&0xff;
sum=~sum+1;
sum=sum&0x7f;
sum=sum|0x40;
return sum;
}
void word_to_byte(INT16S *p1,INT8U *p2,INT8U len)
{
INT8U i;
INT16S v;
for(i=0;i<len;i++)
{
v=*(p1+i);
*p2++=v & 0xFF;
*p2++=(v>>8) & 0xFF;
}
}
void byte_to_byte(INT8U *p1,INT8U *p2,INT8U len)
{
INT8U i;
for(i=0;i<len;i++)
{*p2=*(p1+i);
*p2++;
}
}
void read_sys_factor(void)
{
INT8U i;
INT16S *p;
INT8U *p1;
p=(INT16S *)flash_addr_b;
for(i=0;i<16;i++)
{kch[i]=*p;
p++;
}
p1=(INT8U *)flash_addr_a;
for(i=0;i<90;i++)
{peizhi[i]=*p1;
*p1++;
}
for(i=0;i<12;i++)
phone[i]=peizhi[i];
p_full=((INT16U)peizhi[13]<<8)+peizhi[12];
p_alarm=((INT16U)peizhi[15]<<8)+peizhi[14];
for(i=0;i<12;i++)
server_certer[i]=peizhi[16+i];
for(i=0;i<16;i++)
dc_name[i]=peizhi[i+28];
for(i=0;i<8;i++)
sms_name[i]=peizhi[i+44];
for(i=0;i<2;i++)
sms_blank[i]=peizhi[i+52];
for(i=0;i<32;i++)
yx_name[i]=peizhi[i+54];
for(i=0;i<2;i++)
dc1_mandu[i]=peizhi[i+86];
for(i=0;i<2;i++)
dc2_mandu[i]=peizhi[i+88];
for(i=0;i<YX_BYTE_NUM;i++)
yx_polarity[i]=0xfe;
if(sms_blank[1]!=0)
sms_blank_flag=(sms_blank[0]-0x30)*10+(sms_blank[1]-0x30);
else
sms_blank_flag=sms_blank[0]-0x30;
if(((sms_blank[0]==0x00)&&(sms_blank[1]==0x00))||((sms_blank[0]==0xff)&&(sms_blank[1]==0xff))||((sms_blank[0]==0x30)&&(sms_blank[1]==0x30)))
sms_blank_flag=2;
sms_blank_flag_back=sms_blank_flag;
my_id=P5IN & 0xf;
}
void com_write_mem(INT16U addr,INT8U *p,INT8U len)
{
INT8U i,n;
INT16U temp;
INT16S *p1;
INT8U *p2;
if (len>com_msg_byte) len=com_msg_byte;
if (addr>=flash_addr_b&&addr<flash_addr_a) /*模拟量通道系数区*/
{
for(i=0;i<16;i++)
kch_bak[i]=kch[i];
n=(addr-flash_addr_b)>>1; //除2操作
len=len>>1;
for(i=0;i<len;i++)
{
temp=*(p+1);
kch_bak[n+i]=(temp<<8)+*p;
p=p+2;
}
p1=(INT16S *)flash_addr_b;
__disable_interrupt();
WDTCTL = WDTPW + WDTHOLD;
flash_clear(p1);
p1=(INT16S *)flash_addr_b;
for(i=0;i<16;i++)
{
flash_wt_word(p1,kch_bak[i]);
p1++;
}
__enable_interrupt();
p1=(INT16S *)flash_addr_b;
for (i=0;i<16;i++)
{
if (*p1!=kch_bak[i])
{
wt_mem_err=0;
i=16;
}
p1++;
}
if (wt_mem_err!=0)
{
wt_mem_err=0x55;
for (i=0;i<16;i++)
kch[i]=kch_bak[i];
}
}
if (addr>=flash_addr_a&&addr<flash_addr_ab) /*电话号码与站名区 12字节号码 4字节的压力设置12字节短信服务中心*/
{
for(i=0;i<90;i++)
peizhi_bak[i]=peizhi[i];
n=addr-flash_addr_a;
for(i=0;i<len;i++)
{
peizhi_bak[i+n]=*p++;
}
p2=(INT8U *)flash_addr_a;
__disable_interrupt();
WDTCTL = WDTPW + WDTHOLD;
flash_clear_byte(p2);
p2=(INT8U *)flash_addr_a;
for(i=0;i<90;i++)
{
flash_wt_byte(p2,peizhi_bak[i]);
*p2++;
P3OUT^=0x08; // P3.0=RUN(output),P3.3=WATCH_DOG(output)
}
__enable_interrupt();
p2=(INT8U *)flash_addr_a;
for (i=0;i<90;i++)
{
if (*p2!=peizhi_bak[i])
{
wt_mem_err=0;
i=90;
}
*p2++;
}
if (wt_mem_err!=0)
{
wt_mem_err=0x55;
for (i=0;i<12;i++)
phone[i]=peizhi_bak[i];
p_full=((INT16U)peizhi_bak[13]<<8)+peizhi_bak[12];
p_alarm=((INT16U)peizhi_bak[15]<<8)+peizhi_bak[14];
for(i=0;i<12;i++)
server_certer[i]=peizhi_bak[16+i];
for(i=0;i<16;i++)
dc_name[i]=peizhi_bak[i+28];
for(i=0;i<8;i++)
sms_name[i]=peizhi_bak[i+44];
for(i=0;i<2;i++)
sms_blank[i]=peizhi_bak[i+52];
for(i=0;i<32;i++)
yx_name[i]=peizhi_bak[i+54];
for(i=0;i<2;i++)
dc1_mandu[i]=peizhi_bak[i+86];
for(i=0;i<2;i++)
dc2_mandu[i]=peizhi_bak[i+88];
}
}
read_sys_factor();
}
void delay(INT16U cnt)
{INT16U k,i;
k=0;
for(i=0;i<cnt;i++)
k++;
}
INT16U PPPfcs16(INT8U *cp, INT16U len)
{
INT16U fcs;
fcs=0xffff;
while (len--)
fcs=(fcs>>8)^fcstab[(fcs^(*cp++))&0xff];
return (fcs);
}
INT8U bittst(INT8U *p,INT16U n)
{
INT16U v;
v= *p & bit1_tab[n];
if (v!=0) v= 0xff;
return v;
}
void com_init(INT8U port)
{
memset(&com0_tx_buf[0],0,16);
memset(&com0_rx_buf[0],0,16);
memset(&com1_tx_buf[0],0,256);
memset(&com1_rx_buf[0],0,128);
com_rx_count[port]=0;
com_tx_count[port]=0;
com_tx_point[port]=0;
com_rx_ok[port]=0;
com_rx_time[port]=0;
com_tx_time[port]=1000;
if (port==0) /*与变频器通讯 4800 n 8 1*/
{
U0CTL&=~SWRST;
U0CTL = CHAR+PENA; //8-bit character
U0TCTL=SSEL1; //UCLK = SMCLK
U0BR0 = 0x82; //8M/4800 =1666.66
U0BR1 = 0x06; //
U0MCTL = 0x55; //modulation 01010101
ME1|=URXE0 +UTXE0; //Enable USART0 TXD/RXD
//IE1|=URXIE0+UTXIE0; //Enable USART0 RX TX interrupt
P3SEL|=0x30; //P3.4,5=USART0 TXD/RXD
P3DIR|=0x10; //P3.4 OUTPUT
}
else if (port==1) /* 与tc35i通讯或和掌上电脑通讯 4800 n 8 1*/
{
U1CTL&=~SWRST;
U1CTL= CHAR; //8-bit character
U1TCTL=SSEL1; //UCLK = SMCLK
U1BR0 = 0x82; //8M/4800 =1666.66
U1BR1 = 0x06; //
U1MCTL = 0x55; //modulation 01010101
ME2|=URXE1 +UTXE1; //Enable USART1 TXD/RXD
//IE2|=URXIE1+UTXIE1; //Enable USART1 RX TX interrupt
P3SEL|=0xc0; //P3.6,7=USART1 TXD/RXD
P3DIR|=0x40; //P3.6 OUTPUT
}
}
void timerb_init(void)
{
time_per=8000;
TBCTL=TBSSEL1+TBCLR; //SMCLK, clear TBR,1分频
TBCCTL0=CCIE; //比较寄存器0中断
TBCCR0=time_per; //T=0.625ms
TBCTL|=MC0; //增计数模式
}
void adc12_init(void)
{
ADC12CTL0&=~ENC; //停止A/D转换
//单通道单次采样/转换,信号源ADC12SC,采样信号来自采样定时器
// ADC12CTL0