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

📄 comm.c

📁 由华邦单片机w78e516bc1来控制RC531设计的一款读写器
💻 C
字号:
/****************************************************************/
/* 	通信及部分通用模块程序
/* 	主要功能,子程序
/* 	1、EEPROM读写子程序
/* 	2、与MCU通信处理子程序
/* 
/* 	编制:yanshouli
/* 	时间:
/* 
/* 	修改:王文清
/* 	时间:2003年9月
/****************************************************************/

#include <reg51.h>
#include <absacc.h>
#include <intrins.h>
#include "main.h"
#include "comm.h"
#include "globe.h"
#include "lcd.h"
#include "rc531.h"

//本地私有函数原型定义
/*
uchar load_key(uchar mode,uchar Secnr);
void Proc_FrameBCC(void);
void Proc_FrameHead(void);
void Proc_error(uchar num);
void Proc_Normal(void);
void Proc_HL_decincrement(void);
void Proc_HL_write(void);
void Proc_HL_read(void);
void Proc_HL_initval(void);
void Proc_Request(void);
void Proc_Anticoll(void);
void Proc_Select(void);
void Proc_Read(void);
void Proc_Write(void);
void Proc_Read_key(void);
void Proc_Getinfo(void);
void Proc_rewre2p(uchar len,uchar addr);
*/

/****************************************************************/
/* 函数名:Disp_Result														*/
/* 功能说明:在液晶上显示各命令执行情况										*/
/* 入口参数:COMD_TYPE:命令类型,status:执行状态								*/
/* 出口参数:N/A															*/
/* 时间:  																*/
/* 作者:  																*/
/****************************************************************/

void Disp_Result(uchar COMD_TYPE,uchar status)
{	uchar i;
	Curcol=0;
	Curlin=1;
	switch (COMD_TYPE)
	{
		case CMD_HL_DECREMENT:					//高级减值命令0x30
			
			break;
		
		case CMD_HL_INCREMENT:					//高级增值命令0x31
			
			break;

		case CMD_HL_WRITE:						//高级写命令0x32
	
			break;

		case CMD_HL_READ:						//高级读命令0x33

			break;

		case CMD_HL_INITVAL:					//高级初始化值命令0x34
			
			break;								//返回

		case CMD_WRITECARDTYPE:					//写卡类别命令0x38
			
			break;								//返回

		case CMD_READCARDTYPE:					//读卡类别命令0x39
		
			break;								//返回


		case CMD_REQUEST:						//发出询问命令检查在有效范围内是否有卡存在 0x41 
			InitLCD();
			Show_Str(Curlin, Curcol, req_str);
			Curcol=Curcol+2;
			if (status==FM222_OK)
				Show_Str(Curlin,Curcol, ok_str);
			else 
			{	Show_Str(Curlin, Curcol, err_str);
				Curcol=Curcol+1;
				Disp_Hex(Curlin, Curcol,status);
			}
			break;								//返回

		case CMD_ANTICOLL:						//开始防冲突操作返回卡的序号0x42 
			InitLCD();
			Show_Str(Curlin, Curcol, anticoll_str);
			Curcol=Curcol+2;
			if (status==FM222_OK)
			{	Show_Str(Curlin,Curcol, ok_str);
				Curlin=Curlin+1;
				Curcol=0;
				Show_Str(Curlin, Curcol, uids_str);
				Curcol=Curcol+2;
				for (i=0;i<4;i++)
				{
					Disp_Hex(Curlin, Curcol,UID[i]);
					Curcol=Curcol+2;
				}
			}
			else 
			{	Show_Str(Curlin, Curcol, err_str);
				Curcol=Curcol+1;
				Disp_Hex(Curlin, Curcol,status);
			}
			break;								//返回

		case CMD_SELECT:						//选择卡返回卡的存贮容量 0x43
			InitLCD();
			Show_Str(Curlin, Curcol, select_str);
			Curcol=Curcol+2;
			if (status==FM222_OK)
				Show_Str(Curlin, Curcol, ok_str);
			else 
			{
				Show_Str(Curlin, Curcol, err_str);
				Curcol=Curcol+1;
				Disp_Hex(Curlin, Curcol,status);
			}
			break;								//否则返回结果信息包	 

		case CMD_AUTHENTICATION:				//开始验证操作 0x44
			InitLCD();
			Show_Str(Curlin, Curcol, authent_str);
			Curcol=Curcol+2;
			if (status==FM222_OK)
				Show_Str(Curlin, Curcol, ok_str);
			else 
			{
				Show_Str(Curlin, Curcol, err_str);
				Curcol=Curcol+1;
				Disp_Hex(Curlin, Curcol,status);
			}
			break;

		case CMD_HALT:							//将卡置于挂起模式0x45
			InitLCD();
			Show_Str(Curlin, Curcol, halt_str);
			Curcol=Curcol+2;
			if (status==FM222_OK)
				Show_Str(Curlin, Curcol, ok_str);
			else 
			{
				Show_Str(Curlin, Curcol, err_str);
				Curcol=Curcol+1;
				Disp_Hex(Curlin, Curcol,status);
			}	
			break;

		case CMD_READ:							//从卡中相应地址中读出一个16字节的块0x46
			InitLCD();
			Show_Str(Curlin, Curcol, read_str);
			Curcol=Curcol+2;
			if (status==FM222_OK)
			{	Show_Str(Curlin,Curcol, ok_str);
				Curlin=Curlin+1;
				Curcol=0;
//				Show_Str(Curlin, Curcol, uids_str);
//				Curcol=Curcol+2;
				for (i=0;i<16;i++)
				{
					if (Curcol==16)
					{
						Curlin=Curlin+1;
						Curcol=0;
					} 
					Disp_Hex(Curlin, Curcol,readdata[i]);
					Curcol=Curcol+2;
				}
			}
			else 
			{	Show_Str(Curlin, Curcol, err_str);
				Curcol=Curcol+1;
				Disp_Hex(Curlin, Curcol,status);
			}
			break;

		case CMD_WRITE: 						//向卡中相应地址写入一16 字节的数据块0x47
			InitLCD();
			Show_Str(Curlin, Curcol, write_str);
			Curcol=Curcol+2;
			if (status==FM222_OK)
				Show_Str(Curlin, Curcol, ok_str);
			else 
			{
				Show_Str(Curlin, Curcol, err_str);
				Curcol=Curcol+1;
				Disp_Hex(Curlin, Curcol,status);
			}	
			break;

		case CMD_INITVAL:					//低级初始化值命令0x50
			InitLCD();
			Show_Str(Curlin, Curcol, initival_str);
			Curcol=Curcol+2;
			if (status==FM222_OK)
				Show_Str(Curlin,Curcol, ok_str);
			else 
			{	Show_Str(Curlin, Curcol, err_str);
				Curcol=Curcol+1;
				Disp_Hex(Curlin, Curcol,status);
			}
							
			break;								//返回

		case CMD_INCREMENT: 					//低级增值命令0x48
			InitLCD();
			Show_Str(Curlin, Curcol, increment_str);
			Curcol=Curcol+1;
			if (status==FM222_OK)
				Show_Str(Curlin,Curcol, ok_str);
			else 
			{	Show_Str(Curlin, Curcol, err_str);
				Curcol=Curcol+1;
				Disp_Hex(Curlin, Curcol,status);
			}
							
			break;

		case CMD_DECREMENT: 					//低级减值命令0x49
			
			InitLCD();
			Show_Str(Curlin, Curcol, decrement_str);
			Curcol=Curcol+1;
			if (status==FM222_OK)
				Show_Str(Curlin,Curcol, ok_str);
			else 
			{	Show_Str(Curlin, Curcol, err_str);
				Curcol=Curcol+1;
				Disp_Hex(Curlin, Curcol,status);
			}
			break;				

		case CMD_RESTORE:		//将所访问单元块的字节数保存在卡的内部寄存器中0x4A
			
			InitLCD();
			Show_Str(Curlin, Curcol, restore_str);
			Curcol=Curcol+1;
			if (status==FM222_OK)
				Show_Str(Curlin,Curcol, ok_str);
			else 
			{	Show_Str(Curlin, Curcol, err_str);
				Curcol=Curcol+1;
				Disp_Hex(Curlin, Curcol,status);
			}
			break;				

		case CMD_TRANSFER:		//将卡内部寄存器的内容转输到访问快的字节数0x4B
			
			InitLCD();
			Show_Str(Curlin, Curcol, transfer_str);
			Curcol=Curcol+1;
			if (status==FM222_OK)
				Show_Str(Curlin,Curcol, ok_str);
			else 
			{	Show_Str(Curlin, Curcol, err_str);
				Curcol=Curcol+1;
				Disp_Hex(Curlin, Curcol,status);
			}
			break;				

		case CMD_LOADKEY:			   	//下载密码0x4C
			InitLCD();
			Show_Str(Curlin, Curcol, loadkey_str);
			Curcol=Curcol+2;
			if (status==FM222_OK)
				Show_Str(Curlin, Curcol, ok_str);
			else 
			{
				Show_Str(Curlin, Curcol, err_str);
				Curcol=Curcol+1;
				Disp_Hex(Curlin, Curcol,status);
			}
			break;

		case CMD_READKEY:					//读密码0x4D
		
			break;

		case CMD_RESET: 					//关闭天线输出数ms 使卡复位0x4E

			break;

		case CMD_GETINFO:					//读取固件信息FM222序列号0x4F
			
			break;

		case CMD_READE2P:					//读FM222 内EEPROM 的内容0x61 
			
			break;

		case CMD_WRITEE2P:					//写数据到FM222内EEPROM0x62
		
			break;

		default:
		
			break;
	}					

}




