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;
}
/*2.扫描按键*/
if((key_val=KEY_Scan())!
=KEY_NULL)
if(KEY_4==key_val)
Write_Card();//写入数据
LCD12864_Clear();
cnt=9;
/*3.射频卡扫描*/
Read_Card();//读出数据
/*4.延时*/
Delay_Software(0x10);
二、各个模块源代码
2.1按键部分
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;elseDIO_L;SCLK_H;SCLK_L;temp=temp>>1;}temp=date;for(t=8;t>0;t--)//写数据{if((temp&0x01)==1)DIO_H;elseDIO_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;elseDIO_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;elsetemp=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:00DS1302_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;//Counterusedtoclockoutthedatafor(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,发送的最后一个字节位数7bitSetBitMask(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
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;elseDIO_L;SCLK_H;SCLK_L;temp=temp>>1;}temp=date;for(t=8;t>0;t--)//写数据{if((temp&0x01)==1)DIO_H;elseDIO_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;elseDIO_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;elsetemp=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:00DS1302_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;//Counterusedtoclockoutthedatafor(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,发送的最后一个字节位数7bitSetBitMask(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
returnKEY_1;//按下了K1键
elseif(0==(KEY_INVAL&BIT1))
while(0==(KEY_INVAL&BIT1))
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;elseDIO_L;SCLK_H;SCLK_L;temp=temp>>1;}temp=date;for(t=8;t>0;t--)//写数据{if((temp&0x01)==1)DIO_H;elseDIO_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;elseDIO_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;elsetemp=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:00DS1302_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;//Counterusedtoclockoutthedatafor(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,发送的最后一个字节位数7bitSetBitMask(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
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;elseDIO_L;SCLK_H;SCLK_L;temp=temp>>1;}temp=date;for(t=8;t>0;t--)//写数据{if((temp&0x01)==1)DIO_H;elseDIO_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;elseDIO_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;elsetemp=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:00DS1302_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;//Counterusedtoclockoutthedatafor(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,发送的最后一个字节位数7bitSetBitMask(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
returnKEY_2;//按下了K2键
elseif(0==(KEY_INVAL&BIT2))
while(0==(KEY_INVAL&BIT2))
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;elseDIO_L;SCLK_H;SCLK_L;temp=temp>>1;}temp=date;for(t=8;t>0;t--)//写数据{if((temp&0x01)==1)DIO_H;elseDIO_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;elseDIO_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;elsetemp=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:00DS1302_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;//Counterusedtoclockoutthedatafor(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,发送的最后一个字节位数7bitSetBitMask(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
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;elseDIO_L;SCLK_H;SCLK_L;temp=temp>>1;}temp=date;for(t=8;t>0;t--)//写数据{if((temp&0x01)==1)DIO_H;elseDIO_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;elseDIO_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;elsetemp=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:00DS1302_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;//Counterusedtoclockoutthedatafor(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,发送的最后一个字节位数7bitSetBitMask(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
returnKEY_3;//按下了K3键
elseif(0==(KEY_INVAL&BIT3))
while(0==(KEY_INVAL&BIT3))
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;elseDIO_L;SCLK_H;SCLK_L;temp=temp>>1;}temp=date;for(t=8;t>0;t--)//写数据{if((temp&0x01)==1)DIO_H;elseDIO_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;elseDIO_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;elsetemp=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:00DS1302_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;//Counterusedtoclockoutthedatafor(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,发送的最后一个字节位数7bitSetBitMask(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
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;elseDIO_L;SCLK_H;SCLK_L;temp=temp>>1;}temp=date;for(t=8;t>0;t--)//写数据{if((temp&0x01)==1)DIO_H;elseDIO_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;elseDIO_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;elsetemp=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:00DS1302_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;//Counterusedtoclockoutthedatafor(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,发送的最后一个字节位数7bitSetBitMask(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
returnKEY_4;//按下了K4键
returnKEY_NULL;
2.2时钟DS1302部分
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;
temp=temp>>1;
temp=date;
for(t=8;t>0;t--)//写数据
DS1302_Read
DS1302读操作
uint8_tDS1302_Read(uint8_tadd)
for(t=0;t<8;t++)
temp>>=1;
temp=0;
for(t=0;t<7;t++)//读出数
PX_6_IN;//IO端口设定为输入,进行检测
if((PX_IN&BIT6)==BIT6)
temp=temp|0x80;
temp=temp&0x7f;
PX_6_OUT;//设定为输出
returntemp;
DS1302_Initializes
DS1302初始化
voidDS1302_Initializes(void)
DS1302_DateTimeTypeDefDS1302_DateTimeStructure;
Px_567_OUT;//与DS1302相连接位
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部分
LCD12864_Busy
LCD12864检测
voidLCD12864_Busy(void)
uint8_ttemp;
RW_H;
_NOP();
RS_L;
MCU_DAT_INSET;
do
E_H;
temp=PXIN;
E_L;
while(temp&0x80);
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;
PXOUT=dat_;
LCD12864_Initializes
12864初始化
voidLCD12864_Initializes(void)
RS_RW_E_EN;//430的12864时序控制口始能
LCD12864_Write(comm,0x30);
LCD12864_Write(comm,0x0c);
LCD12864_Write(comm,0x01);
LCD12864_Write(comm,0x06);
LCD12864_Clear
清除屏幕上已显示的内容
voidLCD12864_Clear(void)
LCD12864_ClearDram
清除GDRAM中的值
voidLCD12864_ClearDram(void)
uint8_ti,j,k;
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);
LCD12864_Write(comm,i++);
LCD12864_Write(comm,0x88);
LCD12864_DisplayNChar
显示N个字符
addr--显示位置的首地址
pt--指向显示数据的指针
num--显示字符个数
voidLCD12864_DisplayNChar(uint8_taddr,uint8_t*pt,uint8_tnum)
uint8_ti;
LCD12864_Write(comm,addr);
for(i=0;i<(num*2);i++)
LCD12864_Write(dat,*(pt++));
LCD12864_DisplayString
显示字符串
voidLCD12864_DisplayString(uint8_taddress,uint8_t*table)
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();
if(STU_SPI_MISO)
SPIData|=0x01;
SET_SPI_SCK;
returnSPIData;
SPIWriteByte
RC522模拟SPI接口SPI写数据
voidSPIWriteByte(uint8_tSPIData)
uint8_tSPICount;//Counterusedtoclockoutthedata
if(SPIData&0x80){
SET_SPI_MOSI;
}else{
CLR_SPI_MOSI;
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];
status=MI_ERR;
returnstatus;
PcdAnticoll
防冲撞
pSnr[OUT]:
卡片序列号,4字节
成功返回MI_OK
int8_tPcdAnticoll(uint8_t*pSnr)
uint8_ti,snr_check=0;
WriteRawRC(BitFramingReg,0x00);//暂停数据发送
//接收LSB放在bit0位上
//最后一个字节所有位都发送
ClearBitMask(CollReg,0x80);//所以接收的位在位冲突后都将清零
ucComMF522Buf[0]=PICC_ANTICOLL1;//防冲撞指令代码
ucComMF522Buf[1]=0x20;//?
//发送并接收数据指令
status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1