📄 read_card.c
字号:
/*******************************************************************************
读卡、显示 函数
*******************************************************************************/
#include <iom8v.h>
#include <macros.h>
#include "lcd1602.h"
unsigned char IC_Codes_8[16]={0} , Wrong_flag = 0 ;
void Read_Card(void)
{ // 卡内 128 bit 数据 // 卡内 16 字节数据
unsigned char i=0 , j=0 , k=0 , IC_Codes_2[128]={0} ;
for(i=0;i<16;i++)
{
IC_Codes_8[i] = 0 ;
}
Reset_0 ;
CLK_0 ; // IC_Card 卡复位
delay_nms(10);
Reset_1 ; // 要使地址计数器复位"0",先让Resct复位端由
delay_nus(8) ; // "0"变成"1",然后跟着一个Clock脉冲从"0"变
CLK_1 ; // 成"1"再降回"0"电平,Resct复位端再至"0",
delay_nus(44) ; // 把Clock脉冲包住,随着Reset端变低,地址0单
CLK_0 ; // 元的数据从I/O上输出。对应 Clock端的每个脉
delay_nus(8) ; // 冲,其上升沿使地址计数器增加。其下降沿使被
Reset_0 ; // 选通地址单元的数据从I/O上输出。地址计数器
delay_nus(5) ; // 增加到127后返回到0
if ( (PINB&0x02)==0 )
{
IC_Codes_2[0] = 0 ; //读取IC卡I/O口输出的是电平 (地址0上的数据)
}
else
{ //并把电平值记入数组IC_Card_2[128]中
IC_Codes_2[0] = 1;
}
delay_nus(27) ;
for (i=1;i<128;i++)
{
CLK_1 ;
delay_nus(40) ;
CLK_0 ;
delay_nus(20) ;
if ( (PINB&0x02)==0 ) //读取IC卡I/O口输出的是电平 (地址1~127上的数据)
{
IC_Codes_2[i] = 0 ;
}
else
{ //并把电平值记入数组IC_Card_2[128]中
IC_Codes_2[i] = 1;
}
delay_nus(20) ;
}
for(i=0;i<16;i++)
{
for(j=0;j<8;j++) // 把IC_Card_2[128]中的128位数据转换成
{ // 16个字节并存放在IC_Card_8[16]
IC_Codes_8[i] |= (IC_Codes_2[k]<<(8-j));
k++;
}
}
if ( IC_Codes_8[2] == 0 )
{
IC_Codes_8[2] = 68 ;
}
if ( IC_Codes_8[2] == 0xfe )
{
if ( IC_Codes_8[3] == 0xfe )
{
if ( IC_Codes_8[4] == 0xfe )
{
if ( IC_Codes_8[5] == 0xfe )
{
if ( IC_Codes_8[6] == 0xfe )
{
if ( IC_Codes_8[7] == 0xfe )
{
Wrong_flag = 1 ;
Wrong_Card();
}
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -