⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 430读写IIC总线以及中断控制程序
💻 C
📖 第 1 页 / 共 4 页
字号:
/***********************************************************************************************************
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 + -