//****************************************************************************
// MSP430-41X Demo -SLE4442 IC Card operation
//
//
// 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 "sle4442.h"
#define BELL_OUT P6OUT
#define BELL_DIR P6DIR
#define BELL_BIT BIT5 //p6.5 控制蜂鸣器
unsigned char Data_Buffer[10]; //数据缓存
unsigned char User_Key[3]={0xff,0xff,0xff}; //密码缓存
unsigned char ErrCounter_Key[4]; //Secure区数据,ErrCounter_Key[0]错误数;后三个字节存放密码
void Beep_Alarm(unsigned int cycle,unsigned int high_last,unsigned int low_last);
void main (void)
{
unsigned char right_flag;
//unsigned char nByte;
WDTCTL = WDTPW + WDTHOLD;
//SCFQCTL=31; //MCLK=32*ACLK=1024KHz,DCO+=0
//SCFI0=0;
//FLL_CTL0 |= XCAP18PF;
_EINT();
ICCard_IO_Init(); //初始化IC卡
for (;;)
{
LPM3; //进LPM3模式
_NOP();
IC_DETECT_IE &=~ IC_DETECT_BIT; //关闭IC中断
ICCard_ATR( &Data_Buffer[0] );
ICCard_Read_MainMem( &Data_Buffer[0], 0, 10 ); //连续读取主存储"0x30"单元连续10个单元数据存入Data_Buffer【0】开始连续“10”个单元
right_flag=ICCard_PSC( &User_Key[0]); //密码校验
if(right_flag==1)
{
// ICCard_Read_ProtMem(&Data_Buffer[0]); //读保护区数据(共4字节)
//ICCard_Read_SecuMem(&ErrCounter_Key[0]); //读密码区 (4字节)ErrCounter_Key[0]错误数;后三个字节存放密码
//ICCard_Update_KEY(&User_Key[0]); //更新密码区(3字节)
//ICCard_Update_MainMem_OneByte(0x30,0x88); //更新主存储区“0x30”单元为“0x88”
//ICCard_Update_MainMem( &Data_Buffer[0], 0, 10 ); //将Data_Buffer【0】开始连续“10”个数据写入主存储区"0x20"起连续10个字节
Beep_Alarm(1,0x5000,0x3000);
}
else
{
Beep_Alarm(5,0x3000,0x5000);
}
_NOP();
IC_DETECT_IE |= IC_DETECT_BIT; //重新使能IC中断
}
}
/******************中断处理子程序**************************/
#pragma vector=PORT2_VECTOR
__interrupt void P2_int (void)
{
if( (P2IFG & IC_DETECT_BIT)!=0 )
{
if((P2IN&IC_DETECT_BIT)==0)
{
P2IFG =0;
_NOP();
LPM3_EXIT; // 退出LPM3模式
}
}
}
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();
}