?? main.c
字號:
/***********************************************************************************************************
ic卡中數(shù)據(jù)的存放:
設(shè)置卡中: 換表卡中:
0x08: 設(shè)置卡標(biāo)識0x01 0x08:換表卡標(biāo)識0x06
0x50~0x52:用戶卡密碼
0x53~0x56:余留噸數(shù)
0x57~0x58:當(dāng)月用量
費(fèi)率卡中: 用戶卡中:
0x08: 費(fèi)率卡標(biāo)識0x20 0x08:用戶卡標(biāo)識0x11
0x20~0x21: 計劃費(fèi)率 0x09~0x0b:用戶卡密碼
0x22~0x23: 超計劃費(fèi)率0 0x40~0x41:水噸數(shù)
0x24~0x55: 超計劃費(fèi)率1 0x42~0x43:計劃用水量
密碼卡中:
0x08: 邏輯加密卡標(biāo)識0x05
0x09~0xb: 邏輯加密卡密碼
************************************************************************************************************
EEPROM(24CL04)中數(shù)據(jù)的存放:
0x10~0x13: 存剩余金額值
0x14~0x15: 存當(dāng)月用水量值
0x16~0x19: 存累計流過表的水量
0x1a~0x1b: 計劃用水量
0x20~0x21: 計劃費(fèi)率 0x26~0x27: 超計劃費(fèi)率3
0x22~0x23: 超計劃費(fèi)率1 0x28~0x29: 超計劃費(fèi)率4
0x24~0x25: 超計劃費(fèi)率2 0x2a~0x2b: 超計劃費(fèi)率5
0x30~0x31: 年 0x34: 時
0x32: 月 0x35: 分
0x33: 日 0x36: 秒
0x40: 存設(shè)置卡標(biāo)志
0x41: 存用戶卡標(biāo)志
0x42: 存費(fèi)率卡標(biāo)志
0x43: 拆邏輯加密卡標(biāo)志
0x44: 拆表破壞標(biāo)志
0x45~0x47: 存用戶卡密碼
0x48~0x4b: 存邏輯加密卡密碼
***********************************************************************************************************/
#include <msp430x41x.h>
#include <stdlib.h>
#include <math.h>
#include "iccard.h"
#include "lcd.h"
#include "eeprom.h"
#define BOOL unsigned char
#define TRUE 0x01
#define FALSE 0x00
#define uint unsigned int
#define uchar unsigned char
#define ulongint unsigned long
uchar setcarFlag=0,feilvcardFlag=0,usercardFlag=0,icPassWordFlag=0,openFlag=0,closeFlag=0,diDianFlag=0,chaiBiaoFlag=0,daoShuiFlag=0,interruptFlag=0;
uint monthWater=0; //月用水量
ulongint spareWater=0; //計劃費(fèi)率下剩余水量
ulongint moneyTemp=0; //剩余金額用于顯示
ulongint money=0; //表中的總錢數(shù)
ulongint leiJi=0; //水表總的流過水量
uint cardMoney=0; //IC卡上的錢數(shù)量
uint planWater=0; //計劃用水量
uint feilv=0,feilv1=0,feilv2=0; //費(fèi)率
uchar cKeyFlag=0, timerFlag=0;
uchar clkHr,clkMin,clkSec,clkMonth,clkDay;
uint clkYear;
uchar clkMonthTbl[12]={31,28,31,30,31,30,31,31,30,31,30,31};
uchar eepsecR[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
uchar eepsecW[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
uchar icPassWord[3]={0xff,0xff,0xff};
//*******************************************************************************************************
void SetCard(void);
void ChangeCard(void);
void UserCard(void);
void FeilvCard(void);
void OpenValve(void);
void CloseValve(void);
void Delay(unsigned long i);
static BOOL ClkUpdateTime(void); //時分秒
static void ClkUpdateDate(void); //年月日
static BOOL ClkIsLeapYear(uint year); //是否閏年?
void Clk_set_H_M_S( uchar hr, uchar min, uchar sec); //設(shè)置時分秒
void Clk_set_Y_M_D( uint year,uchar month, uchar day ); //設(shè)置年月日
void LiuLiang(void);
//*******************************************************************************************************
void ClanArray(void)
{
uchar i=0;
for(i=0;i<16;i++)
{
eepsecW[i]=0;
eepsecR[i]=0;
}
}
//****************************************************************************************************
void Di (void)
{
P1OUT|=BIT5;
Delay(2000);
P1OUT&=~BIT5;
}
//*******************************************************************************************************
uchar CompArray(uchar *src,uchar *des,uchar len) //比較子程序
{
int i;
for(i=0;i<len;i++)
{
if(*src++!=*des++)
{
return 0;
}
}
return 1;
}
//***************************************************************************************************
void ClanEprom(void)
{
ClanArray();
ISendStr(0X10,eepsecW,16);
ISendStr(0X20,eepsecW,16);
ISendStr(0X30,eepsecW,16);
ISendStr(0X40,eepsecW,16);
}
//**************************************************************************************************************
void UpDate(void)
{
ulongint eepromTemp=0;
uint monthWaterp=0;
uint jihuaTemp=0;
uint feiTemp=0;
setcarFlag=1;
ClanArray();
IRcvStr(0X10,eepsecR,6);
eepromTemp=eepsecR[0];
eepromTemp=(eepromTemp<<8)+eepsecR[1]; //剩余余額
eepromTemp=(eepromTemp<<8)+eepsecR[2];
eepromTemp=(eepromTemp<<8)+eepsecR[3];
money=eepromTemp;
monthWaterp=eepsecR[4];
monthWaterp=(monthWaterp<<8)+eepsecR[5]; //當(dāng)月水量
monthWater=monthWaterp;
ClanArray();
IRcvStr(0X16,eepsecR,6);
eepromTemp=eepsecR[0];
eepromTemp=(eepromTemp<<8)+eepsecR[1]; //累計水量
eepromTemp=(eepromTemp<<8)+eepsecR[2];
eepromTemp=(eepromTemp<<8)+eepsecR[3];
leiJi=eepromTemp;
jihuaTemp=eepsecR[4];
jihuaTemp=(jihuaTemp<<8)+eepsecR[5]; //計劃用水量
planWater=jihuaTemp;
ClanArray();
IRcvStr(0X40,eepsecR,4);
setcarFlag=eepsecR[0];usercardFlag=eepsecR[1];feilvcardFlag=eepsecR[2];icPassWordFlag=eepsecR[3];
if(feilvcardFlag==1) //費(fèi)率
{
ClanArray();
IRcvStr(0X20,eepsecR,6);
feiTemp=eepsecR[0];
feiTemp=(feiTemp<<8)+eepsecR[1];
feilv=feiTemp;
feiTemp=eepsecR[2];
feiTemp=(feiTemp<<8)+eepsecR[3];
feilv1=feiTemp;
feiTemp=eepsecR[4];
feiTemp=(feiTemp<<8)+eepsecR[5];
feilv2=feiTemp;
}
if(icPassWordFlag==1) //邏輯加密卡密碼
{
IRcvStr(0X48,icPassWord,3);
}
}
//***********************************************************************************************************************************
void UpTime(void)
{
uint yearTemp;
ClanArray();
IRcvStr(0X30,eepsecR,7);
yearTemp=eepsecR[0];
yearTemp=(yearTemp<<8)+eepsecR[1];
clkYear=yearTemp;
clkMonth=eepsecR[2];
clkDay=eepsecR[3];
clkHr=eepsecR[4];
clkMin=eepsecR[5];
clkSec=eepsecR[6];
}
//*************************************************主程序************************************************************************
void main(void)
{
uchar *sec;
uchar icFlag[1]={0};
uchar cardID=57;
uchar aa=1,bb=1;
WDTCTL = WDT_ADLY_1000;
SCFQCTL =15;
FLL_CTL0 =DCOPLUS + XCAP18PF; // DCO+ set so freq = xtal x D x N+1
BTCTL= BT_ADLY_500; //基本定時器用于報警
TACTL = TASSEL0 + TACLR ; //TimerA用于液晶顯示
CCR0=60000;
TACTL|=MC0;
LCDCTL=0x5F; //液晶使用4MUX,使用S0~S19段
P5SEL =0xFF; //Common與Rxx都選擇
P4SEL=0XFF;
P3SEL=0XFF;
P2SEL|=0XC0;
P1DIR|=BIT5; //蜂鳴器報警信號輸出
P1OUT&=~BIT5;
P1IES|=BIT2; //IC卡中斷設(shè)置降沿觸發(fā)
P1IE|=BIT2; //P1.2中斷允許
P1IE|=BIT3+BIT4;
P1IES&=~(BIT3+BIT4);
P2IES|=BIT0; //流量脈沖中斷下降沿觸發(fā)
P2IE|=BIT0; //P2.0中斷允許
P2IES&=~BIT1; // 拆表中斷上升沿觸發(fā)
P2IE|=BIT1; //P2.1中斷允許
P2IES|=BIT2; // 電池低電中斷下降沿觸發(fā)
P2IE|=BIT2; //P2.2中斷允許
P6DIR|=0xff; //P6口全為輸出
P6OUT&=~0Xff;
P2DIR|=BIT3+BIT4+BIT5;
P2OUT|=BIT5;
ClearLCD();
ClanArray();
IRcvStr(0X40,eepsecR,4);
aa=eepsecR[0];
bb=eepsecR[3];
if((aa!=1)&&(bb!=1))
{
IRcvStr(0X40,eepsecR,4);
aa=eepsecR[0];
bb=eepsecR[3];
if((aa!=1)&&(bb!=1))
{
IRcvStr(0X40,eepsecR,4);
aa=eepsecR[0];
bb=eepsecR[3];
if((aa!=1)&&(bb!=1))
{
ClanEprom(); //清鐵電
}
}
}
else if(aa==1)
{
UpDate(); //讀出數(shù)據(jù)
}
if(setcarFlag==1)
{
ClanArray();
IRcvStr(0X44,eepsecR,1);
chaiBiaoFlag=eepsecR[0];
}
if(usercardFlag==1)
{
UpTime(); //讀出鐵電里的時間
IE1 |= WDTIE;
}
ClearLCD();
P6OUT|=BIT4;
if(P1IN&BIT3) //關(guān)閥到位
{
closeFlag=1;
P6OUT&=~0Xf0; //口子置低實(shí)現(xiàn)低功耗
openFlag=0;
}
if(P1IN&BIT4) //開閥到位
{
openFlag=1;
P6OUT&=~0Xf0; //口子置低實(shí)現(xiàn)低功耗
closeFlag=0;
}
_EINT(); //中斷允許
if(P2IN&BIT1)
{
if((setcarFlag==1)&&(chaiBiaoFlag==0))
{
Delay(500);
if(P2IN&BIT1)
{
ClearLCD();
LCD[8]|=0X01;
LCD[0]|=0XFA; //0拆表破壞
chaiBiaoFlag=1;
eepsecW[0]=1;
ISendStr(0X44,eepsecW,1);
Delay(500);
Di();
}
}
}
if((openFlag!=1)&&(setcarFlag==0))
{
OpenValve();
}
if(usercardFlag==1)
{
money=spareWater*feilv;
}
while(1)
{
ClkUpdateTime();
if( ClkUpdateTime()==TRUE) //如果為新的一天
{
ClkUpdateDate();
}
if(chaiBiaoFlag==0)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -