📄 isp.lst
字号:
C51 COMPILER V7.02a ISP 09/20/2005 15:10:01 PAGE 1
C51 COMPILER V7.02a, COMPILATION OF MODULE ISP
OBJECT MODULE PLACED IN ISP.OBJ
COMPILER INVOKED BY: D:\Program Files\Keilc7\C51\BIN\C51.EXE ISP.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #ifdef __C51__
2 #include <reg51.h> /* special function register declarations */#endif
3 #include "ISP.h"
4 #include "MAINLOOP.H"
5 #include <intrins.h>
6
7 unsigned char OutBuf[4],InBuf[4];
8 sbit RST=P1^4;
9 sbit MISO=P1^5;
10 sbit MOSI=P1^0;
11 sbit SCK=P1^1;
12 sbit LE=P3^2;
13 sbit OE=P3^1;
14
15 void Delay(int time)//Delay(1)延时54us,time每加1则16us
16 {
17 1 int n;
18 1 for(n=0;n<=time;n++)//延时
19 1 {}
20 1 }
21
22 void Nop()
23 {
24 1 _nop_();
25 1 _nop_();
26 1 _nop_();
27 1 _nop_();
28 1
29 1 }
30
31 void SetSck(BOOL bLogic)
32 {
33 1 if(bLogic)
34 1 SCK=1;
35 1 else
36 1 SCK=0;
37 1 LE=0;
38 1 Nop();
39 1 LE=1;
40 1 }
41
42 void SetRst(BOOL bLogic)
43 {
44 1
45 1 if(bLogic)
46 1 RST=1;
47 1 else
48 1 RST=0;
49 1 LE=0;
50 1 Nop();
51 1 LE=1;
52 1 }
53
54 void SetMosi(BOOL bLogic)
55 {
C51 COMPILER V7.02a ISP 09/20/2005 15:10:01 PAGE 2
56 1
57 1 if(bLogic)
58 1 MOSI=1;
59 1 else
60 1 MOSI=0;
61 1 LE=0;
62 1 Nop();
63 1 LE=1;
64 1 }
65
66 BOOL GetMiso()//得到MISO引脚的电平
67 {
68 1 LE=0;
69 1 Nop();
70 1 LE=1;
71 1 return MISO;
72 1 }
73
74
75 void SckBytes(BYTE nBytes)//通过下载线与器件通信
76 {
77 1 BYTE n;
78 1 for(n=0;n<nBytes;n++)
79 1 {
80 2 SetSck(0);
81 2 SetMosi((OutBuf[n] & 0x80));//SCK为低电平时,发送一位
82 2 SetSck(1);
83 2 if(GetMiso())//SCK为搞电平时,接收一位
84 2 {
85 3
86 3 InBuf[n]=InBuf[n] | 0x80;
87 3 }
88 2 else
89 2 {
90 3 InBuf[n]=InBuf[n] & 0x7f;
91 3 }
92 2 SetSck(0);
93 2 SetMosi((OutBuf[n] & 0x40));
94 2 SetSck(1);
95 2 if(GetMiso())
96 2 {
97 3
98 3 InBuf[n]=InBuf[n] | 0x40;
99 3 }
100 2 else
101 2 {
102 3 InBuf[n]=InBuf[n] & 0xbf;
103 3 }
104 2 SetSck(0);
105 2 SetMosi((OutBuf[n] & 0x20));
106 2 SetSck(1);
107 2 if(GetMiso())
108 2 {
109 3
110 3 InBuf[n]=InBuf[n] | 0x20;
111 3 }
112 2 else
113 2 {
114 3 InBuf[n]=InBuf[n] & 0xdf;
115 3 }
116 2 SetSck(0);
117 2
C51 COMPILER V7.02a ISP 09/20/2005 15:10:01 PAGE 3
118 2 SetMosi((OutBuf[n] & 0x10));
119 2 SetSck(1);
120 2 if(GetMiso())
121 2 {
122 3
123 3 InBuf[n]=InBuf[n] | 0x10;
124 3 }
125 2 else
126 2 {
127 3 InBuf[n]=InBuf[n] & 0xef;
128 3 }
129 2 SetSck(0);
130 2
131 2 SetMosi((OutBuf[n] & 0x08));
132 2 SetSck(1);
133 2 if(GetMiso())
134 2 {
135 3
136 3 InBuf[n]=InBuf[n] | 0x08;
137 3 }
138 2 else
139 2 {
140 3 InBuf[n]=InBuf[n] & 0xf7;
141 3 }
142 2 SetSck(0);
143 2
144 2 SetMosi((OutBuf[n] & 0x04));
145 2 SetSck(1);
146 2 if(GetMiso())
147 2 {
148 3
149 3 InBuf[n]=InBuf[n] | 0x04;
150 3 }
151 2 else
152 2 {
153 3 InBuf[n]=InBuf[n] & 0xfb;
154 3 }
155 2 SetSck(0);
156 2
157 2 SetMosi((OutBuf[n] & 0x02));
158 2 SetSck(1);
159 2 if(GetMiso())
160 2 {
161 3
162 3 InBuf[n]=InBuf[n] | 0x02;
163 3 }
164 2 else
165 2 {
166 3 InBuf[n]=InBuf[n] & 0xfd;
167 3 }
168 2 SetSck(0);
169 2
170 2 SetMosi((OutBuf[n] & 0x01));
171 2 SetSck(1);
172 2 if(GetMiso())
173 2 {
174 3
175 3 InBuf[n]=InBuf[n] | 0x01;
176 3 }
177 2 else
178 2 {
179 3 InBuf[n]=InBuf[n] & 0xfe;
C51 COMPILER V7.02a ISP 09/20/2005 15:10:01 PAGE 4
180 3 }
181 2 SetSck(0);
182 2 }
183 1 }
184
185
186
187 void PreparePro()//编程前的准备工作
188 {
189 1 SetRst(0);//RST置低电平
190 1 SetMosi(0);//MOSI置低电平
191 1 SetSck(0);//SCK置低电平
192 1 Delay(10);
193 1 SetRst(1);
194 1 OE=0;
195 1 LE=1;
196 1 Delay(1000);
197 1 OutBuf[0]=0xac;
198 1 OutBuf[1]=0x53;
199 1 SckBytes(4);
200 1 }
201
202 void ProOver()//编程结束后的工作
203 {
204 1 SetRst(0);//RST置低电平,这样单片机就开始运行了
205 1 SetMosi(1);
206 1 SetSck(1);
207 1 OE=1;
208 1 }
209
210 void Erase()//擦除器件
211 {
212 1 OutBuf[0]=0xac;//根据器件手册上规定的命令协议
213 1 OutBuf[1]=0x80;
214 1 SckBytes(4);//向器件发编程命令
215 1 Delay(31247); //擦除器件要500ms
216 1 }
217
218 void ReadSign(unsigned char *pBuf)//读特征字
219 {
220 1 OutBuf[0]=0x28;//根据器件手册上规定的命令协议
221 1 OutBuf[1]=0x00;
222 1 OutBuf[2]=0x00;
223 1 OutBuf[3]=0x00;
224 1 SckBytes(4);//向器件发编程命令
225 1 pBuf[0]=InBuf[3];//第1个特征字
226 1 OutBuf[1]=0x01;
227 1 SckBytes(4);
228 1 pBuf[1]=InBuf[3];//第2个特征字
229 1 OutBuf[1]=0x02;
230 1 SckBytes(4);
231 1 pBuf[2]=InBuf[3];//第3个特征字
232 1 }
233
234 unsigned char Read(int nAddr)//读一个单元
235 {
236 1 OutBuf[0]=0x20;//根据器件手册上规定的命令协议
237 1 OutBuf[1]=nAddr/256;//高地址
238 1 OutBuf[2]=nAddr%256;//低地址
239 1 OutBuf[3]=0x00;
240 1 SckBytes(4);//向器件发编程命令
241 1 return InBuf[3];
C51 COMPILER V7.02a ISP 09/20/2005 15:10:01 PAGE 5
242 1 }
243
244 BOOL Write(BYTE Data,int nAddr)//写一个单元
245 {
246 1 // int nTimeOut=0;
247 1 OutBuf[0]=0x40;//根据器件手册上规定的命令协议
248 1 OutBuf[1]=nAddr/256;//高地址
249 1 OutBuf[2]=nAddr%256;//低地址
250 1 OutBuf[3]=Data;
251 1 SckBytes(4);//向器件发编程命令
252 1 /* while(Read(nAddr)!=Data)//效验:循环读,直到读出与写入相同的数
253 1 {
254 1 nTimeOut++;
255 1 if(nTimeOut>=1000)//如果超时了,写入失败
256 1 return FALSE;
257 1 }*/
258 1 return TRUE;
259 1 }
260
261 BOOL LockBit(UCHAR nBit)
262 {
263 1 if(nBit>=1)//ComBuf[2]为锁定位
264 1 {
265 2 OutBuf[0]=0xac;//根据器件手册上规定的命令协议
266 2 OutBuf[1]=0xe1;
267 2 SckBytes(4);
268 2 Delay(60);
269 2 }
270 1 if(nBit>=2)
271 1 {
272 2 PreparePro();
273 2 OutBuf[0]=0xac;//根据器件手册上规定的命令协议
274 2 OutBuf[1]=0xe2;
275 2 SckBytes(4);
276 2 Delay(60);
277 2 }
278 1 if(nBit==3)
279 1 {
280 2 PreparePro();
281 2 OutBuf[0]=0xac;//根据器件手册上规定的命令协议
282 2 OutBuf[1]=0xe3;
283 2 SckBytes(4);
284 2 Delay(60);
285 2 }
286 1 return TRUE;
287 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 690 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 1
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -