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

📄 24c16.c

📁 IC卡(24C16)读写源程序(基于KT8808, x86兼容)
💻 C
字号:

/**************************************************
*                 24c16卡读写操作
*
**************************************************/
#include "includes.h"
#include "TextEdit.h"
#include "24c16.h"
#include "disp.h"

INT8 at24c16_sda_h;
INT8 at24c16_sda_l;
INT8 at24c16_scl_h;
INT8 at24c16_scl_l;

extern LINETAB TextLineTab;
extern INT8U inputstate;
extern TEXT text;
INT8U SDA(void);
extern void DelayMs(unsigned int number);
extern void Edit(TEXT *t, INT16U kv);
extern void DispTime(void);
extern void ClearARow(INT8U row, LINETAB *ltp, INT16U att);
extern void EditGoods(void);
extern void SwitchInput(INT8U type);
extern void InitText(void);
extern void OpenCursor(INT8U crs);
//=======================================
//功能:对24c16卡读写操作
//时间:2004-5-28 17:47
//作者: LEEYC
//======================================

/*-----------------------------------------------
//功能:端口初始化
//
//
//---------------------------------------------*/
void InitPort_IC1(void)
{
	at24c16_sda_h = AT24C16_1_SDA_H;
	at24c16_sda_l = AT24C16_1_SDA_L;
	at24c16_scl_h = AT24C16_1_SCL_H;
	at24c16_scl_l = AT24C16_1_SCL_L;
}

void InitPort_IC2(void)
{
	at24c16_sda_h = AT24C16_2_SDA_H;
	at24c16_sda_l = AT24C16_2_SDA_L;
	at24c16_scl_h = AT24C16_2_SCL_H;
	at24c16_scl_l = AT24C16_2_SCL_L;
}

/*-----------------------------------------------
调用方式:void start_bit(void)
函数说明:开始位
-----------------------------------------------*/
void start_bit(void)
{
	SCL_1;
	SDA_1;
	SDA_0;
	SCL_0;
}
/*-----------------------------------------------
调用方式:void stop_bit(void)
函数说明:停止位
-----------------------------------------------*/
void stop_bit(void)
{
	SCL_0;
	SDA_0;
	SCL_1;
	SDA_1;
}
/*-----------------------------------------------
调用方式:void mast_ack(void)
函数说明:主答函数
-----------------------------------------------*/
void mast_ack(void)
{
	SCL_0;
	SDA_0;
	SCL_1;
	SCL_0;
	SDA_1;
}
/*-----------------------------------------------
调用方式:void ack(void)
函数说明:应答函数
-----------------------------------------------*/
void ack(void)
{
	SDA_1;
	SCL_0;
	SCL_1;
	while(SDA()){;}
	SCL_0;
}
/*-----------------------------------------------
调用方式:void no_ack(void)
函数说明:无需应答位,在读程序中用到
-----------------------------------------------*/
void no_ack(void)
{
	SDA_1;
	SCL_1;
	while(SDA()){;}
	SCL_0;
}
/*-----------------------------------------------
调用方式:write_8bit(uchar ch)
函数说明:写一个字节(8位)数据
-----------------------------------------------*/
void write_8bit(uchar ch)
{
	uchar i=8;
	
	SCL_0;
	while(i--)
	{
		if(ch&0x80){
			SDA_1;
		}
		else{
			SDA_0;
		}
		ch<<=1;
		SCL_1;
		SCL_0;
	}
}
/*----------------------------------------------
调用方式:uchar read24c16(uint address)
函数说明:读24c16指定地址数据(字节读)
-----------------------------------------------*/
uchar read24c16(uint address)
{
	uchar rdata, block;
	uchar i=8;
	
	rdata = 0;
	block = highbyte(address);
	block &= 7;
	block <<= 1;
	start_bit();
	write_8bit(0xA0|block);
	ack();
	write_8bit(address);
	ack();//伪写
	start_bit();
	write_8bit(0xA1|block);
	ack();
	while(i--)
	{
		rdata<<=1;
		SCL_0;
		SCL_1;
		if(SDA()) rdata|=0x01;
	}
	no_ack();
	stop_bit();
	return rdata;
}
/*-----------------------------------------------
调用方式:void write24c16(uint address,uchar ddata)
函数说明:写数据到24c16的指定地址(字节写)
-----------------------------------------------*/
void write24c16(uint address,uchar ddata)
{
	uchar block;
	
	block = highbyte(address);
	block &= 7;
	block <<= 1;
	start_bit();
	write_8bit(0xA0|block);
	ack();
	write_8bit(address);
	ack();
	write_8bit(ddata);
	ack();
	stop_bit();
	DelayMs(5);
}

/*-----------------------------------------------
调用方式:void page_wr(uint firstw_ad,uint counter,uint data *firstr_ad)
函数说明:页面写函数,firstw_ad为写入字节单元的首地址,
*firstr-ad为被写入数据所在首地址指针
counter为写入数据字节数
-----------------------------------------------*/
void page_wr(uint firstw_ad,uint counter,uchar *firstr_ad)
{
	uchar *ufirstr_ad, block;
	
	ufirstr_ad=firstr_ad;
	block = firstw_ad>>8;
	block &= 7;
	block <<= 1;
	start_bit();
	write_8bit(0xA0|block);
	ack();
	write_8bit(firstw_ad);
	ack();
	while(counter--)
	{
		write_8bit(*ufirstr_ad);
		ack();
		ufirstr_ad++;
	}
	stop_bit();
	DelayMs(10);
}
/*-----------------------------------------------
调用方式:void page_rd(uint firstrd_ad,uint count,uint firstwr_ad)
函数说明:页面读函数,firstrd-ad为所读字节首地址,count为读字节数
*ufirstwr-ad为读出数据存储首地址指针
-----------------------------------------------*/
void page_rd(uint firstrd_ad,uint count,uchar *firstwr_ad)
{
	uchar i=8, block;
	uchar *ufirstwr_ad;
	
	ufirstwr_ad=firstwr_ad;
	block = highbyte(firstrd_ad);
	block &= 7;
	block <<= 1;
	start_bit();
	write_8bit(0xA0|block);
	ack();
	write_8bit(firstrd_ad);
	ack();
	start_bit();
	write_8bit(0xA1|block);
	ack();
	while(count--){
		i = 8;
		while(i--){
			(*ufirstwr_ad)<<=1;
			SCL_0;
			SCL_1;
			if(SDA()) (*ufirstwr_ad)|=0x01;
		}
		ufirstwr_ad++;
		if(count){
			mast_ack();
		}
		else{
			no_ack();
			stop_bit();
		}
	}
}

INT8U SDA(void)
{
	INT8U sda;
	
	outportb(AT24C16_PORT, AT24C16_DAT); \
	sda = inportb(AT24C16_PORT+1) & at24c16_sda_h;
	return sda;
}


void WriteICCard(void)
{
	TEXT *t;
	INT8U *cp, page;
	INT16 i;
	
	SwitchInput(inputstate);
	EditGoods();
	t = &text;
	cp = t->TextBuff[1];
	page = 0;
	for(i=0;i<12;i++){
		page_wr(page*16, 16, cp);
		page++;
		cp += 16;
	}
	ClearARow(MAXLINE, &TextLineTab, DISP_REVERSE|DISP_CHARSET);
	DispTime();
}

void ReadICCard(void)
{
	INT8U page, c[16], maxpage;
	INT8U c_flag;
	INT16U chcode;
	int i, j;
	
	chcode = 0;
	c_flag = 0;
	InitText();
	Edit(&text, 0x0d);
	maxpage = (ROW-1)*COL/16;
	OpenCursor(0);
	for(page=i=0;i<maxpage;i++, page++){
		page_rd(page*16, 16, c);
		for(j=0;j<16;j++){
			if(c_flag){
				chcode |= (c[j]<<8);	
				c_flag = 0;
				Edit(&text, chcode);
			}
			else if(c[j]>0x80){
				c_flag = 1;
				chcode = c[j];
			}
			else
				Edit(&text, c[j]);
		}
	}
}

⌨️ 快捷键说明

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