📄 main.c
字号:
/***********************************************************************************************************
ic卡中数据的存放:
设置卡中: 换表卡中:
0x08: 设置卡标识0x01 0x08:换表卡标识0x06
0x50~0x52:用户卡密码
0x53~0x56:余留吨数
0x57~0x58:当月用量
费率卡中: 用户卡中:
0x08: 费率卡标识0x20 0x08:用户卡标识0x11
0x20~0x21: 计划费率 0x09~0x0b:用户卡密码
0x22~0x23: 超计划费率0 0x40~0x41:水吨数
0x24~0x55: 超计划费率1 0x42~0x43:计划用水量
密码卡中:
0x08: 逻辑加密卡标识0x05
0x09~0xb: 逻辑加密卡密码
************************************************************************************************************
EEPROM(24CL04)中数据的存放:
0x10~0x13: 存剩余金额值
0x14~0x15: 存当月用水量值
0x16~0x19: 存累计流过表的水量
0x1a~0x1b: 计划用水量
0x20~0x21: 计划费率 0x26~0x27: 超计划费率3
0x22~0x23: 超计划费率1 0x28~0x29: 超计划费率4
0x24~0x25: 超计划费率2 0x2a~0x2b: 超计划费率5
0x30~0x31: 年 0x34: 时
0x32: 月 0x35: 分
0x33: 日 0x36: 秒
0x40: 存设置卡标志
0x41: 存用户卡标志
0x42: 存费率卡标志
0x43: 拆逻辑加密卡标志
0x44: 拆表破坏标志
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; //计划费率下剩余水量
ulongint moneyTemp=0; //剩余金额用于显示
ulongint money=0; //表中的总钱数
ulongint leiJi=0; //水表总的流过水量
uint cardMoney=0; //IC卡上的钱数量
uint planWater=0; //计划用水量
uint feilv=0,feilv1=0,feilv2=0; //费率
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); //设置时分秒
void Clk_set_Y_M_D( uint year,uchar month, uchar day ); //设置年月日
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]; //当月水量
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) //费率
{
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卡中断设置降沿触发
P1IE|=BIT2; //P1.2中断允许
P1IE|=BIT3+BIT4;
P1IES&=~(BIT3+BIT4);
P2IES|=BIT0; //流量脉冲中断下降沿触发
P2IE|=BIT0; //P2.0中断允许
P2IES&=~BIT1; // 拆表中断上升沿触发
P2IE|=BIT1; //P2.1中断允许
P2IES|=BIT2; // 电池低电中断下降沿触发
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(); //读出数据
}
if(setcarFlag==1)
{
ClanArray();
IRcvStr(0X44,eepsecR,1);
chaiBiaoFlag=eepsecR[0];
}
if(usercardFlag==1)
{
UpTime(); //读出铁电里的时间
IE1 |= WDTIE;
}
ClearLCD();
P6OUT|=BIT4;
if(P1IN&BIT3) //关阀到位
{
closeFlag=1;
P6OUT&=~0Xf0; //口子置低实现低功耗
openFlag=0;
}
if(P1IN&BIT4) //开阀到位
{
openFlag=1;
P6OUT&=~0Xf0; //口子置低实现低功耗
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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -