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

📄 ic_card+measure+lcd.c

📁 IC卡水表的源程序
💻 C
字号:
 //****************************************************************************
//  MSP430-41X Demo -SLE4442 IC Card operation ,Pusle Measure and LCD display 
//
//
//               MSP430F413
//            -----------------
//        /|\|              XIN|-  
//         | |                 | 
//         --|RST          XOUT|-
//           |                 |    ________
//           |                 |   |        |
//           |             P1.0|-->| INT    |
//           |             P6.4|  .| VCC    |
//           |             P1.2| . | CLK    |
//           |             P6.5| . | DATA   |   
//           |             P2.0| . | RST    |     
//           |             GND |-->| GND    | 
//           |                 |   | _______|
//  Donghai CHeng
//  Lierda, Inc
//  NOVEMBER 2004
//  Built with IAR Embedded Workbench Version: 2.21B
//******************************************************************************

#include "msp430x41x.h"
#include "IC_Card.h"
/*************LCD define*******************/ 
#define COM1                (0x0004)
#define COM2                (0x0008)
#define COM3                (0x0010)
#define R13                (0x0020)
#define R23                (0x0040)
#define R33                (0x0080)

#define   SegA     0x01     
#define   SegB     0x02
#define   SegC     0x04
#define   SegD     0x80
#define   SegE     0x40
#define   SegF     0x10
#define   SegG     0x20
#define   SegH     0x08

#define  Digit0    SegA+SegB+SegC+SegD+SegE+SegF
#define  Digit1    SegB+SegC
#define  Digit2    SegA+SegB+SegD+SegE+SegG
#define  Digit3    SegA+SegB+SegC+SegD+SegG
#define  Digit4    SegB+SegC+SegF+SegG
#define  Digit5    SegA+SegC+SegD+SegF+SegG
#define  Digit6    SegA+SegC+SegD+SegE+SegF+SegG
#define  Digit7    SegA+SegB+SegC
#define  Digit8    SegA+SegB+SegC+SegD+SegE+SegF+SegG
#define  Digit9    SegA+SegB+SegC+SegD+SegF+SegG

int Digit[10] = {Digit0,Digit1,Digit2,Digit3,Digit4,Digit5,Digit6,Digit7,Digit8,Digit9};
/*****************LCD define END************************/

#define BELL_OUT         P6OUT             //蜂鸣器控制端口P6.3 
#define BELL_DIR         P6DIR
#define BELL_BIT         0x08
void Beep_Alarm(unsigned int cycle,unsigned int high_last,unsigned int low_last);          //蜂鸣器报警子程序
void delay(unsigned char l,unsigned int k);   //延时子程序
/*********************************************/
void Beep_Alarm(unsigned int cycle,unsigned int high_last,unsigned int low_last)
{
	unsigned int i,j;
	BELL_DIR |= BELL_BIT;
	for(i=0;i<cycle;i++)
	{
	   BELL_OUT |= BELL_BIT;
	   for(j=0;j<high_last;j++);
	   BELL_OUT &= ~BELL_BIT;
	   for(j=0;j<low_last;j++);
        }
        BELL_OUT &= ~BELL_BIT;
        _NOP();
}


/*****************液晶初始化***********************/
void LCD_Initial(void)          
 {   
    char *LCD = LCDMEM;
    int i;
    for (i=0; i<12; i++)
     {
      LCD[i] = 0;
      }    
    P5SEL = R33+R23+R13+COM3+COM2+COM1; 
    LCDCTL = LCDSG0_2+LCD4MUX+LCDON; // Enable LCD 
    BTCTL  = BTSSEL + BTDIV + BTFRFQ0 + BTIP2 + BTIP1;      //BT 定时1"S"
  }

 
unsigned char Data_Buffer[4];                      //数据缓存

unsigned char User_Key[4]={0xff,0xff,0xff};       //密码缓存
 
#define PULSE_VECTER PORT1_VECTOR
#define PULSE_IN     P1IN
#define PULSE_DIR    P1DIR
#define PULSE_IE     P1IE
#define PULSE_IES    P1IES
#define PULSE_IFG    P1IFG
#define PULSE_BIT1   0x08               //P1.4  接干簧管“1”
#define PULSE_BIT2   0x10               //P1.5  接干簧管“2”
#define PLUS_REPARE_FLAG   0x0100       //Pulse1脉冲标志
#define REMIAN_NEGTIVE_FLAG 0x0200      //剩余量为负标志

unsigned int  system_state_flag;        //系统状态标志
unsigned char pulse1_count;             //pulse1计数变量
unsigned char pulse2_count;             //pulse2计数变量
unsigned int  Pulse_Count;              //总脉冲计数
unsigned char  Pulse_Temp;
 
void Pulse_Plus(void);
void dispay(void);
void Pulse_deal(void);

void delay(unsigned char l,unsigned int k)
{
 unsigned char p;
 unsigned int q;
 for(p=0;p<l;p++){for(q=0;q<k;q++);}
}
 
 
 void main (void)
 {
    unsigned char right_flag;
    WDTCTL = WDTPW + WDTHOLD;
    SCFQCTL=31;                                            //MCLK=32*ACLK=1024KHz,DCO+=0
    SCFI0=0;
    FLL_CTL0 |= XCAP18PF; 
    LCD_Initial();             //液晶化
    PULSE_DIR &=~ (PULSE_BIT1+PULSE_BIT2);                //脉冲输入端口初始化
    PULSE_IE = PULSE_BIT1+PULSE_BIT2;
    PULSE_IES = PULSE_BIT1+PULSE_BIT2; 
    ICCard_IO_Init();                                      //初始化IC 端口 
    _EINT();
    for (;;)                              
      { 
       dispay();
        LPM3;                                              //进LPM3模式 
        IC_DETECT_IE &=~ IC_DETECT_BIT;                    //关闭IC中断
        _NOP();	
        ICCard_ATR( &Data_Buffer[0] );
        right_flag=ICCard_PSC(&User_Key[0]);               //密码校验
        if(right_flag==1)
          { 
            ICCard_Read_MainMem( &Data_Buffer[0], 0x30, 1 );     //读取主存储区"0x30"单元开始连续"1"个单元数据,存入Data_Buffer[0]
            Pulse_Temp=Data_Buffer[0];
            Pulse_deal();
      
           // ICCard_Update_MainMem_Nbyte( 0x30,0x00,1 ); //清除0x30地址数据
            Beep_Alarm(1,0x5000,0x3000);
          } 
        else
          {
             Beep_Alarm(5,0x3000,0x5000);
          }    
        _NOP();
       IC_DETECT_IE |= IC_DETECT_BIT;                    //重新使能IC中断   
     }
}

/********P1口中断服务子程序**********/
/******双脉冲输入中断*******/
#ifdef __IAR_SYSTEMS_ICC__
#if __VER__ >= 200
#pragma vector=PULSE_VECTER
__interrupt void PULSE_INT (void)
#else
interrupt[PULSE_VECTER] void PULSE_INT (void)
#endif
#else
interrupt[PULSE_VECTER] void PULSE_INT (void)
#endif
{
	if(PULSE_BIT1&PULSE_IFG)                //干簧管“1”处理
	 {
		PULSE_IFG &= ~PULSE_BIT1;
		delay(1,10000);
		if(PULSE_BIT1&PULSE_IN)          //再次判断干簧管“1”是否吸合
		   {
		     PULSE_IFG &= ~PULSE_BIT1;
		     system_state_flag &= ~PLUS_REPARE_FLAG;
	           }
	        else                            
	           {
                     if(PULSE_BIT2&PULSE_IN)                                       //再次判断干簧管“1”是否吸合  
	                  {
	   	              pulse1_count++;                                      //干簧管1 计数变量pulse1_count加1    
	   	              system_state_flag |= PLUS_REPARE_FLAG;               //置标志位,说明干簧管1已经吸合1次
	   	              PULSE_IFG &= ~PULSE_BIT1;
	                   }
	                else
	                    {
	                      delay(1,10000); 
	   	               if(PULSE_BIT2&PULSE_IN)                            //再次判断干簧管“1”是否吸合
	   	                     {
	   	                       pulse1_count++;
	   	                       system_state_flag |= PLUS_REPARE_FLAG;
	   	                       PULSE_IFG &= ~PULSE_BIT1;
	   	                     }
	                      }
	              }
	 }
	else if(PULSE_BIT2&PULSE_IFG)         //干簧管“2”处理 
	     {
		PULSE_IFG &= ~PULSE_BIT2;
		delay(1,10000);
		if(PULSE_BIT2&PULSE_IN)                                           //再次判断干簧管“2”是否吸合                  
		   {
	             PULSE_IFG &= ~PULSE_BIT2;
		   }
		else
		   {
		       if(PULSE_BIT1&PULSE_IN)                                   //再次判断干簧管“3”是否吸合 
		        {
		 	   pulse2_count++;                                       //干簧管“2” 计数变量pulse2_count加1 
		 	   if(system_state_flag & PLUS_REPARE_FLAG)              //判断干簧管“1”是否已吸合?
		 	     {
		 	        system_state_flag &= ~PLUS_REPARE_FLAG;          //清除标志
		 	        pulse1_count=0;
		 	        pulse2_count=0;
		 	        Pulse_Plus();                                    //脉冲计数处理程序                              
		 	      }
		 	     else
		 	      { 
		 	       _NOP();
		 	       }
		         }
		         else 
		         {
		 	     delay(1,10000);
		 	     if(PULSE_BIT1&PULSE_IN)                             //再次判断干簧管“3”是否吸合  
		 	      { 
		 	         pulse2_count++;                                 //干簧管“2” 计数变量pulse2_count加1 
		 	         if(system_state_flag & PLUS_REPARE_FLAG)         //判断干簧管“1”是否已吸合?
		 	           {
		 	              system_state_flag &= ~PLUS_REPARE_FLAG;     //清除标志
		 	              pulse1_count=0;
		 	              pulse2_count=0;
		 	              Pulse_Plus();                               //脉冲计数处理程序  
		 	           }
		 	         else
		 	          { 
		 	           _NOP();
		 	          }
	                     }
		        }
		    }            
	     }
	 else if(IC_DETECT_IFG & IC_DETECT_BIT)         //干簧管“2”处理 
	         {
	           if( (IC_DETECT_IFG & IC_DETECT_BIT)!=0 )
	            {      
	             if((IC_DETECT_IN & IC_DETECT_BIT)==0)
	              {
	               IC_DETECT_IFG &=~ IC_DETECT_BIT;
	               _NOP(); 
		       LPM3_EXIT;					// 退出LPM3模式
	              }
	           }
	        }
}
	
	
	
void Pulse_Plus(void) 
{
 if(system_state_flag &REMIAN_NEGTIVE_FLAG)
   {
   Pulse_Count++;	                      //脉冲加+1
   }
 else
   {
     Pulse_Count--;	                      //脉冲加-1
   } 
 if(Pulse_Count==0xffff)
  {
    Pulse_Count=1;
    system_state_flag |= REMIAN_NEGTIVE_FLAG;
    //LCDMEM[9]|= 0x08;
    //LCDMEM[9]|= 0x04;
  }
  dispay();
}

void Pulse_deal(void)
{   
    if(system_state_flag &REMIAN_NEGTIVE_FLAG)   
      {
        if(Pulse_Temp>Pulse_Count)
        {
          Pulse_Count=Pulse_Temp-Pulse_Count;
          system_state_flag &=~ REMIAN_NEGTIVE_FLAG;
        } 
        else
         {
           Pulse_Count=Pulse_Count-Pulse_Temp;
         } 
      }
     else
      { 
        Pulse_Count+=Pulse_Temp;
      }  
      dispay();
}

/**************显示函数********************/
void dispay(void)
{
 /************************************************************/  
  LCDMEM[7]=Digit[Pulse_Count%10];
  LCDMEM[6]=Digit[(Pulse_Count/10)%10];
  LCDMEM[5]=Digit[(Pulse_Count/100)%10];
  LCDMEM[4]=Digit[(Pulse_Count/1000)%10];
  LCDMEM[3]=Digit[(Pulse_Count/10000)%10];
  
   if(system_state_flag &REMIAN_NEGTIVE_FLAG) 
    {
      LCDMEM[0] |= 0x20;              //若剩余量为负,提示“请购水”并显示“—”
      LCDMEM[9] |= 0x08;
      LCDMEM[9] |= 0x04;
      LCDMEM[7] |= 0x08;             //显示M3
    }  
  else
    {
       LCDMEM[0] &=~ 0x20;         //若剩余量为非负,清除“请购水”和“—” 
       LCDMEM[9] &=~ 0x08;
       LCDMEM[9] &=~ 0x04;
       LCDMEM[7] |= 0x08;          //显示M3
    }
  
  
  if(Pulse_Count<10)                                     //如果小于10,则前4位“0”不显示
   {LCDMEM[6]=0;LCDMEM[5]=0;LCDMEM[4]=0;LCDMEM[3]=0;}
  else if (Pulse_Count<100)                              //如果小于100,则前3位“0”不显示
       {LCDMEM[5]=0;LCDMEM[4]=0;LCDMEM[3]=0;}
       else if (Pulse_Count<1000)                        //如果小于1000则前2位”0“不显示 
              {LCDMEM[4]=0;LCDMEM[3]=0;}  
             else if (Pulse_Count<10000)                 //如果小于10000则前1位”0“不显示    
                  {LCDMEM[3]=0;} 
 /***********************************************************/                  
                  
}         


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -