📄 mmi.c
字号:
// *********************************************************************
// 项目名称: 电力五防
// 软件功能: 电脑钥匙程序
// 版本号: V1.00
// 编制时间: 2007.10.15
// *********************************************************************
#pragma language=extended
#include <msp430x14x.h>
#include <stdio.h>
#define DEVICE_TYPE 46 //11-线路 21-电容器 45-低后备 46-高后备 35-差动 61-主变自动化装置
#define MY_VERSION 120 //程序版本V1.20
#include "mmi.h"
void delay(INT16U i);
void key_in();
void key_handle(INT8U key);
void lcd_display_handle(INT8U page);
void delay(INT16U i)
{
if(i==0) return;
while(i) i--;
}
INT8U bittst(INT8U *p,INT16U n)
{
INT16U i;
INT16U j;
INT16U v;
i=n / 8;
j=n % 8;
v= (*(p+i)) & bit1_tab[j];
if (v!=0) v= 0xff;
return v;
}
void bitset(INT16U *p,INT16U n)
{
INT16U i,j;
i=n / 16;
j=n % 16;
*(p+i)=*(p+i) | bit1_tab[j];
}
INT16U sum_check(INT8U *check_data,INT8U len)
{
INT16U i,v;
v=0;
for(i=0;i<len;i++)
v+=*(check_data+i);
return v;
}
void start_high_osc()
{
INT16U i;
BCSCTL1 &= ~XT2OFF; //START HIGH FREQ
BCSCTL2=SELS+SELM1; // ACLK MCLK SMCLK=XT2CLK 8M
do
{
IFG1 &= ~OFIFG;
for(i=0xff;i>0;i--);
}
while((IFG1 & OFIFG)!=0);
}
void port_init()
{
P1SEL = 0; //P1 = I/O
P1DIR = 0xFF ; //P1 = OUTPUT
P1OUT = 0xFF;
P2SEL = 0;
P2DIR = 0x00; //P2 = INTPUT
P3SEL = 0;
P3DIR = 0xFF; //P3 = OUTPUT
P3OUT = 0xFF;
P4SEL = 0;
P4DIR = 0xFF; //P4 = OUTPUT
P4OUT = 0xFF;
P5SEL = 0;
P5DIR = 0x1F; //P5.7~5 = INTPUT P5.4~0= OUTPUT
P5OUT = 0xFF;
P6SEL = 0;
P6DIR = 0xC0; //P6.7~6=OUTPUT P6.5~0=INTPUT
P6OUT = 0xFF;
}
void dec_to_4bit(INT8U *p,INT16U ww)
{
//功能:将一个4位的十进制数按位展开
//入口参数:WW
//出口参数:*p
INT16U n0,n1,n2;
n0=ww/1000;
p[0]=n0 % 10; //千位
n1=ww % 1000;
p[1]=n1/100; //百位
n2=n1%100;
p[2]=n2/10; //十位
p[3]=n2 % 10; //个位
}
INT16U bit4_to_dec(INT8U *p)
{
//功能:将4个单位数合成一个十进制四位数
//入口参数:*p
//出口参数:vv
INT16U vv;
vv=p[0]*1000+p[1]*100+p[2]*10+p[3];
return vv;
}
void hex_to_4bit(INT8U *p,INT16U ww)
{
//功能:将一个4位的16进制数按位展开
//入口参数:WW
//出口参数:*p
p[0]=ww >>12;
p[1]=(ww & 0xfff) >>8;
p[2]=(ww & 0xff)>>4;
p[3]=ww & 0xf;
}
INT16U bit4_to_hex(INT8U *p)
{
//功能:将4个单位数合成一个16进制四位数
//入口参数:*p
//出口参数:vv
INT16U vv;
vv=(p[0]<<12)+(p[1]<<8)+(p[2]<<4)+p[3];
return vv;
}
void dec_to_3bit(INT8U *p,INT16U ww)
{
//功能:将一个3位的十进制数按位展开
//入口参数:WW
//出口参数:*p
INT16U n0,n1;
n0=ww/100;
p[0]=n0 % 10; //百位
n1=ww % 100;
p[1]=n1/10; //十位
p[2]=n1%10; //个位
}
INT16U bit3_to_dec(INT8U *p)
{
//功能:将3个单位数合成一个3位数
//入口参数:*p
//出口参数:vv
INT16U vv;
vv=p[0]*100+p[1]*10+p[2];
return vv;
}
void dec_to_2bit(INT8U *p,INT16U ww)
{
//功能:将一个2位的十进制数按位展开
//入口参数:WW
//出口参数:*p
p[0]=ww/10; //十位
p[1]=ww%10; //个位
}
INT16U bit2_to_dec(INT8U *p)
{
//功能:将2个单位数合成一个2位数
//入口参数:*p
//出口参数:vv
INT16U vv;
vv=p[0]*10+p[1];
return vv;
}
void write_430_mem(INT16U addr,INT16U len,INT8U *p)
{
INT8U i;
INT8U *pf;
INT8U *pt;
__disable_interrupt(); // Disable interrupts
WDTCTL=WDTPW+WDTHOLD; //DISABLE WD
FCTL2=FWKEY+FSSEL0+FN0; //define flash input clock=ACLK NO DIVDE
if (addr<128 )
pf=(INT8U *)0x1000 ; //write SEGB
else
{
addr-=128;
pf=(INT8U *)0x1080 ; //write SEGA
}
if (addr+len>128) return;
pt=pf;
for(i=0;i<128;i++) //备份原FLASH内容
rd_buf[i]=*pt++;
for(i=addr;i<addr+len;i++)
rd_buf[i]=*p++;
FCTL1=FWKEY+ERASE; //ENABLE ERASE
FCTL3=FWKEY; //FLASH UNLOCK
*pf=0; //NULL WRITE TO START ERASE
FCTL1=FWKEY+WRT; //ENABLE WRITE
for(i=0;i<128;i++)
*pf++=rd_buf[i];
FCTL1=FWKEY;
FCTL3=FWKEY+LOCK; //FLASH UNLOCK
__enable_interrupt(); // Enable interrupts
}
void read_430_mem(INT16U addr,INT16U len,INT8U *p)
{
INT8U i, *ps;
ps=(INT8U *)(0x1000+addr); //read SEGA
for(i=0;i<len;i++) p[i]=*ps++;
}
void com_init()
{
INT16U i;
for(i=0;i<COM_LEN;i++)
{
com_tx_buf[i]=0;
com_rx_buf[i]=0;
}
com_rx_count=0;
com_tx_count=0;
com_tx_point=0;
com_rx_flag=0;
com_rx_time=0;
com_tx_time=0;
com_no_rx_time=0;
U0CTL&=~SWRST ;
U0CTL = CHAR; // 8-bit character
U0TCTL=SSEL1 ; //UCLK = SMCLK
//U0BR0 = 0x41; // 8M/9600 =833.33
//U0BR1 = 0x03; //
U0BR0 = 0x05; // 8M/2400 =3333.33
U0BR1 = 0x0d; //
U0MCTL = 0x55; // modulation 00100101
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
}
void com_handle()
{
INT8U cc;
if ((IFG1&URXIFG0)==URXIFG0)
{
cc=U0RXBUF;
com_rx_buf[com_rx_count++]=cc;
com_rx_time=50;
}
if (com_tx_count>0 && ((IFG1 & UTXIFG0) == UTXIFG0))
{
U0TXBUF=com_tx_buf[com_tx_point++];
com_tx_count--;
}
}
void set_to_dis(INT8U *p)
{
#if DEVICE_TYPE==11
set_data[0]=p[8]+(p[9]<<8); //速断电流 PAGE0
set_data[1]=p[10]+(p[11]<<8); //速断时限
if (bittst(&p[2],1)) set_data[2]=1 ; //速断功能投退 PAGE1
else set_data[2]=0;
if (bittst(&p[2],2)) set_data[3]=1 ; //速断方向功能投退
else set_data[3]=0;
set_data[4]=p[12]+(p[13]<<8); //过流电流 PAGE2
set_data[5]=p[14]+(p[15]<<8); //过流时间
if (bittst(&p[2],3)) set_data[6]=1 ; //过流功能投退 PAGE3
else set_data[6]=0;
if (bittst(&p[2],4)) set_data[7]=1 ; //过流方向投退
else set_data[7]=0;
if (bittst(&p[2],0))set_data[8]=1 ; //低压闭锁速断投退 PAGE4
else set_data[8]=0;
set_data[9]=p[24]+(p[25]<<8 ); //低压闭锁速断电压
if (bittst(&p[4],4)) set_data[10]=1; //低压闭锁过流 PAGE5
else set_data[10]=0;
set_data[11]=p[50]+(p[51]<<8 ); //低压闭锁过流电压
set_data[12]=0x55; //过负荷 PAGE6
set_data[13]=p[16]+(p[17]<<8 ); //过负荷电流
set_data[14]=0x55; //过负荷 PAGE7
set_data[15]=p[18]+(p[19]<<8 ); //过负荷时间
if (bittst(&p[2],5)) //过负荷功能投退 PAGE8
{
if (bittst(&p[3],2)) set_data[16]=2 ;
else set_data[16]=1 ;
}
else set_data[16]=0;
if (bittst(&p[2],6)) set_data[17]=1 ; //过负荷方向投退
else set_data[17]=0;
set_data[18]=p[20]+(p[21]<<8 ); //零序电流 PAGE9
set_data[19]=p[22]+(p[23]<<8 ); //零序时间
set_data[20]=p[46]+(p[47]<<8 ); // 选线电压 PAGE10
set_data[21]=p[48]+(p[49]<<8 ); //选线时间
if (bittst(&p[2],7)) //零序投退 PAGE11
{
if (bittst(&p[3],1)) set_data[22]=2 ;
else set_data[22]=1 ;
}
else set_data[22]=0;
if (bittst(&p[3],0)) //选线投退
{
if (bittst(&p[4],5)) set_data[23]=2 ;
else set_data[23]=1;
}
else set_data[23]=0;
set_data[24]=0x55; //低频减载 PAGE12
set_data[25]=p[26]+(p[27]<<8 ); //低频减载频率
set_data[26]=0x55; //低频减载 PAGE13
set_data[27]=p[28]+(p[29]<<8 ); //低频减载时间
if (bittst(&p[4],0)) set_data[28]=1; //低频减载 PAGE14
else set_data[28]=0;
if (bittst(&p[4],1)) set_data[29]=1; //滑差闭锁
else set_data[29]=0;
set_data[30]=p[30]+(p[31]<<8 ); // 滑差频率 PAGE15
set_data[31]=p[32]+(p[33]<<8 ); //滑差时间
if (bittst(&p[4],2)) set_data[32]=1; //低压闭锁低频投退 PAGE16
else set_data[32]=0;
set_data[33]=p[34]+(p[35]<<8 ); //低压闭锁低频电压
if (bittst(&p[4],3)) set_data[34]=1; //低流闭锁低频 PAGE17
else set_data[34]=0;
set_data[35]=p[36]+(p[37]<<8 ); //低流闭锁低频电流
if (bittst(&p[3],3)) set_data[36]=1; //重合闸投退 PAGE18
else set_data[36]=0;
set_data[37]=p[38]+(p[39]<<8 ); //重合闸时间
set_data[38]=0x55; //后加速 PAGE19
set_data[39]=p[44]+(p[45]<<8 ); //后加速时间
if (bittst(&p[3],6)) set_data[40]=1; //后加速 PAGE20
else set_data[40]=0;
if (bittst(&p[5],0)) set_data[41]=1; // 手合后加速
else set_data[41]=0;
if (bittst(&p[3],5)) set_data[42]=1; //重合闸检无压 PAGE21
else set_data[42]=0;
set_data[43]=p[40]+(p[41]<<8 ); //电压
if (bittst(&p[3],4)) set_data[44]=1; //重合闸检同期 PAGE22
else set_data[44]=0;
set_data[45]=p[42]+(p[43]<<8 ); //角度
if (bittst(&p[4],6)) set_data[46]=1; //PT断线 PAGE23
else set_data[46]=0;
if (bittst(&p[4],7)) set_data[47]=1; //PT断线闭锁方向
else set_data[47]=0;
set_data[48]=p[6]+(p[7]<<8 ); //突变量启动 PAGE24
set_data[49]=p[0]+(p[1]<<8 ); //主机地址
set_data[50]=p[52]+(p[53]<<8 ); //有功脉冲 PAGE25
set_data[51]=p[54]+(p[55]<<8 ); //无功脉冲
set_data[52]=ct_val; //电流变比 PAGE26
set_data[53]=pt_val; //电压变比
if (bittst(&p[3],7)) set_data[54]=1; //五防功能投退 PAGE27
else set_data[54]=0 ;
#endif
#if DEVICE_TYPE==21
set_data[0]=p[8]+(p[9]<<8); //速断电流 PAGE0
set_data[1]=p[10]+(p[11]<<8); //速断时限
set_data[2]=p[12]+(p[13]<<8); //过流电流 PAGE1
set_data[3]=p[14]+(p[15]<<8); //过流时限
if (bittst(&p[2],0)) set_data[4]=1; //速断功能 PAGE2
else set_data[4]=0;
if (bittst(&p[2],1)) set_data[5]=1; //过流功能
else set_data[5]=0;
set_data[6]=p[16]+(p[17]<<8); //零序电流 PAGE3
set_data[7]=p[18]+(p[19]<<8); //零序时限
set_data[8]=p[20]+(p[21]<<8); //零序电压 PAGE4
set_data[9]=p[22]+(p[23]<<8); //零序时限
if (bittst(&p[2],2)) set_data[10]=1; //零序电流功能 PAGE5
else set_data[10]=0;
if (bittst(&p[2],5)) set_data[11]=1; //零序电压功能
else set_data[11]=0;
set_data[12]=p[24]+(p[25]<<8); //过电压电压 PAGE6
set_data[13]=p[26]+(p[27]<<8); //过电压时限
set_data[14]=p[28]+(p[29]<<8); //欠电压电压 PAGE7
set_data[15]=p[30]+(p[31]<<8); //欠电压时限
if (bittst(&p[2],3)) set_data[16]=1; //过电压功能 PAGE8
else set_data[16]=0;
if (bittst(&p[2],4)) set_data[17]=1; //欠电压功能
else set_data[17]=0;
set_data[19]=p[32]+(p[33]<<8); //有流闭锁欠电压电流 PAGE9
if (bittst(&p[2],6)) set_data[21]=1; //有流闭锁欠电压功能 PAGE10
else set_data[21]=0;
if (bittst(&p[2],7)) set_data[23]=1; //PT断线功能 PAGE11
else set_data[23]=0;
set_data[24]=p[6]+(p[7]<<8); //突变量 PAGE12
set_data[25]=p[0]+(p[1]<<8); //主机地址
set_data[26]=p[36]+(p[37]<<8); //无功脉冲 PAGE13
if (bittst(&p[3],0)) set_data[27]=1 ; //五防功能投退
else set_data[27]=0 ;
set_data[28]=ct_val; //电流变比 PAGE14
set_data[29]=pt_val; //电压变比
#endif
#if DEVICE_TYPE==45 || DEVICE_TYPE==46 //低后备 高后备
set_data[1]=p[8]+(p[9]<<8); //低电压 PAGE0
set_data[3]=p[10]+(p[11]<<8); //负序电压 PAGE1
if (bittst(&p[2],4)) set_data[5]=1; //闭锁一段投退PAGE2
else set_data[5]=0;
if (bittst(&p[3],0)) set_data[7]=1; //闭锁二段投退 PAGE3
else set_data[7]=0;
if (bittst(&p[2],3)) set_data[8]=1; //过流一段投退 PAGE4
else set_data[8]=0;
set_data[9]=p[12]+(p[13]<<8); //过流一段电流
set_data[11]=p[14]+(p[15]<<8); //过流一段一时限 PAGE5
set_data[13]=p[16]+(p[17]<<8); //过流一段二时限 PAGE6
set_data[15]=p[18]+(p[19]<<8); //过流一段三时限 PAGE7
if (bittst(&p[2],7)) set_data[16]=1; //过流二段投退 PAGE8
else set_data[16]=0;
set_data[17]=p[20]+(p[21]<<8); //过流二段电流
set_data[19]=p[22]+(p[23]<<8); //过流二段一时限 PAGE9
set_data[21]=p[24]+(p[25]<<8); //过流二段二时限 PAGE10
set_data[23]=p[26]+(p[27]<<8); //过流二段三时限 PAGE11
if (bittst(&p[3],2)) set_data[24]=1; //过流三段投退 PAGE12
else set_data[24]=0;
set_data[25]=p[28]+(p[29]<<8); //过流三段电流
set_data[27]=p[30]+(p[31]<<8); //过流三段时限PAGE13
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -