📄 main.lst
字号:
C51 COMPILER V7.50 MAIN 10/21/2008 14:46:08 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <atmel\REG2051.H>
2 #include <INTRINS.H>
3
4 //引脚定义,可以自行定义使用
5 #define IC_P1 P1_1 //cs
6 #define IC_P2 P1_2 //sk
7 #define IC_P3 P1_3 //DI
8 #define IC_P4 P1_4 //DO
9 #define IC_P5 P1_5 //GND
10 #define IC_P6 P1_6 //nc
11 #define IC_P7 P1_7 //nc
12 #define LED P3_7 //VCC
13
14 /*这个需要改,因为25xx320指令不一样
15 #define EWEN 0x98
16 #define ERAL 0x90
17 #define EWDS 0x80 //93CXX用 0x98 EWEN写允许 0x80EWDS写禁止 0x90擦除
18 */
19 #define EWEN 0x06 //0x06 WREN写允许 25XX用
20 //#define ERAL 0x90 //0x90擦除,25XX没有这个
21 #define EWDS 0x04 //0x04 WRDI写禁止
22
23
24 static unsigned char Pack[4]; //数据包数组
25 static unsigned char PN = 0; //接收指针
26
27
28 void InitCom(void); //串口初始化 晶振为11.0592M 方式1 波特率57600
29 //void InitIC(void);
30 void ComOutChar(unsigned char OutData); //向串口输出一个字符(非中断方式)
31 void Init_93C(void); //引脚初始化
32 void Read_93C(unsigned char AH,AL); //读
33 void Write_93C(unsigned char AH,AL,Data); //写
34 void COM_93C(unsigned char Data); //93C命令函数
35 void Erasure_93C(void); //擦除
36
37 void main(void)
38 {
39 1 unsigned int TempCyc;
40 1
41 1 InitCom();
42 1
43 1 while(1)
44 1 {
45 2 for (TempCyc=0; TempCyc<30000; TempCyc++) //状态灯闪
46 2 LED = 1;
47 2 for (TempCyc=0; TempCyc<20000; TempCyc++)
48 2 LED = 0;
49 2 }
50 1 }
51
52 //串口初始化 晶振为11.0592M 方式1 波特率57600
53 void InitCom(void)
54 {
55 1 SCON = 0x50; //串口方式1,允许接收
C51 COMPILER V7.50 MAIN 10/21/2008 14:46:08 PAGE 2
56 1 TMOD = 0x21; //定时器1定时方式2,定时0为模式1,16位模式
57 1 TCON = 0x40; //设定时器1开始计数
58 1 TH1 = 255; //设波特率为57600
59 1 TL1 = 255;
60 1 PCON = 0x80; //波特率加倍控制,SMOD位
61 1 RI = 0; //清收发标志
62 1 TI = 0;
63 1 TR1 = 1; //启动定时器
64 1 EA = 1; //开总中断
65 1 ES = 1; //开串口中断
66 1 }
67
68 //向串口输出一个字符(非中断方式)
69 void ComOutChar(unsigned char OutData)
70 {
71 1 SBUF = OutData; //输出字符
72 1 while(!TI); //空语句判断字符是否发完
73 1 TI = 0; //清TI
74 1 }
75
76 //串口接收中断
77 void ComInINT(void) interrupt 4
78 {
79 1 if (RI) //判断是不是收完字符
80 1 {
81 2 RI = 0; //RI清零
82 2 Pack[PN] = SBUF; //存数据
83 2 PN++; //指针加1
84 2 if (PN == 4)
85 2 {
86 3 PN = 0; //指针清零 一帧数据收完后
87 3 switch (Pack[0])
88 3 {
89 4 case 0: Read_93C(Pack[1],Pack[2]); break;
90 4 case 1: Write_93C(Pack[1],Pack[2],Pack[3]); break;
91 4 case 2: Erasure_93C(); break;
92 4 }
93 3 }
94 2 }
95 1
96 1 }
97
98 ////////MicroWire 93CXX芯片函数////////////////
99 ////////SPI 25XX320芯片函数////////////////
100 //引脚初始化
101 void Init_93C(void)
102 {
103 1 IC_P5 = 0; //GND
104 1 IC_P1 = 0; //CS
105 1 IC_P2 = 0; //SK
106 1 IC_P3 = 0; //DI
107 1 IC_P4 = 1; //DO 置1让MCU为可读
108 1 IC_P6 = 0; //选择为8位数据模式
109 1 IC_P7 = 0; //
110 1 }
111
112 //93C命令函数
113 void COM_93C(unsigned char Data)
114 {
115 1 unsigned char TempCyc;
116 1 unsigned int TempCycB;
117 1
C51 COMPILER V7.50 MAIN 10/21/2008 14:46:08 PAGE 3
118 1 TempCycB = Data; //Data: 0x98 EWEN写允许 0x80EWDS写禁止 0x90擦除
119 1
120 1 Init_93C(); //初始化引脚
121 1
122 1 IC_P1 = 1; //CS
123 1 // for(TempCyc=10; TempCyc!=0; TempCyc--) //94C64的8位模式起始位+命令代码+地址位是共10位
124 1 for(TempCyc=8; TempCyc!=0; TempCyc--) //25XX320 SI 数据
125 1 {
126 2 IC_P3 = Data & 0x80; //数据 DI
127 2 IC_P2 = 1; //SK
128 2 _nop_();
129 2 IC_P2 = 0; //时钟 /SK
130 2 Data <<= 1; //左移
131 2 }
132 1
133 1 IC_P1 = 0; //CS
134 1
135 1 if (TempCycB==ERAL) //擦除命令
*** ERROR C202 IN LINE 135 OF MAIN.C: 'ERAL': undefined identifier
136 1 {
137 2 IC_P2 = 1; //SK
138 2 _nop_();
139 2 IC_P2 = 0; //SK
140 2 IC_P1 = 1; //CS
141 2 _nop_();
142 2 for (TempCycB=0; TempCycB<0xFFFF; TempCycB++)
143 2 {
144 3 IC_P2 = 1;
145 3 _nop_();
146 3 _nop_();
147 3 IC_P2 = 0;
148 3 if (IC_P4)
149 3 {
150 4 break; //检测就绪信号
151 4 }
152 3 }
153 2 IC_P1 = 0;
154 2 if (TempCycB!=0)
155 2 ComOutChar(0); //成功返回0
156 2 else
157 2 ComOutChar(1); //失败返回1
158 2 }
159 1 }
160
161 //擦除
162 void Erasure_93C(void)
163 {
164 1 COM_93C(EWEN);
165 1 // COM_93C(ERAL);
166 1 Write_93C(0x00,0x00,0xFF);
167 1
168 1 COM_93C(EWDS);
169 1 }
170
171 //写
172 void Write_93C(unsigned char AH,AL,SData)
173 {
174 1 unsigned int Data=0, TempCycB;
175 1
176 1 COM_93C(EWEN); //写允许
177 1
178 1 Init_93C();
C51 COMPILER V7.50 MAIN 10/21/2008 14:46:08 PAGE 4
179 1
180 1 IC_P1 = 1; //CS
181 1
182 1 Data = AH*0x100+AL;
183 1 // Data = Data<<6; //地址组合、移动
184 1 // Data |= 0xA000; //加上起始位和操作码
185 1 for(TempCycB=16; TempCycB!=0; TempCycB--) //发送地址码
186 1 {
187 2 IC_P3 = Data & 0x8000; //数据 DI
188 2 IC_P2 = 1; //SK
189 2 _nop_();
190 2 IC_P2 = 0; //时钟 /SK
191 2 Data <<= 1; //左移
192 2 }
193 1
194 1 Data = SData*0x100; //数据
195 1
196 1 for(TempCycB=8; TempCycB!=0; TempCycB--) //发送8位数据
197 1 {
198 2 IC_P3 = Data & 0x8000; //数据 DI
199 2 IC_P2 = 1; //SK
200 2 _nop_();
201 2 IC_P2 = 0; //时钟 /SK
202 2 Data <<= 1; //左移
203 2 }
204 1
205 1 IC_P1 = 0; //CS
206 1
207 1 IC_P2 = 1; //SK
208 1 _nop_();
209 1 IC_P2 = 0; //SK
210 1 IC_P1 = 1; //CS
211 1 _nop_();
212 1 for (TempCycB=0; TempCycB<0xFFFF; TempCycB++)
213 1 {
214 2 IC_P2 = 1;
215 2 _nop_();
216 2 _nop_();
217 2 IC_P2 = 0;
218 2 if (IC_P4)
219 2 {
220 3 break; //检测就绪信号
221 3 }
222 2 }
223 1 if (TempCycB!=0) //当TempCycB=0说明没有出现过BUY
224 1 ComOutChar(0); //成功返回
225 1 else
226 1 ComOutChar(1); //失败返回1
227 1
228 1 COM_93C(EWDS); //写禁止
229 1 }
230
231 //读
232 void Read_93C(unsigned char AH,AL)
233 {
234 1 unsigned char TempCycB;
235 1 unsigned int Data=0;
236 1
237 1 Init_93C();
238 1
239 1 IC_P1 = 1; //CS
240 1
C51 COMPILER V7.50 MAIN 10/21/2008 14:46:08 PAGE 5
241 1 Data = AH*0x100+AL;
242 1 // Data = Data<<6; //地址组合、移动
243 1 // Data |= 0xC000; //加上起始位和操作码
244 1 for(TempCycB=8; TempCycB!=0; TempCycB--) //地址码
245 1 {
246 2 IC_P3 = Data & 0x8000; //数据 DI
247 2 IC_P2 = 1; //SK
248 2 _nop_();
249 2 IC_P2 = 0; //时钟 /SK
250 2 Data <<= 1; //左移
251 2 }
252 1
253 1 for(TempCycB=0; TempCycB<8; TempCycB++) //读数据
254 1 {
255 2 IC_P2 = 1; //SK
256 2 _nop_();
257 2 _nop_();
258 2 Pack[3] = Pack[3] << 1;
259 2 if (IC_P4)
260 2 Pack[3]++;
*** ERROR C187 IN LINE 260 OF MAIN.C: not an lvalue
261 2 IC_P2 = 0; //时钟 /SK1
262 2 }
263 1 IC_P1 = 0; //CS
264 1
265 1 ComOutChar(Pack[3]); //返回
266 1 }
267
268
269 void WIPCHK(void) //reentrant //检查WIP位,判断是否写入完成
270 {
271 1 unsigned char Temp,TempCyc;
272 1
273 1 for(TempCyc=0;TempCyc<50;TempCyc++)
274 1 {
275 2 Temp = RSDR(); //读状态寄存器
276 2 if (Temp&0x01==0)
277 2 TempCyc = 50;
278 2 }
279 1 }
C51 COMPILATION COMPLETE. 0 WARNING(S), 2 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -