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

📄 ic carddlg.cpp

📁 关于2410上面的IC卡代码程序.基于WINCE,欢迎下载共同讨论
💻 CPP
字号:
// IC CardDlg.cpp : implementation file
//

#include "stdafx.h"
#include "IC Card.h"
#include "IC CardDlg.h"
#include "CIo.h"
#include "lcdreg.h"
#include "Gpio.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CICCardDlg dialog

CICCardDlg::CICCardDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CICCardDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CICCardDlg)
	writeaddress = _T("");
	writedata = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CICCardDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CICCardDlg)
	DDX_Text(pDX, IDC_EDIT1, writeaddress);
	DDX_Text(pDX, IDC_EDIT3, writedata);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CICCardDlg, CDialog)
	//{{AFX_MSG_MAP(CICCardDlg)
	ON_BN_CLICKED(IDC_BUTTON1, Onwrite)
	ON_BN_CLICKED(IDC_BUTTON2, Onread)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CICCardDlg message handlers

BOOL CICCardDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	CenterWindow(GetDesktopWindow());	// center to the hpc screen
    bInitGpioReg();//初始化引脚
	LcdOn();//点亮LCD
	SetTimer(1,2000,NULL); 
	test=3;
	SetTimer(KEY_TIMER,KEY_DELAY,NULL);//开始监控按键
	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}



void CICCardDlg::Onwrite() 
{
	// TODO: Add your control notification handler code here

//	ICCardPowerOn();//ARM9 的GPIO引脚置高给IC卡供电
	UpdateData(TRUE);
	int len = writeaddress.GetLength();//取得写入地址输入字符长度
	char *psendbuf=new char[len]; 
	for(int i=0;i<len;i++)
       psendbuf[i]=(char)writeaddress.GetAt(i);
	ICCard_data[0] = psendbuf[i];
	ICCard_Write(0,1,8);
//	ICCardPowerOff();//ARM9 的GPIO引脚置低给IC卡断电
    MessageBox(_T("Write data into IC card succesufully!"));
}



void CICCardDlg::Onread() 
{
	// TODO: Add your control notification handler code here
	
	CWnd* pWnd;
	CICCardDlg* pDlg=(CICCardDlg* )pWnd;
	CEdit * pRecvStrEdit= (CEdit* )pDlg->GetDlgItem(IDC_EDIT4); 
	CString strRecv = ICCard_data[0];

	pRecvStrEdit->SetWindowText(strRecv);
    

//	ICCardPowerOn();//ARM9 的GPIO引脚置高给IC卡供电
	ICCard_Read(0,1);
//	ICCardPowerOff();//ARM9 的GPIO引脚置低给IC卡断电
}

/*******************************************************\
|	函数名		ICCardPowerOn							|
|	函数功能		IC卡上电									|
|	参数			无										|
|	返回值		无										|
\*******************************************************/
//void ICCardPowerOn()
//{
//	PC&= 0xFB;	//将第2位置0  //电路上可以直接连电源
//}

/*******************************************************\
|	函数名		ICCardPowerOff							|
|	函数功能	IC卡下电								|
|	参数		无										|
|	返回值		无										|
\*******************************************************/
//void ICCardPowerOff()
//{
//	PC|= 0x04;	//第2位置1
//}

/*******************************************************\
|	函数名		ICCard_Write							|
|	函数功能		向ICCard的offset处写入length个字节		|
|	参数			offset	:	IC卡内扁移地址				|
|				length	:	写入数据长度					|
|				PageLen	:	IC卡页数据长度				|
|	返回值		无										|
\*******************************************************/
void CICCardDlg::ICCard_Write(	unsigned int offset,
							unsigned int length,
							unsigned char PageLen)
{
	unsigned int pagenum,basepage;
	unsigned char j,firstlen;

	//chang_4052(3);

	basepage = offset/PageLen;//首字节所在页面号

	if((offset%PageLen+length)>PageLen)//数据跨区
	{
		pagenum=(length-(PageLen-(offset%PageLen)))/PageLen+1;
		firstlen=PageLen-(offset%PageLen);
		if((length-(PageLen-(offset%PageLen)))%PageLen) pagenum++;
	}
	else//数据不跨区,仅需发送一页。
	{
		pagenum = 1;
		firstlen = length;
	}

	//发送第一页
	ICCard_Start();
	ICCard_OutB(0xA0+(unsigned char)((offset>>8)*2));
	ICCard_OutB((unsigned char)(offset));

	for (j = 0;j < firstlen;j++)
//			ICCard_OutB(XBYTE[j]);
		ICCard_OutB(ICCard_data[j]);

	ICCard_Stop();
//	delay_1ms(10);
    Sleep(10);
	//如果超过2页,发送中间页
	for( pointer = 2 ; pointer < pagenum ; pointer++)
	{
		ICCard_Start();

		ICCard_OutB(0xA0+((((unsigned char)(((basepage+pointer-1)*PageLen)>>8))*2)&0x0e));
		ICCard_OutB((unsigned char)((basepage+pointer-1)*PageLen));

		for (j = 0;j < PageLen;j++)
		{
//			ICCard_OutB(XBYTE[firstlen+((pointer-2)*PageLen)+j]);
			ICCard_OutB(ICCard_data[firstlen+((pointer-2)*PageLen)+j]);
		}

		ICCard_Stop();
		Sleep(3);
	}

	//如果不止一页,发送最后一页
	if(pagenum>1)
	{
		ICCard_Start();
		ICCard_OutB(0xA0+(unsigned char)((((basepage+pagenum-1)*PageLen)>>8)*2));
		ICCard_OutB((unsigned char)((basepage+pagenum-1)*PageLen));

		for (j = 0;j < length-firstlen-(pagenum-2)*PageLen;j++)
		{
			ICCard_OutB(ICCard_data[firstlen+((pagenum-2)*PageLen)+j]);
		}

		ICCard_Stop();
		Sleep(10);
	}

	
}

/*******************************************************\
|	函数名		_CardSetClock							|
|	函数功能	设置IC卡CLOCK							|
|	参数		Level	:	待设置的IC卡CLOCK电平		|
|	返回值		无										|
\*******************************************************/
void CICCardDlg::_CardSetClock(unsigned char Level)
{
	if(Level==0)
	{
		mycio.GetGPF20();}
if(Level==1)
	{
		mycio.GetGPF2();}
}



/*******************************************************\
|	函数名		_CardPutIO								|
|	函数功能	设置IC卡IO								|
|	参数		IOData	:	待设置的IC卡IO电平			|
|	返回值		无										|
\*******************************************************/
void CICCardDlg::_CardPutIO(unsigned char IOData)
{
	if(IOData==0)
	{
		mycio.GetGPF30();}
if(IOData==1)
	{
		mycio.GetGPF3();}
}

/*******************************************************\
|	函数名		_CardReadIO								|
|	函数功能	读取IC卡IO								|
|	参数		无										|
|	返回值		读取的IC卡IO							|
\*******************************************************/
unsigned char CICCardDlg::_CardReadIO()
{int g;

g=mycio.GetGPF33();
	return g;
}

/*******************************************************\
|	函数名		AT24_Pulse								|
|	函数功能	给IC卡一个时钟周期						|
|	参数		无										|
|	返回值		无										|
\*******************************************************/
void CICCardDlg::ICCard_Pulse()
{
	_CardSetClock(1);
	_CardSetClock(0);
}

/*******************************************************\
|	函数名		AT24_Start								|
|	函数功能	给IC卡开始信号							|
|	参数		无										|
|	返回值		无										|
\*******************************************************/
void CICCardDlg::ICCard_Start()
{
	_CardPutIO(1); _CardSetClock(1);
	_CardPutIO(0); _CardSetClock(0);
}

/*******************************************************\
|	函数名		ICCard_Stop								|
|	函数功能	给IC卡停止信号							|
|	参数		无										|
|	返回值		无										|
\*******************************************************/
void CICCardDlg::ICCard_Stop()
{
	_CardPutIO(0); _CardSetClock(1);
	_CardPutIO(1); _CardSetClock(0);
}

/*******************************************************\
|	函数名		ICCard_OutB								|
|	函数功能	向IC卡发送一个字节						|
|	参数		无										|
|	返回值		无										|
\*******************************************************/
void CICCardDlg::ICCard_OutB(unsigned char OutData)
{
	unsigned char i;
	for (i = 0;i < 8;i++)
	{
		if ( (OutData & 0x80) == 0x80 ) _CardPutIO(1); else _CardPutIO(0);
		ICCard_Pulse(); OutData = OutData << 1;
	}
	_CardPutIO(1); ICCard_Pulse();
}

/*******************************************************\
|	函数名		ICCard_InB								|
|	函数功能		从IC卡接受一个字节					|
|	参数			无									|
|	返回值		无										|
\*******************************************************/
unsigned char CICCardDlg::ICCard_InB()
{
	unsigned char i,InData = 0;
	for (i = 0;i < 8;i++)
	{
		InData = InData << 1;
		_CardSetClock(1);
		InData = InData + _CardReadIO();
		_CardSetClock(0);
	}

	return InData;
}


/*******************************************************\
|	函数名		ICCard_Read								|
|	函数功能		从IC卡的offset处读出length个字节	|
|	参数			offset	:	IC卡内偏移地址			|
|				length	:	读出数据长度				|
|	返回值		无										|
\*******************************************************/
void CICCardDlg::ICCard_Read(unsigned int offset,unsigned int length)
{
//	chang_4052(3);

	ICCard_Start();

	ICCard_OutB(0xA0+((((unsigned char)(offset>>8))*2)&0x0e));
	ICCard_OutB((unsigned char)offset);
	ICCard_Start();
	ICCard_OutB(0xA1+((((unsigned char)(offset>>8))*2)&0x0e));

	for (pointer = 0 ; pointer < length ; pointer++) 
	{
		ICCard_data[pointer] = ICCard_InB();

		_CardPutIO(0);
		ICCard_Pulse();
		_CardPutIO(1);
	}

	ICCard_Stop();
	for (pointer = 0 ; pointer < 32; pointer++) 
	{
		ICCard_Pulse();	
	}}


void CICCardDlg::OnTimer(UINT nIDEvent) 
{	

	if (nIDEvent==KEY_TIMER)//处理按键输入
	{
	if (keypress==0)
	{
		KillTimer(KEY_TIMER);
		static long myflagnum=0;//用于跟踪调试

		if (mycio.GetGPF0()==1)//IC卡写开始按键,1个字节
		{
			 MessageBox(_T("Write data into IC card succesufully!"));
			keypress=1;
	    ICCard_data[0] = 0x05;
    	ICCard_Write(0,1,8);

		}
		else if (mycio.GetGPF1()==1)//Key4
		{
			keypress=2;
		}
//		else if (mycio.GetGPF3()==1)//Key1
//		{
//			keypress=3;

//		}
//		else if (mycio.GetGPF2()==1)//Key2
//		{
//			keypress=4;
//		
//		}
		else if (mycio.GetGPG0()==1)//IC卡读开始按键,1个字节
		{
			keypress=5;
			 MessageBox(_T("Read data into IC card succesufully!"));
			CWnd* pWnd;
	CICCardDlg* pDlg=(CICCardDlg* )pWnd;
	CEdit * pRecvStrEdit= (CEdit* )pDlg->GetDlgItem(IDC_EDIT4); 
	CString strRecv = ICCard_data[0];

	pRecvStrEdit->SetWindowText(strRecv);
    

//	ICCardPowerOn();//ARM9 的GPIO引脚置高给IC卡供电
	ICCard_Read(0,1);
//	ICCardPowerOff();//ARM9 的GPIO引脚置低给IC卡断电
		}
	SetTimer(KEY_TIMER,KEY_DELAY,NULL);//开始监控按键	
	}//if (keypress==0)	 
	else
	{
		if ((keypress==1)&&(mycio.GetGPF0()==0))
		{
			keypress=0;
		}
//		if ((keypress==2)&&(mycio.GetGPF1()==0))
//		{
//			keypress=0;
//		}
//		if ((keypress==3)&&(mycio.GetGPF3()==0))
//		{
//			keypress=0;
//		}
//		if ((keypress==4)&&(mycio.GetGPF2()==0))
//		{
//			keypress=0;
//		}
		if ((keypress==5)&&(mycio.GetGPG0()==0))
		{
			keypress=0;
		}
		
	}
}	
	
	CDialog::OnTimer(nIDEvent);
}

BOOL CICCardDlg::bInitGpioReg()
{
	mycio.bInitGpioReg();//调用IO类中的初始化函数
	mylcd.bInitLcdReg();//调用LCD类中的初始化函数
	return TRUE;
}
void CICCardDlg::LcdOn()
{	
	//mycio.ClsPOWEREN();//点亮LCD
	mylcd.LcdOn();
}
void CICCardDlg::LcdOff()
{
	//mycio.SetPOWEREN();//关闭LCD
	mylcd.LcdOff();
}

⌨️ 快捷键说明

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