📄 x76f100.c
字号:
//X76F100 加密IC卡芯片驱动程序
//16X2液晶显示屏接在板子上作显示 X76F100接在P1口
#include <AT89X51.H>
#include <ABSACC.H>
#include <INTRINS.H>
#define uchar unsigned char
#define unint unsigned int
//********************************************************************
uchar idata uestc[]={ 0X55,0X45,0X53,0X54,0X43,0X20,0x20,0X39,0X38,0X31,
0X34,0X31,0Xb0,0x32,0x20,0x20,0x20,0x00};//UESTC__98141-2
uchar idata gongjun[]={ 0X67,0X6f,0X6e,0X67,0X20,0X6a,0x75,0X6e,0X20,
0X47,0X6f,0X6f,0X64,0x21,0x20,0x20,0x20,0x00};//gong_jun_Good!
//********************************************************************
//en-p27 rs-p24 rw-p23 D0--D7<-->P0--P7 定义液晶的引脚
sbit en=P2^7; sbit rs=P2^4; sbit rw=P2^3;
//********************************************************************
bdata uchar Bcc; //定义一个可位寻址的全局变量
sbit b0=Bcc^0; sbit b1=Bcc^1; sbit b2=Bcc^2; sbit b3=Bcc^3;
sbit b4=Bcc^4; sbit b5=Bcc^5; sbit b6=Bcc^6; sbit b7=Bcc^7;
//*************************************************
void DELAYL (uchar t){ uchar s;while (t--) { //长时间延时子程序
for (s=0xff;s>0;s--) {_nop_();_nop_();_nop_();} } }
//*************************************************
void DELAYS (uchar t){ while (t--) {_nop_();_nop_(); } }//短时间延时子程序
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
void wait(void){ en=0; rs=0; rw=1; //读忙标志,忙则继续等待
do {en=0;en=1;_nop_();Bcc=P0;en=0;} while(a7==1); }
//********************************************************************
void command(uchar a){ //向液晶里写入指令、控制字
en=0;rs=0;rw=0;en=1;P0=a;_nop_();en=0;wait();}
//********************************************************************
void reset(void){ //液晶模块软件复位
en=0;rs=0;rw=0;en=1;P0=0x38;_nop_();en=0;delay(0x04);
en=0;rs=0;rw=0;en=1;P0=0x38;_nop_();en=0;delay(0x02);command(0x38);}
//置功能 (8位总线宽度、双行显示、5X7点阵显示)
//********************************************************************
void lcdstart(void){ //液晶模块初始化
reset(); //液晶模块软件复位
command(0x38); //置功能 (总线宽度、单/双行显示、5X7或5X10显示)
command(0x06); //置输入模式(地址计数器自加减、画面左右移动)
command(0x0c); //显示、光标、光标闪烁的开关
command(0x01);} //清屏幕的显示
//********************************************************************
// command(0x02); //光标复位,返回到地址00H处
// command(0x14); //光标或字符左右移位显示
// command(0x40); //置字符发生存储器地址
// command(0x80); //置数据存储器地址
//********************************************************************
//void mov(void){ uchar x; for (x=0;x<0xff;x++){
//s command(0x18); delay(0xa0);} }//光标或字符移位
//********************************************************************
void display(s) uchar idata *s; //向指定的显示存储器地址写入待显示的字符串
{uchar i=0;while (s[i]!=0x00){en=0;rs=1;rw=0; //写数据方式
en=1;P0=s[i];en=0;wait();i++;_nop_();} } //输出数据
//********************************************************************
void word_w(uchar s){ //向指定的显示存储器地址写入待显示的单个字符
en=0;rs=1;rw=0;en=1;P0=s;en=0;wait();} //写数据方式输出数据
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 定义X76F100的引脚
sbit X76_CS=P1^3; sbit X76_RST=P1^2; sbit X76_SDA=P1^7; sbit X76_SCK=P1^4;
//********************************************************************
void START(void) //start 串行传输开始条件
{X76_CS=0;sda=1;scl=1;_nop_();_nop_();sda=0;_nop_();scl=0;}
//********************************************************************
void STOP(void){ //stop 串行传输结束条件
sda=0;scl=1;_nop_();_nop_();sda=1;scl=0;X76_CS=1;}
//********************************************************************
uchar IN_RD(void){uchar a; X76_SCK=0; //输出8个脉冲,读入一个字节数据
X76_SCK=1;b7=X76_SDA;X76_SCK=0;X76_SCK=1;b6=X76_SDA;X76_SCK=0;
X76_SCK=1;b5=X76_SDA;X76_SCK=0;X76_SCK=1;b4=X76_SDA;X76_SCK=0;
X76_SCK=1;b3=X76_SDA;X76_SCK=0;X76_SCK=1;b2=X76_SDA;X76_SCK=0;
X76_SCK=1;b1=X76_SDA;X76_SCK=0;X76_SCK=1;b0=X76_SDA;X76_SCK=0;a=Bcc;return(a);}
//********************************************************************
void OUT_WR(uchar a){Bcc=a; X76_SCK=0;
b7=X76_SDA;X76_SCK=1;X76_SCK=0;b6=X76_SDA;X76_SCK=1;X76_SCK=0;
b5=X76_SDA;X76_SCK=1;X76_SCK=0;b4=X76_SDA;X76_SCK=1;X76_SCK=0;
b3=X76_SDA;X76_SCK=1;X76_SCK=0;b2=X76_SDA;X76_SCK=1;X76_SCK=0;
b1=X76_SDA;X76_SCK=1;X76_SCK=0;b0=X76_SDA;X76_SCK=1;X76_SCK=0;}
//********************************************************************
void ACK(void){X76_SDA=0;X76_SCK=0;X76_SCK=1;X76_SCK=0;} //主机应答
//********************************************************************
void NACK(void){X76_SDA=1;X76_SCK=0;X76_SCK=1;X76_SCK=0;} //让IC卡应答
//********************************************************************
uchar RESET(void){uchar a,b,c,d; X76_CS=1;X76_RST=0;X76_SCK=0;X76_SDA=1;
X76_CS=0;X76_RST=1;X76_SCK=0;X76_SCK=1;X76_SCK=0;X76_RST=0;
a=IN_RD();b=IN_RD();c=IN_RD();d=IN_RD();X76_CS=1;
if((a==0x98)&(b==0x00)&(c==0x55)&(b==0xaa)){return(0x00);}else{return (0xff);}}
//********************************************************************
uchar ERASE(void){ uchar a;
//********************************************************************
uchar READ_IC(uchar a){START();OUT_WR(0x81|((a&0x0f)<1));NACK();
OUT_WR(0x00);NACK();OUT_WR(0x00);NACK();
OUT_WR(0x00);NACK();OUT_WR(0x00);NACK();
OUT_WR(0x00);NACK();OUT_WR(0x00);NACK();
OUT_WR(0x00);NACK();OUT_WR(0x00);NACK();DELAYL(0x03);
//********************************************************************
//********************************************************************
//********************************************************************
//********************************************************************
main(){
//************************************************************
RESET();
CHECK();
ERASE();
READ_IC();
WRITE_IC();
PREAD_IC();
PWRITE_IC();
PASSWORD();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -