说明

更改了网上的源代码,仅保留了读取序列号并通过串口回传的功能。版本号:V1

感谢 https://blog.csdn.net/qq_28877125/article/details/80437095

测试结果

main


#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "lcd.h"
#include "RC522.h" int main(void)
{
unsigned char ID[4],i; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
uart_init(115200); //初始化串口波特率为115200
RC522_Init(); while(1)
{
if(RC522_ReadCard(ID))
{
for(i=0;i<4;i++)
{
printf("%x",ID[i]);
}
printf("\r\n");
}
}
}

RC522.h

/******************************************************************************
* @File RC522.h
* @Author Velscode
* @Date 2019/01
* @Email velscode@gmail.com
* @Version 1.0
******************************************************************************/
#ifndef _RC522_H_
#define _RC522_H_ #include "sys.h"
#include "stm32f4xx_it.h" /*******************************
* 连线说明:
* 1 -- SDA <----->PA4
* 2 -- SCK <----->PA5
* 3 -- MOSI <----->PA7
* 4 -- MISO <----->PA6
* 5 -- 悬空
* 6 -- GND <----->GND
* 7 -- RST <----->PB0
* 8 -- VCC <----->VCC
************************************/ /* IO口宏定义 ----------------------------------------------------------------------- */
#define RC522_CS_Enable() GPIO_ResetBits( GPIOA, GPIO_Pin_4 )
#define RC522_CS_Disable() GPIO_SetBits ( GPIOA, GPIO_Pin_4 ) #define RC522_Reset_Enable() GPIO_ResetBits( GPIOB, GPIO_Pin_0 )
#define RC522_Reset_Disable() GPIO_SetBits ( GPIOB, GPIO_Pin_0 ) #define RC522_SCK_0() GPIO_ResetBits( GPIOA, GPIO_Pin_5 )
#define RC522_SCK_1() GPIO_SetBits ( GPIOA, GPIO_Pin_5 ) #define RC522_MOSI_0() GPIO_ResetBits( GPIOA, GPIO_Pin_7 )
#define RC522_MOSI_1() GPIO_SetBits ( GPIOA, GPIO_Pin_7 ) #define RC522_MISO_GET() GPIO_ReadInputDataBit ( GPIOA, GPIO_Pin_6 ) /* 函数声明 ---------------------------------------------------- */
u8 RC522_isConnected( void ); //检查模块连接
void RC522_Init ( void ); //初始化
void RC522_WriteRawRC ( u8 Address, u8 Value ); //写寄存器
u8 RC522_ReadRawRC ( u8 Address ); //读寄存器
u8 RC522_ReadCard( unsigned char *ID ); //读卡 /* MF522 命令字 ------------------------------------------------- */
#define PCD_IDLE 0x00 //取消当前命令
#define PCD_AUTHENT 0x0E //验证密钥
#define PCD_RECEIVE 0x08 //接收数据
#define PCD_TRANSMIT 0x04 //发送数据
#define PCD_TRANSCEIVE 0x0C //发送并接收数据
#define PCD_RESETPHASE 0x0F //复位
#define PCD_CALCCRC 0x03 //CRC计算 /* ifare_One卡片命令字 ---------------------------------------------------- */
#define PICC_REQIDL 0x26 //寻天线区内未进入休眠状态
#define PICC_REQALL 0x52 //寻天线区内全部卡
#define PICC_ANTICOLL1 0x93 //防冲撞
#define PICC_ANTICOLL2 0x95 //防冲撞
#define PICC_AUTHENT1A 0x60 //验证A密钥
#define PICC_AUTHENT1B 0x61 //验证B密钥
#define PICC_READ 0x30 //读块
#define PICC_WRITE 0xA0 //写块
#define PICC_DECREMENT 0xC0 //扣款
#define PICC_INCREMENT 0xC1 //充值
#define PICC_RESTORE 0xC2 //调块数据到缓冲区
#define PICC_TRANSFER 0xB0 //保存缓冲区中数据
#define PICC_HALT 0x50 //休眠 /* MF522 FIFO--------------------------- */
#define DEF_FIFO_LENGTH 64
#define MAXRLEN 18 /* MF522寄存器 ------------------------- */
// PAGE 0
#define RFU00 0x00
#define CommandReg 0x01
#define ComIEnReg 0x02
#define DivlEnReg 0x03
#define ComIrqReg 0x04
#define DivIrqReg 0x05
#define ErrorReg 0x06
#define Status1Reg 0x07
#define Status2Reg 0x08
#define FIFODataReg 0x09
#define FIFOLevelReg 0x0A
#define WaterLevelReg 0x0B
#define ControlReg 0x0C
#define BitFramingReg 0x0D
#define CollReg 0x0E
#define RFU0F 0x0F
// PAGE 1
#define RFU10 0x10
#define ModeReg 0x11
#define TxModeReg 0x12
#define RxModeReg 0x13
#define TxControlReg 0x14
#define TxAutoReg 0x15
#define TxSelReg 0x16
#define RxSelReg 0x17
#define RxThresholdReg 0x18
#define DemodReg 0x19
#define RFU1A 0x1A
#define RFU1B 0x1B
#define MifareReg 0x1C
#define RFU1D 0x1D
#define RFU1E 0x1E
#define SerialSpeedReg 0x1F
// PAGE 2
#define RFU20 0x20
#define CRCResultRegM 0x21
#define CRCResultRegL 0x22
#define RFU23 0x23
#define ModWidthReg 0x24
#define RFU25 0x25
#define RFCfgReg 0x26
#define GsNReg 0x27
#define CWGsCfgReg 0x28
#define ModGsCfgReg 0x29
#define TModeReg 0x2A
#define TPrescalerReg 0x2B
#define TReloadRegH 0x2C
#define TReloadRegL 0x2D
#define TCounterValueRegH 0x2E
#define TCounterValueRegL 0x2F
// PAGE 3
#define RFU30 0x30
#define TestSel1Reg 0x31
#define TestSel2Reg 0x32
#define TestPinEnReg 0x33
#define TestPinValueReg 0x34
#define TestBusReg 0x35
#define AutoTestReg 0x36
#define VersionReg 0x37
#define AnalogTestReg 0x38
#define TestDAC1Reg 0x39
#define TestDAC2Reg 0x3A
#define TestADCReg 0x3B
#define RFU3C 0x3C
#define RFU3D 0x3D
#define RFU3E 0x3E
#define RFU3F 0x3F /* 通信返回码 ----------------------- */
#define MI_OK 0
#define MI_NOTAGERR 1
#define MI_ERR 2 #endif
/* End of File ------------------------------------------------------------- */

RC522.c

/******************************************************************************
* @File RC522.c
* @Author Velscode
* @Date 2019/01
* @Email velscode@gmail.com
* @Version 1.0
******************************************************************************/
#include "sys.h"
#include "RC522.h"
#include "delay.h" char PcdAnticoll ( u8 * pSnr );
void PcdAntennaOn ( void );
char PcdComMF522 ( u8 ucCommand, u8 * pInData, u8 ucInLenByte, u8 * pOutData, u32 * pOutLenBit ); void SetBitMask ( u8 Reg, u8 Mask );
void ClearBitMask ( u8 Reg, u8 Mask ); void SPI_RC522_SendByte ( u8 byte );
unsigned char SPI_RC522_ReadByte ( void ); /********************************************
* @Name RC522_ReadCard
* @Brief 读取射频卡
* @Para 如果读取成功,ID中存储的就是卡序列号
* @Retun 1 - 读取到ID卡
* 0 - 未读取到ID卡
********************************************/
u8 RC522_ReadCard( unsigned char *ID )
{
u8 state = 0x00; u8 ucComMF522Buf [ MAXRLEN ];
u32 ulLen; ClearBitMask ( Status2Reg, 0x08 ); //清理指示MIFARECyptol单元接通以及所有卡的数据通信被加密的情况
RC522_WriteRawRC ( BitFramingReg, 0x07 ); //发送的最后一个字节的 七位
SetBitMask ( TxControlReg, 0x03 ); //TX1,TX2管脚的输出信号传递经发送调制的13.56的能量载波信号 ucComMF522Buf [ 0 ] = PICC_REQALL; //存入 卡片命令字 state = PcdComMF522 ( PCD_TRANSCEIVE, ucComMF522Buf, 1, ucComMF522Buf, & ulLen ); //寻卡 if(state==MI_OK)//寻卡成功
{
state = MI_ERR;
state = PcdAnticoll(ID);//防冲撞
} if( state == MI_OK )
{
return 1;
}
else
{
return 0;
}
} /***********************************
* @Name RC522_isConnected()
* @Brief 检查RC522模块是否连接
* @Retun 1 - 连接成功
* 0 - 连接失败
************************************/
u8 RC522_isConnected(void)
{
if(RC522_ReadRawRC(VersionReg)==0x92)
{
return 1;
}
else
{
return 0;
}
} /*******************************
* @Name RC522_Init()
* @Brief 初始化RC522
************************************/
void RC522_Init( void )
{
// GPIO初始化 ------------------------------------------------------------------------------
GPIO_InitTypeDef GPIO_InitStructure; //结构体定义 RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB , ENABLE );//使能GPIOA\B时钟 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHZ速率
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //不拉 // CS
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_Init(GPIOA, &GPIO_InitStructure); //使用给定参数初始化引脚 // SCK
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_Init(GPIOA, &GPIO_InitStructure); // MOSI
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_Init(GPIOA, &GPIO_InitStructure); // RST
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOB, &GPIO_InitStructure); // MISO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //MISO引脚配置为输入模式,其它不变
GPIO_Init(GPIOA, &GPIO_InitStructure); //其它操作 ----------------------------------
RC522_Reset_Disable();
RC522_CS_Disable(); //复位RC522 ---------------------------------
RC522_Reset_Disable();
delay_us ( 1 ); RC522_Reset_Enable();
delay_us ( 1 ); RC522_Reset_Disable();
delay_us ( 1 ); RC522_WriteRawRC ( CommandReg, 0x0f ); while ( RC522_ReadRawRC ( CommandReg ) & 0x10 ); delay_us ( 1 ); RC522_WriteRawRC ( ModeReg, 0x3D ); //定义发送和接收常用模式 和Mifare卡通讯,CRC初始值0x6363 RC522_WriteRawRC ( TReloadRegL, 30 ); //16位定时器低位
RC522_WriteRawRC ( TReloadRegH, 0 ); //16位定时器高位 RC522_WriteRawRC ( TModeReg, 0x8D ); //定义内部定时器的设置 RC522_WriteRawRC ( TPrescalerReg, 0x3E ); //设置定时器分频系数 RC522_WriteRawRC ( TxAutoReg, 0x40 ); //调制发送信号为100%ASK //设置RC522工作方式为ISO14443_A标准 -----------------------------------------------------
ClearBitMask ( Status2Reg, 0x08 ); RC522_WriteRawRC ( ModeReg, 0x3D );//3F RC522_WriteRawRC ( RxSelReg, 0x86 );//84 RC522_WriteRawRC( RFCfgReg, 0x7F ); //4F RC522_WriteRawRC( TReloadRegL, 30 );//tmoLength);// TReloadVal = 'h6a =tmoLength(dec) RC522_WriteRawRC ( TReloadRegH, 0 ); RC522_WriteRawRC ( TModeReg, 0x8D ); RC522_WriteRawRC ( TPrescalerReg, 0x3E ); delay_us ( 20 ); PcdAntennaOn ();//开天线
} /*********************************************
* @Name SPI_RC522_SendByte
* @brief 向RC522发送1 字节数据
* @input byte,要发送的数据
* @note RC522.c内部函数
*********************************************/
void SPI_RC522_SendByte ( u8 byte )
{
unsigned char i; for( i = 0; i < 8; i++ )
{
if ( byte & 0x80 )
RC522_MOSI_1();
else
RC522_MOSI_0(); delay_us ( 50 ); RC522_SCK_0 (); delay_us ( 50 ); RC522_SCK_1(); delay_us ( 50 ); byte <<= 1;
}
} /*********************************************
* @Name SPI_RC522_ReadByte
* @Brief 读取RC522 1字节数据
* @Para RC522回传的数据
* @Note RC522.c内部函数
*********************************************/
u8 SPI_RC522_ReadByte ( void )
{
u8 i;
u8 SPI_Data; for( i = 0; i < 8; i++ )
{
SPI_Data <<= 1; RC522_SCK_0();
delay_us ( 50 ); if ( RC522_MISO_GET() == 1)
SPI_Data |= 0x01;
delay_us ( 50 ); RC522_SCK_1();
delay_us ( 50 ); }
return SPI_Data;
} /*********************************************
* @Name RC522_WriteRawRC
* @Brief 写RC522寄存器
* @Para Address 寄存器地址
* @Para Value 要写入的值
*********************************************/
void RC522_WriteRawRC ( u8 Address, u8 Value )
{
u8 Addr; Addr = ( Address << 1 ) & 0x7E; RC522_CS_Enable(); SPI_RC522_SendByte ( Addr ); SPI_RC522_SendByte ( Value ); RC522_CS_Disable();
} /*********************************************
* @Name RC522_ReadRawRC
* @Brief 读RC522寄存器
* @Para Address 寄存器地址
* @Retun 寄存器中的知
*********************************************/
u8 RC522_ReadRawRC ( u8 Address )
{
u8 Addr, Value; Addr = ( ( Address << 1 ) & 0x7E ) | 0x80; RC522_CS_Enable(); SPI_RC522_SendByte ( Addr ); Value = SPI_RC522_ReadByte (); RC522_CS_Disable(); return Value;
} /*********************************************
* @Name SetBitMask
* @Brief 设置寄存器指定位
* @Para Reg 寄存器地址
* @Para Mask
*********************************************/
void SetBitMask ( u8 Reg, u8 Mask )
{
u8 Temp; Temp = RC522_ReadRawRC ( Reg ); RC522_WriteRawRC ( Reg, Temp | Mask ); // set bit mask } /*********************************************
* @Name ClearBitMask
* @Brief 清除寄存器指定位
* @Para Reg 寄存器地址
* @Para Mask
*********************************************/
void ClearBitMask ( u8 Reg, u8 Mask )
{
u8 Temp; Temp = RC522_ReadRawRC ( Reg ); RC522_WriteRawRC ( Reg, Temp & ( ~ Mask) ); // clear bit mask
} /*********************************************
* @Name PcdAntennaOn
* @Brief 开启天线
* @Note 有待评估该函数是否必须
*********************************************/
void PcdAntennaOn ( void )
{
u8 uc; uc = RC522_ReadRawRC ( TxControlReg ); if ( ! ( uc & 0x03 ) )
SetBitMask(TxControlReg, 0x03); } /*
* 函数名:PcdAnticoll
* 描述 :防冲撞
* 输入 :pSnr,卡片序列号,4字节
* 返回 : 状态值
* = MI_OK,成功
* 调用 :外部调用
*/
char PcdAnticoll ( u8 * pSnr )
{
char cStatus;
u8 uc, ucSnr_check = 0;
u8 ucComMF522Buf [ MAXRLEN ];
u32 ulLen; ClearBitMask ( Status2Reg, 0x08 ); //清MFCryptol On位 只有成功执行MFAuthent命令后,该位才能置位
RC522_WriteRawRC ( BitFramingReg, 0x00); //清理寄存器 停止收发
ClearBitMask ( CollReg, 0x80 ); //清ValuesAfterColl所有接收的位在冲突后被清除 ucComMF522Buf [ 0 ] = 0x93; //卡片防冲突命令
ucComMF522Buf [ 1 ] = 0x20; cStatus = PcdComMF522 ( PCD_TRANSCEIVE, ucComMF522Buf, 2, ucComMF522Buf, & ulLen);//与卡片通信 if ( cStatus == MI_OK) //通信成功
{
for ( uc = 0; uc < 4; uc ++ )
{
* ( pSnr + uc ) = ucComMF522Buf [ uc ]; //读出UID
ucSnr_check ^= ucComMF522Buf [ uc ];
} if ( ucSnr_check != ucComMF522Buf [ uc ] )
cStatus = MI_ERR; } SetBitMask ( CollReg, 0x80 ); return cStatus; } /*
* 函数名:PcdComMF522
* 描述 :通过RC522和ISO14443卡通讯
* 输入 :ucCommand,RC522命令字
* pInData,通过RC522发送到卡片的数据
* ucInLenByte,发送数据的字节长度
* pOutData,接收到的卡片返回数据
* pOutLenBit,返回数据的位长度
* 返回 : 状态值
* = MI_OK,成功
* 调用 :内部调用
*/
char PcdComMF522 ( u8 ucCommand, u8 * pInData, u8 ucInLenByte, u8 * pOutData, u32 * pOutLenBit )
{
char cStatus = MI_ERR;
u8 ucIrqEn = 0x00;
u8 ucWaitFor = 0x00;
u8 ucLastBits;
u8 ucN;
u32 ul; switch ( ucCommand )
{
case PCD_AUTHENT: //Mifare认证
ucIrqEn = 0x12; //允许错误中断请求ErrIEn 允许空闲中断IdleIEn
ucWaitFor = 0x10; //认证寻卡等待时候 查询空闲中断标志位
break; case PCD_TRANSCEIVE: //接收发送 发送接收
ucIrqEn = 0x77; //允许TxIEn RxIEn IdleIEn LoAlertIEn ErrIEn TimerIEn
ucWaitFor = 0x30; //寻卡等待时候 查询接收中断标志位与 空闲中断标志位
break; default:
break; } RC522_WriteRawRC ( ComIEnReg, ucIrqEn | 0x80 ); //IRqInv置位管脚IRQ与Status1Reg的IRq位的值相反
ClearBitMask ( ComIrqReg, 0x80 ); //Set1该位清零时,CommIRqReg的屏蔽位清零
RC522_WriteRawRC ( CommandReg, PCD_IDLE ); //写空闲命令
SetBitMask ( FIFOLevelReg, 0x80 ); //置位FlushBuffer清除内部FIFO的读和写指针以及ErrReg的BufferOvfl标志位被清除 for ( ul = 0; ul < ucInLenByte; ul ++ )
RC522_WriteRawRC ( FIFODataReg, pInData [ ul ] ); //写数据进FIFOdata RC522_WriteRawRC ( CommandReg, ucCommand ); //写命令 if ( ucCommand == PCD_TRANSCEIVE )
SetBitMask(BitFramingReg,0x80); //StartSend置位启动数据发送 该位与收发命令使用时才有效 ul = 1000;//根据时钟频率调整,操作M1卡最大等待时间25ms do //认证 与寻卡等待时间
{
ucN = RC522_ReadRawRC ( ComIrqReg ); //查询事件中断
ul --;
} while ( ( ul != 0 ) && ( ! ( ucN & 0x01 ) ) && ( ! ( ucN & ucWaitFor ) ) ); //退出条件i=0,定时器中断,与写空闲命令 ClearBitMask ( BitFramingReg, 0x80 ); //清理允许StartSend位 if ( ul != 0 )
{
if ( ! (( RC522_ReadRawRC ( ErrorReg ) & 0x1B )) ) //读错误标志寄存器BufferOfI CollErr ParityErr ProtocolErr
{
cStatus = MI_OK; if ( ucN & ucIrqEn & 0x01 ) //是否发生定时器中断
cStatus = MI_NOTAGERR; if ( ucCommand == PCD_TRANSCEIVE )
{
ucN = RC522_ReadRawRC ( FIFOLevelReg ); //读FIFO中保存的字节数 ucLastBits = RC522_ReadRawRC ( ControlReg ) & 0x07; //最后接收到得字节的有效位数 if ( ucLastBits )
* pOutLenBit = ( ucN - 1 ) * 8 + ucLastBits; //N个字节数减去1(最后一个字节)+最后一位的位数 读取到的数据总位数
else
* pOutLenBit = ucN * 8; //最后接收到的字节整个字节有效 if ( ucN == 0 )
ucN = 1; if ( ucN > MAXRLEN )
ucN = MAXRLEN; for ( ul = 0; ul < ucN; ul ++ )
pOutData [ ul ] = RC522_ReadRawRC ( FIFODataReg );
}
}
else
cStatus = MI_ERR;
} SetBitMask ( ControlReg, 0x80 ); // stop timer now
RC522_WriteRawRC ( CommandReg, PCD_IDLE ); return cStatus; } /* End of File ------------------------------------------------------------- */

RC522射频卡读写模块驱动(仅读取)的更多相关文章

  1. 动手实操丨RC522射频卡模块与IC卡完成充值消费查询的技术实现思路

    摘要:一文手把手教你利用RC522射频卡模块与IC卡完成充值消费查询的技术实现思路. 本文分享自华为云社区<​​​​​​​​​​​​​​RC522射频卡模块与IC卡完成充值消费查询的技术实现思路 ...

  2. 【雕爷学编程】Arduino动手做(52)---MicroSD卡读写模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种 的.鉴于本人手头积累了一些传感器和模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准 ...

  3. 射频识别技术漫谈(28)——基于MF1射频卡的酒店门锁设计

    电子门锁是现代星级酒店管理电子化.智能化的重要电子设备.相较于传统的机械锁,基于RFID技术的电子门锁使用方便,易于管理,安全性高,可实现对开锁用户的分优先级自动管理,对房间入住信息实现自动统计与报表 ...

  4. RC522 射频读卡器模块(MINI型)

    一.硬件: 二.[主芯片介绍] MF RC522是应用于13.56MHz非接触式通信中高集成度的读写卡芯片,是NXP公司针对"三表"应用推出的一款低电压.低成本.体积小的非接触式读 ...

  5. MIFARE系列6《射频卡与读写器的通讯》

    1. 复位应答(Answer to request) 读写器呼叫磁场内的卡片,卡片对呼叫做出应答.对刚进入磁场得到电复位处于休闲状态的卡片,卡请求(REQA,0x26):对于已进行过读写操作并进入休眠 ...

  6. MIFARE系列6《射频卡与读写器的通信》

    1. ATR(Answer to request) 读写器呼叫磁场内的卡片.卡片对呼叫做出应答. 对刚进入磁场得到电复位处于休闲状态的卡片,卡请求(REQA,0x26):对于已进行过读写操作并进入休眠 ...

  7. RFID与射频卡电器特性

    电气特性: 容量为8K位EEPrOM: ● 分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位: ● 每个扇区有独立的一组密码及访问控制: ● 每张卡有唯一序列号,为32位: ● 具有防冲 ...

  8. 第36章 SDIO—SD卡读写测试

    第36章     SDIO—SD卡读写测试 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/f ...

  9. STM32F407使用MFRC522射频卡调试及程序移植成功

    版权声明:转载请注明出处,谢谢 https://blog.csdn.net/Kevin_8_Lee/article/details/88865556 或  https://www.cnblogs.co ...

随机推荐

  1. 好程序员web前端分享值得参考的css理论:OOCSS、SMACSS与BEM

    好程序员web前端分享值得参考的css理论:OOCSS.SMACSS与BEM 最近在The Sass Way里看到了Modular CSS typography一文,发现文章在开头部分就提到了OOCS ...

  2. 数据规范化——sklearn.preprocessing

    sklearn实现---归类为5大类 sklearn.preprocessing.scale()(最常用,易受异常值影响) sklearn.preprocessing.StandardScaler() ...

  3. jenkins编译打包nodejs

    第一步 安装nodejs插件 第二步 在全局配置管理里面添加 nodejs配置 第三步 新建任务,从git上面拉取代码 cd /opt/tomcat7/bin/workspace/confdev #进 ...

  4. static 与final abstract关键字

    一.通常访问类的属性与方法需要创建该类的实例,而static关键字的访问不需要某个特定的实例. 1.静态变量 使用类名.变量直接访问 package text5; public class Fathe ...

  5. 分治FFT的三种含义

    分治FFT是几个算法的统称.它们之间并无关联. 分治多项式乘法 问题如求\(\prod_{i=1}^na_ix+b\). 若挨个乘复杂度为\(O(n^2\log n)\),可分治做这件事,复杂度为\( ...

  6. C Programming Style 总结

    对材料C Programming Style for Engineering Computation的总结. 原文如下: C Programming Style for Engineering Com ...

  7. Timer类的常见使用方法

    System.Timers名称空间中的Timer类的构造函数只需要一个时间间隔,经过该时间间隔后应该调用的方法用Elapsed事件指定,这个事件需要一个ElapsedEventHandler类型的委托 ...

  8. js01-javascript语法标准和数据类型

    语法规则 (1)JavaScript对换行.缩进.空格不敏感. 备注:每一条语句末尾要加上分号,虽然分号不是必须加的,但是为了程序今后要压缩,如果不加分号,压缩之后将不能运行. (2)所有的符号,都是 ...

  9. Vs2010项目升级到Vs2015时的一些修改

    之前的C++/cli项目, Civil 3D版本为2014, 现在需要升级到2018版, 在升级的过程中遇到了一些问题: 为了备忘, 记录如下: Vcproj文件中进行了一些修改, 为了跟多版本项目的 ...

  10. mpvue——修改第三方组件样式

    前言 我们都知道在vue中可以定义多个<style>,一般为了防止全局污染,我们会使用<style scoped>代表这里面的css样式只在本页面生效. 全局 这个当时测试是直 ...