/****************************************************************/
/* 函数名:write_eeprom													*/
/* 功能说明:写EEPROM子程序												*/
/* 入口参数:address:要写的地址,e2data:要写的数据								*/
/* 出口参数:N/A															*/
/* 时间:  																*/
/* 作者:  	该函数暂时保留												*/
/****************************************************************/
void write_eeprom(uint address,uchar e2data)
{
//	while (EEWE)
		;
//	EEAR = address;
//	EEDR = e2data;
//	EEMWE = 1;			//EEPROM主写使能
//	EEWE = 1;			//EEPROM写入使能
}

/****************************************************************/
/* 函数名:read_eeprom													*/
/* 功能说明:读EEPROM子程序												*/
/* 入口参数:address														*/
/* 出口参数:数据值														*/
/* 时间:  																*/
/* 作者:  		该函数暂时保留															*/
/****************************************************************/
uchar read_eeprom(uint address)
{
//	while (EEWE)
//		;
//	EEAR = address;
//	EERE = 1;			//EEPROM读取使能
//	return(EEDR);
	return(1);
}

/****************************************************************/
/* 函数名:load_key														*/
/* 功能说明:下载密码														*/
/* 入口参数:mode:密码模式,Secnr:扇区号										*/
/* 出口参数:FM222_OK:下载密码成功,其他:失败									*/
/* 时间:  																*/
/* 作者:  																*/
/*说明:  mode总为0,密码存在RC531 EEPROM中,起始地址为0X0080,				*/
/*			存放地址=起始地址+secnr*12										*/
/*		 																*/
/****************************************************************/
uchar load_key(uchar idata *key, uchar mode,uchar Secnr)
{                
	uchar i;
	uchar temp;
	uchar ln=0;
	uchar hn=0;
	uchar msb=0,lsb;
	temp = Secnr * 12;
	//authmode=mode;
	if (mode==0) 
	{
		if (temp>=0x80)							//计算密码存放地址
		{
			msb=0x01;
			lsb=temp-0x80;
		}
		else
		{
			msb=0x00;
			lsb=temp+0x80;
		}
	}
	else
	{
		msb=0x01;
		lsb=temp+0x40;
	}
	
	for(i = 0; i < 6; i++)						//密码转换成RC531密码格式

⌨️ 快捷键说明

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