📄 icrdwr.lst
字号:
C51 COMPILER V7.02b ICRDWR 12/10/2005 19:53:55 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE ICRDWR
OBJECT MODULE PLACED IN ICRdWr.OBJ
COMPILER INVOKED BY: E:\EDATOOLS\KEILC7.0\C51\BIN\C51.EXE ICRdWr.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*****************************************/
2 /* Copyright (c) 2005, 通信工程学院 */
3 /* All rights reserved. */
4 /* 作 者:戴 佳 */
5 /*****************************************/
6
7 #include "ICRdWr.h"
8
9 /* 延时t毫秒 */
10 void delay(uint t)
11 {
12 1 uint i;
13 1 while(t--)
14 1 {
15 2 /* 对于11.0592M时钟,约延时1ms */
16 2 for (i=0;i<125;i++)
17 2 {}
18 2 }
19 1 }
20
21 /* 获取需要存入IC卡数据的函数*/
22 void getdata()
23 {
24 1 // 此函数简化如下:
25 1 uchar i;
26 1 for (i=0;i<8;i++)
27 1 data_in[i]=i+1;
28 1 }
29
30 /* 写单片机AT89S8252的SPDR寄存器,数据通过SPI口串行输出给IC卡芯片 */
31 void write_spi(uchar dat)
32 {
33 1 SPDR = dat;
34 1 while (!(SPSR & 0x80)) ; // 等待一次传输完成
35 1 }
36
37 /* 获取IC卡芯片状态函数 */
38 uchar IC_stat(void)
39 {
40 1 P1_1 = 0; // 使能IC卡芯片;/cs=0
41 1
42 1 write_spi(STAT_REG_READ); // 写入读IC卡芯片状态指令
43 1 write_spi(0x00); // 写无关比特
44 1
45 1 P1_1 = 1; // 禁用IC卡芯片;/cs=1
46 1 return SPDR; // 返回IC卡芯片状态字节
47 1 }
48
49 /* 写IC卡芯片函数:将数据写入buffer,如果buffer满,
50 则将buffer中数据写入主内存页 */
51 void write_to_IC(uchar dat)
52 {
53 1 uchar stat;
54 1
55 1 /* 检查IC卡芯片是否忙 */
C51 COMPILER V7.02b ICRDWR 12/10/2005 19:53:55 PAGE 2
56 1 stat = IC_stat();
57 1 while ((stat&0x80)==0x00);
58 1
59 1 /* 数据写入buffer */
60 1 P1_1 = 0; // 使能IC卡芯片;/cs=0
61 1 write_spi(BUFFER_1_WRITE); // buffer1写指令代码
62 1 write_spi(0x00); // 写入8位无关位
63 1 write_spi((uchar)(buf_start_addr>>8)); // 写入7位无关位加上9位buffer起始字节地址的第1位
64 1 write_spi((uchar)buf_start_addr); // 写入9位buffer起始字节地址的后8位
65 1 write_spi(dat); // 写入数据
66 1 P1_1 = 1; // 禁用IC卡芯片;结束buffer write指令
67 1
68 1 buf_start_addr++; // 下一buffer起始字节地址
69 1
70 1 /* 如果buffer写满,则将buffer中数据写入主内存页 */
71 1 if (buf_start_addr > 263)
72 1 {
73 2 buf_start_addr = 0; // buffer起始字节地址重置0
74 2 if (page_addr < 2047) // 如果主内存页不满
75 2 {
76 3 /* buffer数据写入主内存页 */
77 3 P1_1 = 0; // 使能IC卡芯片;/cs=0
78 3 write_spi(B1_TO_MM_PAGE_NO_ERA); // 写入无在线擦除的buffer1写主内存页指令代码
79 3 write_spi((uchar)(page_addr>>7)); // 写入4位保留位加上11位页地址的高4位
80 3 write_spi((uchar)(page_addr<<1)); // 写入11位页地址的低7位和1位无关位
81 3 write_spi(0x00); // 再写入8位无关位
82 3 P1_1 = 1; // 禁用IC卡芯片;结束无在线擦除的buffer写主内存页指令
83 3
84 3 page_addr++; // 下一页地址
85 3 }
86 2 }
87 1 }
88
89 /* 读IC卡芯片函数,如果一页读完,则读取下一页 */
90 uchar read_from_IC()
91 {
92 1 uchar stat;
93 1 uchar tmp;
94 1
95 1 /* 检查IC卡芯片是否忙 */
96 1 stat = IC_stat();
97 1 while ((stat&0x80)==0x00);
98 1
99 1 /* 从主内存页中读出数据 */
100 1 P1_1 = 0; // 使能IC卡芯片;/cs=0
101 1 write_spi(MM_PAGE_READ) ; // 写入主内存页读指令代码
102 1 tmp = (uchar)(page_addr>>7);
103 1 write_spi(tmp); // 写入4位保留位加上11位页地址的高4位
104 1 tmp = (uchar)(page_addr<<1)|((uchar)(page_start_addr>>8)&0x01);
105 1 write_spi(tmp); // 写入11位页地址的低7位和9位页起始字节地址的最高位
106 1 tmp = (uchar)(page_start_addr);
107 1 write_spi(tmp); // 写入9位页起始字节地址的低8位
108 1 write_spi(0x00) ; // 写入8位无关位
109 1 write_spi(0x00) ; // 写入8位无关位
110 1 write_spi(0x00) ; // 写入8位无关位
111 1 write_spi(0x00) ; // 再写入8位无关位,共写入32位无关位
112 1 write_spi(0xff) ; // 写入8位无意义值以确保完成一字节数据的读出
113 1 P1_1 = 1; // 禁用IC卡芯片;结束主内存页读指令
114 1
115 1 page_start_addr++; // 下一页中起始字节地址
116 1
117 1 /* 如果读完一页,则读取下一页 */
C51 COMPILER V7.02b ICRDWR 12/10/2005 19:53:55 PAGE 3
118 1 if (page_start_addr > 263)
119 1 {
120 2 page_start_addr = 0; // 页起始字节地址重置0
121 2 if (page_addr < 2047) // 如果主内存页没有读完
122 2 page_addr++; // 下一页地址
123 2 }
124 1
125 1 return SPDR; // 返回读出数据
126 1 }
127
128 /* 主函数 */
129 void main()
130 {
131 1 uchar i;
132 1
133 1 P1_0 = 1; // /RST引脚置高
134 1
135 1 /* SPIE=0,SPE=1,DORD=0,MSTR=1,CPOL=CPHA=1,SPR1=0,SPR0=1*/
136 1 SPCR=0x5d;
137 1
138 1 buf_start_addr = 0;
139 1 page_start_addr = 0;
140 1 page_addr = 0;
141 1
142 1 /* 获取需要写入IC卡的数据,存放在data_in[]中 */
143 1 getdata();
144 1
145 1 /* 将data_in[]中存放数据写入IC卡 */
146 1 for (i=0;i<DATA_IN_MAX_LEN;i++)
147 1 {
148 2 write_to_IC(data_in[i]);
149 2 delay(2); // 延时2ms
150 2 }
151 1
152 1 delay(10); // 延时10ms
153 1
154 1 buf_start_addr = 0;
155 1 page_start_addr = 0;
156 1 page_addr = 0;
157 1
158 1 /* 数据读出IC卡,存放在data_out[]中 */
159 1 for (i=0;i<DATA_OUT_MAX_LEN;i++)
160 1 {
161 2 data_out[i] = read_from_IC();
162 2 delay(2); // 延时2ms
163 2 }
164 1
165 1 while(1);
166 1 }
167
168
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 377 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 22 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILER V7.02b ICRDWR 12/10/2005 19:53:55 PAGE 4
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -