?? 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 + -