📄 comm.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 + -