www.pudn.com > newrlb.rar > main.c
/* * copyright (c) 兰州瑞德高科技有限公司电专项目组 * all rights reserved. * 文件名称: main.c * 摘 要: ic卡热表主程序 * 当前版本: v1.0 * 作 者: 杨晓卫 * 完成日期: 2004.7.30 * 修改日期: 2004.8.2 */ #include#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