Paso 3: código
#include & quot;core.h & quot;
#include & quot; Wire.h & quot;
#include & quot; LiquidCrystal.h & quot;
#include & quot;string.h & quot;
#define uchar unsigned char
#define uint unsigned int
LiquidCrystal lcd(0);
Definiciones de estado SPI Bus
#define SPI_RDY 0xF0 / / listo
#define spibusy 0xaa / / ocupado
#define spiread 0xbb / / escritura
#define spiwrite 0xcc / leer
#define SCL_0 digitalWrite(13,LOW)
#define SCL_1 digitalWrite(13,HIGH)
#define MISO digitalRead(12)
#define MOSI_0 digitalWrite(11,LOW)
#define MOSI_1 digitalWrite(11,HIGH)
#define NSS_0 digitalWrite(10,LOW)
#define NSS_1 digitalWrite(10,HIGH)
#define SIG digitalRead(9)
#define éxito 0
#define error 1
uchar g_cReceBuf [10];
uchar ComPWRdwn [] = {0 x 02, 0 x 03};
uchar ComAutoSearchCard [] = {0 x 03, 0 x 13, 0 x 01};
uchar ComGetCardSn [] = {0 x 02, 0 x 20};
uchar ComHaltCard [] = {0 x 02, 0x12};
void port_init()
{
pinMode(13,OUTPUT);
pinMode(12,INPUT);
pinMode(11,OUTPUT);
pinMode(10,OUTPUT);
pinMode(9,INPUT);
}
unsigned char SPIRWByte (char sin signo cSendByte)
{
unsigned char i = 8;
unsigned char cRecByte;
mientras (i--)
{
cRecByte * = 2;
SCL_0;
delayMicroseconds(2);
Si ((cSendByte & amp; 0 x 80) == 0 x 80) MOSI_1;
MOSI_0 otra cosa;
cSendByte * = 2;
cRecByte | = (unsigned char)(MISO);
SCL_1;
delayMicroseconds(2);
}
SCL_1;
volver cRecByte;
}
unsigned char spi_cStatus(void)
{
unsigned char cStatus;
NSS_0;
cStatus=SPIRWByte(spibusy);
cStatus=SPIRWByte(0xFF);
NSS_1;
volver cStatus;
}
unsigned char SPI_Read (unsigned char * cP)
{
unsigned char cCnt, cStatus;
unsigned char cCheckSum = 0;
para (cCnt = 0 cCnt & lt; 100; cCnt ++)
{
cStatus=spi_cStatus();
if(cStatus==0xF0)
{
cCnt = 253;
}
Delay(10);
}
if(cCnt==254)
{
NSS_0;
cCnt=SPIRWByte(spiread);
cP [0] = 0 x 01;
para (cCnt = 0 cCnt & lt; cP [0]; cCnt ++)
{
cP [cCnt] = SPIRWByte(0xFF);
cCheckSum ^ = cP [cCnt];
Si (cP [0] & gt; 32)
{
NSS_1;
volver la falta;
}
}
cP [cCnt] = SPIRWByte(0xFF);
NSS_1;
Si (cCheckSum == cP[cCnt])
{
devolver el éxito;
}
}
volver la falta;
}
unsigned char SPI_Write (unsigned char * cP)
{
unsigned char i, cStatus;
unsigned char cCheckSum = 0;
NSS_0;
cStatus=SPIRWByte(spiwrite);
para (i = 0; i & lt; cP [0]; i ++)
{
cCheckSum ^ = cP [i];
cStatus=SPIRWByte(cP[i]);
}
cStatus=SPIRWByte(cCheckSum);
NSS_1;
volver cStatus;
}
void setup()
{
LCD.Begin (16, 2);
LCD.Clear();
LCD.Print (& quot; leer tarjeta de identificación: & quot;);
lcd.setBacklight(HIGH);
port_init();
}
void loop()
{
uchar cStatus, i;
uchar * cPa;
mientras (1)
{
lcd.setCursor(0,0);
LCD.Print (& quot; leer tarjeta de identificación: & quot;);
lcd.setCursor(0,1);
LCD.Print (& quot; no hay tarjeta, espera. & quot;);
if(SIG==Low)
{
Delay(100);
cPa = ComGetCardSn;
SPI_Write(cPa);
Delay(100);
cStatus = SPI_Read(g_cReceBuf);
SPI_Write(ComHaltCard);
lcd.setCursor(0,1);
LCD.Print (& quot; tarjeta ID: & quot;);
para (i = 2; i & lt; 6; i ++)
LCD.Print(g_cReceBuf[i],HEX);
mientras (!. (SIG);
}
}
}
Puede descargar el código aquí: HY502B