📄 ic_card+measure+lcd.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 + -