📄 main.c
字号:
/*
* copyright (c) 兰州瑞德高科技有限公司电专项目组
* all rights reserved.
* 文件名称: main.c
* 摘 要: ic卡热表主程序
* 当前版本: v1.0
* 作 者: 杨晓卫
* 完成日期: 2004.7.30
* 修改日期: 2004.8.2
*/
#include <msp430x41x.h>
#include "predef.h"
#include "flash.h"
#include "iccard.h"
#include "lcd.h"
#include "ads1242.h"
#define secMem 0x1000
#define totalFluxMem 0x1084
#define totalHeatMem 0x1088
#define workTimeMem 0x108c
#define heatMem 0x1090
uchar interruptFlag=0;
uchar timerFlag=0;
uchar openFlag=1,closeFlag=0; //阀门开关到位标志
uchar wrongFlag=0; //卡错标志
uchar setFlag=0; //表是否设置标志
uchar userFlag=0; //判断用户卡是不是第一次插入标志
uchar measureFlag = 0; //是否测温标志
uint cardLcd = 0; //用户卡中的热量值,便于显示存入热量
ulongint flashTemp = 0; //热量暂存,便于显示
float heatValue = 0; //热量值
ulongint totalFlux = 0; //累计流量
float instntFlux = 0; //瞬时流量
float totalHeat = 0; //累计热量
float instntHeat = 0; //瞬时热量
ulongint workTime = 0; //工作时间
ulongint counterTime = 0; //温度测量计时函数
uint instntFluxCounter = 0; //瞬时流量计数器
void SetCard(void);
void ChangeCard(void);
void UserCard(void);
void OpenValve(void);
void CloseValve(void);
uchar CompArray(uchar *src,uchar *des,uchar len);
void di(void)
{
P2OUT|=BIT5;
delay(20000);
P2OUT&=~BIT5;
}
void main()
{
uchar *sec;
uchar cardID;
WDTCTL = WDTPW+WDTHOLD;
WDTCTL = 0X05A1C;
P1IES |= BIT2; //IC卡中断设置降沿触发 常开
P1IE |= BIT2; //P1.2中断允许
P1IES |= BIT3; //脉冲输入计数中断
P1IE |= BIT3;
//P1IES |= BIT0; //拆表破坏中断
//P1IE |= BIT0;
P2DIR |= BIT5+BIT4+BIT3;
P2OUT &= ~BIT5; //蜂鸣器不响
P2OUT &= ~BIT4; //1242
P2IES |= BIT2; // 电池低电中断
P2IE |= BIT2;
P2IE |= BIT0+BIT1;//电机开关到位中断
P2IES |= BIT0+BIT1;
P6DIR |= 0xff; //P6口都置为输出
IE1 |= WDTIE;
SCFQCTL = 15;
FLL_CTL0 = DCOPLUS + XCAP18PF; // DCO+ set so freq = xtal x D x N+1
LCDCTL = 0x5F; /*液晶使用4MUX,使用S0~S19段*/
P5SEL = 0xFF; /*Common与Rxx都选择*/
P4SEL = 0XFF;
P3SEL = 0XFF;
P2SEL |= 0XC0;
TACTL = TASSEL0 + TACLR ; //timera
CCR0 = 60000;
TACTL |= MC0;
BTCTL = BT_ADLY_500;//基本定时器用于报警
initads1242();
Clear_LCD();
if(SegARead(0x1080)!=0x1234)
{
SegAWrite(0,0,0,0);
}
else
{
totalFlux = SegARead(totalFluxMem);
totalHeat = SegARead(totalHeatMem);
workTime = SegARead(workTimeMem);
heatValue = SegARead(heatMem);
}
_EINT();
if(P2IN&BIT0)
{
OpenValve();
}
measure();
_NOP();
while(1)
{
if((heatValue>50)&&(heatValue<100)&&(userFlag==1))
{
Set_pleasebuy();
}
LPM3;
if(interruptFlag==1)
{
sec = &cardID;
PowerOn();
Reset();
DataRead(MainMemRead,0x08,1,sec);
switch(cardID)
{
case 1:
{
if((setFlag==0)&&(userFlag==0))
{
SetCard();
}
else
{
di();
delay(50000);
delay(50000);
di();
}
} break;
case 6:
{
if(userFlag==1)
{
ChangeCard();
}
else
{
Clear_LCD();
Set_cardwrong();
di();
delay(50000);
delay(50000);
delay(50000);
delay(50000);
Clear_LCD();
}
}break;
case 12:
{
if(setFlag==1)
{
UserCard();
}
else
{
Clear_LCD();
Set_cardwrong();
di();
delay(50000);
delay(50000);
delay(50000);
delay(50000);
Clear_LCD();
}
}break;
default:
{
Clear_LCD();
Set_cardwrong();
wrongFlag = 1;
CCTL0 = CCIE;
di();
}break;
}
interruptFlag=0;
P6OUT &= ~0x1f;
}
if(measureFlag==1)
{
measure();
}
}
}
#pragma vector=PORT1_VECTOR
__interrupt void PORT1 (void)
{
delay(100);
if(P1IFG&BIT3)
{
P1IFG &= ~BIT3;
if(!(P1IN&BIT3))
{
LPM3_EXIT;
instntFlux = (3600/instntFluxCounter);
instntFluxCounter = 0;
++totalFlux;
totalHeat = totalHeat + instntHeat;
if(instntFlux>=65535)
{
instntFlux = 0;
}
if(userFlag==1)
{
if(heatValue>(instntHeat/3600))
{
heatValue = heatValue - instntHeat/3600;
_NOP();
}
else
{
heatValue = 1.0;
}
if((heatValue<5)&&(openFlag==1))
{
CloseValve();
}
}
}
}
if(P1IFG&BIT2)
{
LPM3_EXIT;
P1IFG &= ~BIT2;
measureFlag=1;
interruptFlag=1;
}
}
#pragma vector=PORT2_VECTOR
__interrupt void PORT2 (void)
{
LPM3_EXIT;
if(P2IFG&BIT2)
{
P2IFG &= ~BIT2;
SegAWrite(totalFlux,totalHeat,workTime,heatValue);
Set_battery();
}
if(P2IFG&BIT0)
{
P2IFG &= ~BIT0;
delay(1000);
if(!(P2IN&BIT0))
{
P6OUT &= ~0Xc0;
openFlag = 1;
closeFlag = 0;
}
}
if(P2IFG&BIT1)
{
P2IFG &= ~BIT1;
delay(1000);
if(!(P2IN&BIT1))
{
P6OUT &= ~0Xc0;
openFlag = 0;
closeFlag = 1;
}
}
}
#pragma vector=WDT_VECTOR
__interrupt void WDT_INT(void)
{
workTime++;
counterTime++;
instntFluxCounter++;
if(counterTime>360)
{
LPM3_EXIT;
measureFlag = 1;
counterTime = 0;
}
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
float workTimeBuf = 0;
timerFlag++;
if(wrongFlag==0)
{
switch(timerFlag)
{
case 1:
{
Clear_LCD();
Set_left();
Set_number(flashTemp,0);
Set_reliang();
Set_KWh();
}break;
case 3:
{
Clear_LCD();
Set_cunru();
Set_number(cardLcd,0);
Set_reliang();
Set_KWh();
}break;
case 5:
{
Clear_LCD();
Set_left();
Set_number(heatValue,0);
Set_leiji();
Set_reliang();
Set_KWh();
}break;
}
if(timerFlag>5)
{
timerFlag = 0;
CCTL0 &= ~CCIE;
Clear_LCD();
}
}
else
{
switch(timerFlag)
{
case 1:
{
Clear_LCD();
Set_number(totalHeat/3.6,2);
Set_reliang();
Set_leiji();
Set_KWh();
}break;
case 3:
{
Clear_LCD();
if(tempdisplay1<10001)
{
Set_number(tempdisplay1,1);
}
else
{
Set_number(10000,0);
}
Set_input();
Set_temp();
}break;
case 4:
{
Clear_LCD();
if(tempdisplay2<10001)
{
Set_number(tempdisplay2,1);
}
else
{
Set_number(10000,0);
}
Set_output();
Set_temp();
}break;
case 5:
{
Clear_LCD();
Set_number(instntFlux,1);
Set_shunshi();
Set_liuliang();
}break;
case 6:
{
Clear_LCD();
Set_number(totalFlux,1);
Set_leiji();
Set_liuliang();
}break;
case 7:
{
Clear_LCD();
workTimeBuf = workTime;
workTimeBuf = workTimeBuf/36;
Set_number(workTimeBuf,1);
Set_hour();
}break;
}
if(timerFlag>7)
{
timerFlag = 0;
CCTL0 &= ~CCIE;
wrongFlag = 0;
Clear_LCD();
}
}
}
#pragma vector=BASICTIMER_VECTOR
__interrupt void BASICTIMER (void)
{
uchar btimer=0;
CCTL0&=~CCIE;
btimer++;
P2OUT^=BIT5;
if(btimer>6)
{
IE2&=~BTIE;
P2OUT&=~BIT5;
btimer=0;
Clear_LCD();
}
}
void SetCard(void)
{
setFlag=1;
di();
if(openFlag==1)
{
CloseValve();
}
}
void ChangeCard(void)
{
uchar changeFlag = 0;
uchar *change;
uchar flashSec[3];
uchar changeSec[3];
uchar changeHeat[4];
ulongint heatValueBuf = 0;
change=&changeFlag;
heatValueBuf = heatValue;
DataRead(MainMemRead,0x59,1,change);
SegBRead(secMem,flashSec,3);
if(changeFlag==0)
{
if(!(P1IN&BIT2))
{
SecVerify(0xff,0xff,0xff);
DataWrite(MainMemUpdate,0x60,(heatValueBuf>>24)&0xff);
DataWrite(MainMemUpdate,0x61,(heatValueBuf>>16)&0xff);
DataWrite(MainMemUpdate,0x62,(heatValueBuf>>8)&0xff);
DataWrite(MainMemUpdate,0x63,heatValueBuf&0xff);
DataWrite(MainMemUpdate,0x50,flashSec[0]);
DataWrite(MainMemUpdate,0x51,flashSec[1]);
DataWrite(MainMemUpdate,0x52,flashSec[2]);
DataWrite(MainMemUpdate,0x59,0x01);
}
flashSec[0]=0;
flashSec[1]=0;
flashSec[2]=0;
SegBWrite(flashSec,3);
SegAWrite(0,0,0,0);
setFlag = 0;
userFlag = 0;
heatValueBuf = heatValue;
heatValue=0;
if(P2IN&BIT0)
{
OpenValve();
}
di();
Clear_LCD();
Set_left();
Set_number(heatValueBuf,0);
Set_reliang();
Set_KWh();
delay(50000);
delay(50000);
delay(50000);
delay(50000);
Clear_LCD();
}
else if(changeFlag==1)
{
DataRead(MainMemRead,0x50,3,changeSec);
if(CompArray(changeSec,flashSec,3))
{
DataRead(MainMemRead,0x60,4,changeHeat);
flashTemp = changeHeat[0];
flashTemp = (flashTemp<<8) + changeHeat[1];
flashTemp = (flashTemp<<8) + changeHeat[2];
flashTemp = (flashTemp<<8) + changeHeat[3];
if(flashTemp>0xffffff)
{
flashTemp = 0;
}
heatValue = heatValue + flashTemp;
if(!(P1IN&BIT2))
{
SecVerify(0xff,0xff,0xff);
DataWrite(MainMemUpdate,0x50,0xff);
DataWrite(MainMemUpdate,0x51,0xff);
DataWrite(MainMemUpdate,0x52,0xff);
DataWrite(MainMemUpdate,0x60,0x00);
DataWrite(MainMemUpdate,0x61,0x00);
DataWrite(MainMemUpdate,0x62,0x00);
DataWrite(MainMemUpdate,0x63,0x00);
DataWrite(MainMemUpdate,0x59,0x00);
}
SegAWrite(totalFlux,totalHeat,heatValue,workTime);
di();
Clear_LCD();
Set_cunru();
Set_number(flashTemp,0);
Set_reliang();
Set_KWh();
delay(50000);
delay(50000);
delay(50000);
delay(50000);
Clear_LCD();
if((heatValue>5)&&(closeFlag==1))
{
OpenValve();
}
}
else
{
Set_cardwrong();
IE2=BTIE;
Clear_LCD();
}
}
}
void UserCard(void)
{
uchar userSec[3]; //卡中读出的用户密码
uchar heatbuf[2]; //卡中读出的热量值
uchar flashSec[3]; //flash中读出的用户密码
ulongint heatValueBuf = 0;
DataRead(MainMemRead,0x09,3,userSec);
if(userFlag==0)
{
SegBWrite(userSec,3);
DataRead(MainMemRead,0x40,2,heatbuf);
heatValueBuf = heatbuf[0];
heatValueBuf = (heatValueBuf<<8) + heatbuf[1];
heatValue = heatValueBuf;
SecVerify(0xff,0xff,0xff);
DataWrite(MainMemUpdate,0x40,0);
DataWrite(MainMemUpdate,0x41,0);
SegAWrite(totalFlux,totalHeat,heatValue,workTime);
di();
Clear_LCD();
Set_cunru();
Set_number(heatValue,0);
Set_reliang();
Set_KWh();
delay(50000);
delay(50000);
delay(50000);
delay(50000);
Clear_LCD();
if((heatValue>5)&&(closeFlag==1))
{
OpenValve();
}
userFlag = 1;
}
else
{
SegBRead(secMem,flashSec,3);
if(CompArray(userSec,flashSec,3))
{
DataRead(MainMemRead,0x40,2,heatbuf);
cardLcd = heatbuf[0];
cardLcd = (cardLcd<<8) + heatbuf[1];
flashTemp = heatValue;
heatValue = heatValue + cardLcd;
if((P1IN&BIT2)==0)
{
SecVerify(0xff,0xff,0xff);
DataWrite(MainMemUpdate,0x40,0);
DataWrite(MainMemUpdate,0x41,0);
di();
CCTL0=CCIE;
}
if(cardLcd!=0)
{
SegAWrite(totalFlux,totalHeat,heatValue,workTime);
}
if((cardLcd>10)&&(closeFlag==1))
{
OpenValve();
}
}
else
{
Clear_LCD();
Set_cardwrong();
IE2=BTIE;
}
}
}
void OpenValve(void)
{
P6OUT&=~BIT7;
P6OUT|=BIT6;
delay(500);
P6OUT|=BIT5;
}
void CloseValve(void)
{
P6OUT|=BIT7;
P6OUT&=~BIT6;
delay(500);
P6OUT|=BIT5;
}
uchar CompArray(uchar *src,uchar *des,uchar len)
{
int i;
for(i=0;i<len;i++)
{
if(*src++!=*des++)
{
return 0;
}
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -