
int A=0xCCBB
int SAVE
char B,C
SAVE=A //将A暂存
A=A&0x00FF //屏蔽高8位
B=(char)A //B中的数据为0xBB(低8位)
A=SAVE //将暂存的数据返回
A=A&0xFF00 //屏蔽低8位(这句可以省掉,在下句右移时高位就全部移入0)
A=A>>8 //右移8位,将高8位移到低8位
C=(char)A //C中的数据为0xCC(高8位)
void LCD_write_bianliang(INT8U row,INT8U page,INT8U a,int c) //row:列 page:页 c:变量{
int a1,a2,a3
a1=c/100
a2=c%100/10
a3=c%10
if(a==1)
{
LCD_write_shu(row,page,a3)
}
else if(a==2)
{
LCD_write_shu(row,page,a2)
LCD_write_shu(row+1,page,a3)
}
else
{
LCD_write_shu(row,page,a1)
LCD_write_shu(row+1,page,a2)
LCD_write_shu(row+2,page,a3)
}
}
/*-------------------------------------------------------------
LCD_write_shu: 显示8(宽)*16(高)点阵列数字字母符号等半角类
输入参数: c:显示的字符;
---------------------------------------------------------------*/
void LCD_write_shu(INT8U row,INT8U page,INT8U c) //row:列 page:页 c:字符
{
INT8U i
LCD_set_XY(row*8,page)// 列,页 row*8
for(i=0i<8i++)
{
LCD_write_word(shuzi[c][i],1)
}
LCD_set_XY(row*8,page+1)// 列,页row*8
for(i=8i<16i++)
{
LCD_write_word(shuzi[c][i],1)
}
}
/*---------------------------------------------
LCD_write_hanzi: 显示16(宽)*16(高)点阵列汉字等半角类
输入参数:c:显示的字符;
-----------------------------------------------*/
void LCD_write_hanzi(INT8U row, INT8U page,INT8U c) //row:列 page:页 c:字符
{
INT8U i
LCD_set_XY(row*8, page)// 列,页row*8
for(i=0i<16i++)
{
LCD_write_word(hanzi[c][i],1)
}
LCD_set_XY(row*8, page+1)// 列,页 row*8
for(i=16i<32i++)
{
LCD_write_word(hanzi[c][i],1)
}
}
其中有一段是显示变量的,那个时候简单写的,你试试看
#include "apprfid.h"#include "CMDHEAD.h"
#if USE_UART
#include "../uart/uart.h"
#else
#include "../softuart/softuart.h"
#endif
//发送命令
//命令格式为 [AA] [BB] + [长度字] +[命令字] + [数据域] + [校验码]
//这个文件打包了所有底层指令
//包含,读卡,写卡
//初始化钱包,钱包的增值,扣款等
//修改密钥的做法和写卡是同一回事,因此没有额外指出
//注意密钥是存放在每个扇区的第三个块,也就是BLOCK3中
//因此改密钥实际上就是用老密钥读取要修改密钥的第三个块
//然后把新密钥替换读取的数据,然后用老密钥写回
//写成功之后,再读写该扇区其它块,就需要使用新的密钥
//本文件最后做了示例
//本文只描述了将命令打包发送给模块
//并没有分析模块返回来的数据
//模块返回数据建议用户自行构建一个串口中断函数
//中断函数完成对数据帧的接受
//首先判断 AA BB 标志,接收到后清零缓冲区
//第一个字节是数据包的长度,依据这个来读取相应的长度
//第一个长度字之后连续读取长度字对应的长度数据,
//最后一个字节是校验码,校验函数在下面有
//如果校验通过,设置一个命令成功接受的标志,让主程序进行处理
//否则重新接受串口数据
u8 __idata cmdbuf[32]//需要发送的命令缓冲区
//crc校验
u8 CheckSum(u8 *databuf)
{
u8 tmp = databuf[0]-1
u8 chksum=databuf[0]
while(tmp)
{
chksum^=databuf[tmp]
tmp--
}
if(databuf[databuf[0]]==chksum) return 1
else
databuf[databuf[0]]=chksum
return 0
}
//发送结果给上位机
void cmd_proend(void)
{
u8 tmp
CheckSum(cmdbuf)//先做校验
sputc(0xAA)
sputc(0xBB)
//下面把结构中所有的数据都发送出去
for(tmp=0tmp<cmdbuf[0]+1tmp++)
{
sputc(cmdbuf[tmp])
if(cmdbuf[tmp]==0xAA)//如果数据域中有0XAA,再发个零跟着
{
sputc(0)
}
}
}
//获得模块ID
void getmoduleID(void)
{
cmdbuf[0] = 2//长度字
cmdbuf[1] = PCD_PN//命令类型,读头序列号
cmd_proend()
}
//寻卡
void SelCard(void)
{
cmdbuf[0] = 02//长度字
cmdbuf[1] = CARD_TYPE//命令类型,读卡类型
cmd_proend()
}
//读卡号
void ReadUID(void)
{
cmdbuf[0] = 02//长度字
cmdbuf[1] = CARD_SN//命令类型,读卡号
cmd_proend()
}
//读块
void ReadBlock(u8 blockn,u8 *key)
{
u8 tmp
cmdbuf[0] = 0x0a//长度字
cmdbuf[1] = READ_BLOCK//命令类型,读块
cmdbuf[2] = 0x00//密钥标志,TYPEA
cmdbuf[3] = blockn//块号
for(tmp=0tmp<6tmp++)
cmdbuf[4+tmp] = key[0+tmp]//6字节密钥
cmd_proend()
}
//写块
void WriteBlock(u8 blockn,u8 *buf,u8 *key)
{
u8 tmp
cmdbuf[0] = 0x1a//长度字
cmdbuf[1] = WRITE_BLOCK//命令类型,写块
cmdbuf[2] = 0x00//密钥标志,TYPEA
cmdbuf[3] = blockn//块号
for(tmp=0tmp<6tmp++)
cmdbuf[4+tmp] = key[0+tmp]//6字节密钥
for(tmp=0tmp<16tmp++)
cmdbuf[10+tmp] = buf[0+tmp]//16字节数据
cmd_proend()
}
//初始化钱包
void Init_PURSE(u8 blockn,u8 *buf,u8 *key)
{
u8 tmp
cmdbuf[0] = 0x0e//长度字
cmdbuf[1] = INIT_PURSE//命令类型,初始化钱包
cmdbuf[2] = 0x00//密钥标志,TYPEA
cmdbuf[3] = blockn//块号
for(tmp=0tmp<6tmp++)
cmdbuf[4+tmp] = key[0+tmp]//6字节密钥
for(tmp=0tmp<4tmp++)
cmdbuf[10+tmp] = buf[0+tmp]//16字节数据
cmd_proend()
}
//钱包充值
void Add_PURSE(u8 blockn,u8 *buf,u8 *key)
{
u8 tmp
cmdbuf[0] = 0x0e//长度字
cmdbuf[1] = ADD_PURSE//命令类型,初始化钱包
cmdbuf[2] = 0x00//密钥标志,TYPEA
cmdbuf[3] = blockn//块号
for(tmp=0tmp<6tmp++)
cmdbuf[4+tmp] = key[0+tmp]//6字节密钥
for(tmp=0tmp<4tmp++)
cmdbuf[10+tmp] = buf[0+tmp]//16字节数据
cmd_proend()
}
//钱包扣款
void Dec_PURSE(u8 blockn,u8 *buf,u8 *key)
{
u8 tmp
cmdbuf[0] = 0x0e//长度字
cmdbuf[1] = DEC_PURSE//命令类型,初始化钱包
cmdbuf[2] = 0x00//密钥标志,TYPEA
cmdbuf[3] = blockn//块号
for(tmp=0tmp<6tmp++)
cmdbuf[4+tmp] = key[0+tmp]//6字节密钥
for(tmp=0tmp<4tmp++)
cmdbuf[10+tmp] = buf[0+tmp]//16字节数据
cmd_proend()
}
/*
//需要改哪个区块的密码
//clus 扇区号0-15,一共16个扇区,0号原则上不动
u8 CHG_PWD(u8 clus,u8 *oldkey,u8 *newkey, u8 keystyle)
{
u8 cardsn[6]//前两位ID,后四位sn
u8 blockdata[64]={0xff}//16个返回的数据
u8 tmp//
if(clus >15) return 1//扇区号不对
if(Read_Block((clus+1)*4-1,oldkey,blockdata,keystyle)) return 3//首先读到密码
for(tmp=0tmp<6tmp++)
{
blockdata[tmp]=newkey[tmp]//密码替换
}
if(Write_Block((clus+1)*4-1,oldkey,blockdata,keystyle)) return 4//密码更新
return 0
}
*/
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)