msp430 RFID软件源程序说明文档.docx
- 文档编号:25192032
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:39
- 大小:22.84KB
msp430 RFID软件源程序说明文档.docx
《msp430 RFID软件源程序说明文档.docx》由会员分享,可在线阅读,更多相关《msp430 RFID软件源程序说明文档.docx(39页珍藏版)》请在冰豆网上搜索。
msp430RFID软件源程序说明文档
软件源程序说明
一、主函数源代码
#include"bsp.h"
#include"app.h"
#include"lcd12864.h"
#include"ds1302.h"
#include"key.h"
#include"MFRC522_API.h"
/*局部变量------------------------------------------------------------------*/
uint8_tDisplay_Tmp[16]="";
uint8_tcnt=0;
uint8_tkey_val=0;
/************************************************
函数名称:
main
功能:
主函数入口
参数:
无
返回值:
int
作者:
陈萌
*************************************************/
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
SysColck_Init();//系统时钟配置
Delay_Software(0x100);
LCD12864_Initializes();//LCD12864初始化
DS1302_Initializes();//时钟芯片初始化
RC522SPI_Init();//RC射频芯片初始化
KEY_Initializes();//按键初始化
LCD12864_DisplayString(0x80,"射频IC卡读写系统");
LCD12864_DisplayString(0x99,"按K4注册IC卡");
DS1302_Display();
while
(1)
{
/*1.更新时间*/
cnt++;
if(10<=cnt)
{
cnt=0;
DS1302_Display();
}
/*2.扫描按键*/
if((key_val=KEY_Scan())!
=KEY_NULL)
{
if(KEY_4==key_val)
{
Write_Card();//写入数据
LCD12864_Clear();
LCD12864_DisplayString(0x80,"射频IC卡读写系统");
LCD12864_DisplayString(0x99,"按K4注册IC卡");
cnt=9;
}
}
/*3.射频卡扫描*/
Read_Card();//读出数据
/*4.延时*/
Delay_Software(0x10);
}
}
二、各个模块源代码
2.1按键部分
#include"key.h"
/************************************************
函数名称:
KEY_Initializes
功能:
按键初始化
参数:
无
返回值:
无
作者:
陈萌
*************************************************/
voidKEY_Initializes(void)
{
KEY_DIR;
}
/************************************************
函数名称:
KEY_Scan
功能:
按键扫描
参数:
无
返回值:
按键值
作者:
陈萌
*************************************************/
uint8_tKEY_Scan(void)
{
uint64_ttimes=0;
if(0==(KEY_INVAL&BIT0))
{
while(0==(KEY_INVAL&BIT0))
{
times++;
if(0x60000 { returnKEY_1; } } if(0x1000 { returnKEY_1;//按下了K1键 } } elseif(0==(KEY_INVAL&BIT1)) { while(0==(KEY_INVAL&BIT1)) { times++; if(0x60000 { returnKEY_2; } } if(0x1000 { returnKEY_2;//按下了K2键 } } elseif(0==(KEY_INVAL&BIT2)) { while(0==(KEY_INVAL&BIT2)) { times++; if(0x60000 { returnKEY_3; } } if(0x1000 { returnKEY_3;//按下了K3键 } } elseif(0==(KEY_INVAL&BIT3)) { while(0==(KEY_INVAL&BIT3)) { times++; if(0x60000 { returnKEY_4; } } if(0x1000 { returnKEY_4;//按下了K4键 } } returnKEY_NULL; } 2.2时钟DS1302部分 #include"ds1302.h" /************************************************ 函数名称: DS1302_Write 功能: DS1302写操作 参数: Addr---地址 Data---数据 返回值: 无 作者: 陈萌 *************************************************/ voidDS1302_Write(uint8_tadd,uint8_tdate) { uint8_ttemp,t; RST_L; SCLK_L; RST_H; temp=add; for(t=0;t<8;t++)//写地址 { if((temp&0x01)==1) DIO_H; else DIO_L; SCLK_H; SCLK_L; temp=temp>>1; } temp=date; for(t=8;t>0;t--)//写数据 { if((temp&0x01)==1) DIO_H; else DIO_L; SCLK_H; temp=temp>>1; } RST_L; } /************************************************ 函数名称: DS1302_Read 功能: DS1302读操作 参数: Addr---地址 返回值: 无 作者: 陈萌 *************************************************/ uint8_tDS1302_Read(uint8_tadd) { uint8_ttemp,t; RST_L; SCLK_L; RST_H; temp=add; for(t=0;t<8;t++) { if((temp&0x01)==1) DIO_H; else DIO_L; SCLK_H; temp>>=1; } temp=0; for(t=0;t<7;t++)//读出数 { PX_6_IN;//IO端口设定为输入,进行检测 if((PX_IN&BIT6)==BIT6) temp=temp|0x80; else temp=temp&0x7f; PX_6_OUT;//设定为输出 SCLK_H; SCLK_L; temp>>=1; } returntemp; } /************************************************ 函数名称: DS1302_Initializes 功能: DS1302初始化 参数: 无 返回值: 无 作者: 陈萌 *************************************************/ voidDS1302_Initializes(void) { DS1302_DateTimeTypeDefDS1302_DateTimeStructure; Px_567_OUT;//与DS1302相连接位 SCLK_L; RST_L; DS1302_DateTimeStructure.Year=0x15;//初始化时间BCD: 2015-05-12二12: 00: 00 DS1302_DateTimeStructure.Month=0x05; DS1302_DateTimeStructure.Date=0x25; DS1302_DateTimeStructure.Week=0x01; DS1302_DateTimeStructure.Hour=0x22; DS1302_DateTimeStructure.Minute=0x00; DS1302_DateTimeStructure.Second=0x00; DS1302_Update(DS1302_DateTimeStructure); #endif } 2.3液晶12864部分 #include"lcd12864.h" /************************************************ 函数名称: LCD12864_Busy 功能: LCD12864检测 参数: 无 返回值: 无 作者: 陈萌 *************************************************/ voidLCD12864_Busy(void) { uint8_ttemp; RW_H; _NOP(); RS_L; MCU_DAT_INSET; do { E_H; _NOP(); temp=PXIN; E_L; } while(temp&0x80); _NOP(); E_L; MCU_DAT_OUTSET; } /************************************************ 函数名称: LCD12864_Write 功能: 向12864写数据和指令 参数: dat_comm---指令数据 dat_-------数据 返回值: 无 作者: 陈萌 *************************************************/ voidLCD12864_Write(uint8_tdat_comm,uint8_tdat_) { LCD12864_Busy(); if(dat_comm==1) { RW_L; RS_H; } else { RW_L; RS_L; } PXOUT=dat_; _NOP(); _NOP(); E_H; _NOP(); _NOP(); E_L; } /************************************************ 函数名称: LCD12864_Initializes 功能: 12864初始化 参数: 无 返回值: 无 作者: 陈萌 *************************************************/ voidLCD12864_Initializes(void) { RS_RW_E_EN;//430的12864时序控制口始能 LCD12864_Write(comm,0x30); _NOP(); LCD12864_Write(comm,0x30); _NOP(); LCD12864_Write(comm,0x0c); _NOP(); LCD12864_Write(comm,0x01); _NOP(); LCD12864_Write(comm,0x06); _NOP(); _NOP(); } /************************************************ 函数名称: LCD12864_Clear 功能: 清除屏幕上已显示的内容 参数: 无 返回值: 无 作者: 陈萌 *************************************************/ voidLCD12864_Clear(void) { LCD12864_Write(comm,0x01); } /************************************************ 函数名称: LCD12864_ClearDram 功能: 清除GDRAM中的值 参数: 无 返回值: 无 作者: 陈萌 *************************************************/ voidLCD12864_ClearDram(void) { uint8_ti,j,k; LCD12864_Write(comm,0x30); LCD12864_Write(comm,0x34); i=0x80; for(j=0;j<32;j++) { LCD12864_Write(comm,i++);//先写y地址 LCD12864_Write(comm,0x80);//再写x地址 for(k=0;k<16;k++) { LCD12864_Write(dat,0x00); } } i=0x80; for(j=0;j<32;j++) { LCD12864_Write(comm,i++); LCD12864_Write(comm,0x88); for(k=0;k<16;k++) { LCD12864_Write(dat,0x00); } } LCD12864_Write(comm,0x30); } /************************************************ 函数名称: LCD12864_DisplayNChar 功能: 显示N个字符 参数: addr--显示位置的首地址 pt--指向显示数据的指针 num--显示字符个数 返回值: 无 作者: 陈萌 *************************************************/ voidLCD12864_DisplayNChar(uint8_taddr,uint8_t*pt,uint8_tnum) { uint8_ti; LCD12864_Write(comm,0x30); LCD12864_Write(comm,addr); for(i=0;i<(num*2);i++) LCD12864_Write(dat,*(pt++)); } /************************************************ 函数名称: LCD12864_DisplayString 功能: 显示字符串 参数: addr--显示位置的首地址 返回值: 无 作者: 陈萌 *************************************************/ voidLCD12864_DisplayString(uint8_taddress,uint8_t*table) { LCD12864_Write(comm,0x30); LCD12864_Write(comm,address); while(*table! ='\0') { LCD12864_Write(dat,*table); table++; } } 2.4射频IC卡部分 /***************************************************** **@函数名: RC522SPI_Init **@描述: RC522模拟SPI接口初始化配置 **@参数: 无 **@返回值: 无 *****************************************************/ voidRC522SPI_Init(void) { P4DIR|=BIT0+BIT1+BIT2+BIT4; P4DIR&=~BIT3;//MISO } /***************************************************** **@函数名: SPIReadByte **@描述: RC522模拟SPI接口SPI读数据 **@参数: 无 **@返回值: 无 *****************************************************/ uint8_tSPIReadByte(void) { uint8_tSPICount=0; uint8_tSPIData=0; SPIData=0; for(SPICount=0;SPICount<8;SPICount++) { SPIData<<=1; CLR_SPI_SCK; __nop(); __nop(); if(STU_SPI_MISO) { SPIData|=0x01; } SET_SPI_SCK; __nop(); __nop(); } returnSPIData; } /***************************************************** **@函数名: SPIWriteByte **@描述: RC522模拟SPI接口SPI写数据 **@参数: 无 **@返回值: 无 *****************************************************/ voidSPIWriteByte(uint8_tSPIData) { uint8_tSPICount;//Counterusedtoclockoutthedata for(SPICount=0;SPICount<8;SPICount++) { if(SPIData&0x80){ SET_SPI_MOSI; }else{ CLR_SPI_MOSI; } __nop(); __nop(); CLR_SPI_SCK; __nop(); __nop(); SET_SPI_SCK; __nop(); __nop(); SPIData<<=1; } } int8_tPcdRequest(uint8_treq_code,uint8_t*pTagType) { int8_tstatus; uint16_tunLen; uint8_tucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08); WriteRawRC(BitFramingReg,0x07);//定义接收LSB放在bit0,发送的最后一个字节位数7bit SetBitMask(TxControlReg,0x03);//设置TX1、TX2发送经13.56MHz调制载波 ucComMF522Buf[0]=req_code; status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen); if((status==MI_OK)&&(unLen==0x10))//接收卡发回来的数据字节数16Byte { *pTagType=ucComMF522Buf[0]; *(pTagType+1)=ucComMF522Buf[1]; } else { status=MI_ERR; } returnstatus; } /***************************************************** **@函数名: PcdAnticoll **@描述: 防冲撞 **@参数: pSnr[OUT]: 卡片序列号,4字节 **@返回值: 成功返回MI_OK *****************************************************/ int8_tPcdAnticoll(uint8_t*pSnr) { int8_tstatus; uint8_ti,snr_check=0; uint16_tunLen; uint8_tucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08); WriteRawRC(BitFramingReg,0x00);//暂停数据发送 //接收LSB放在bit0位上 //最后一个字节所有位都发送 ClearBitMask(CollReg,0x80);//所以接收的位在位冲突后都将清零 ucComMF522Buf[0]=PICC_ANTICOLL1;//防冲撞指令代码 ucComMF522Buf[1]=0x20;//? //发送并接收数据指令 status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- msp430 RFID软件源程序说明文档 RFID 软件 源程序 说明 文档