📄 at93c46.lst
字号:
C51 COMPILER V7.50 AT93C46 01/10/2007 15:41:09 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE AT93C46
OBJECT MODULE PLACED IN at93c46.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE at93c46.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //注意:该程序考虑的是8位数据的情况。
2 //通过DATASHEET发现,AT93C46的读操作每次只能读、写一个字节。
3 #include"reg51.h"
4 #include"intrins.h"
5 #define uchar unsigned char
6 #define uint unsigned int
7 sbit cs_93c46=P3^6; //高电平有效
8 sbit ck_93c46=P3^7; //上升沿数据输入、输出
9 sbit di_93c46=P3^4;
10 sbit do_93c46=P3^5;
11 uchar code READ_93C46=0x06;
12 uchar code EWEN_93C46=0x04;
13 uchar code ERAL_93C46=0x04;
14 uchar code WRITE_93C46=0x05;
15 void wr_addr_93c46(uchar addr);
16 //uchar rd_byte_93c46(uchar addr);
17 void wr_code_93c46(uchar op_code);
18 uchar rd_93c46(void);
19 void ewen(void);
20 void erase_all(void);
21 void wr_93c46(uchar dat);
22 void delay_1ms(void);
23 void delay_nms(uint n);
24
25 uchar buf_4byte[4]={0,0,0,0};
26
27
28 void main(void)
29 {
30 1 uchar i=0;
31 1 cs_93c46=1; //向AT93C46输入起始位和操作码110
32 1 di_93c46=0;
33 1 do_93c46=0;
34 1 _nop_();
35 1
36 1
37 1 //ewen();
38 1 /******************************
39 1 cs_93c46=1;
40 1 wr_code_93c46(WRITE_93C46);
41 1 wr_addr_93c46(0x00);
42 1 wr_93c46(0xaa);
43 1 cs_93c46=0;
44 1 delay_1ms();
45 1 delay_nms(10); 注意:对AT93C46的写操作,写完所有的数据之后,片选清零,且持续至少10ms
46 1 //_nop_();
47 1 *******************************/
48 1 //erase_all();
49 1
50 1
51 1
52 1 //-----------------------------
53 1 while(i<4)
54 1 {
55 2 cs_93c46=1;
C51 COMPILER V7.50 AT93C46 01/10/2007 15:41:09 PAGE 2
56 2 wr_code_93c46(READ_93C46);
57 2 wr_addr_93c46(i);
58 2 buf_4byte[i]=rd_93c46();
59 2 cs_93c46=0;//取消片选
60 2 i++;
61 2 }
62 1
63 1 //ewen();
64 1 //erase_all();
65 1 //cs_93c46=0;
66 1 _nop_();
67 1 }
68 /**********************
69 //以下是子函数体
70 void delay_4us(void)
71 {
72 _nop_();
73 _nop_();
74 _nop_();
75 _nop_();
76 }
77 ************************/
78
79 void wr_code_93c46(uchar op_code)
80 {
81 1 uchar i=3;
82 1 op_code<<=5;
83 1 while(i>0)
84 1 {
85 2 ck_93c46=0;
86 2 if((op_code&0x80)==0)
87 2 di_93c46=0;
88 2 else
89 2 di_93c46=1;
90 2 ck_93c46=1;
91 2 op_code<<=1;
92 2 i--;
93 2 }
94 1 }
95
96 //功能:向AT93C46写入任意存储字节的7位地址
97 void wr_addr_93c46(uchar addr)
98 {
99 1 uchar i=7;
100 1 addr<<=1;
101 1 while(i>0)
102 1 {
103 2 ck_93c46=0;
104 2 if((addr&0x80)==0)
105 2 di_93c46=0;
106 2 else
107 2 di_93c46=1;
108 2 ck_93c46=1;
109 2 addr<<=1;
110 2 i--;
111 2 }
112 1 }
113 //功能:从AT93C46读出一个字节的数据,仅仅是读操作。
114 uchar rd_93c46(void)
115 {
116 1 uchar temp=0;
117 1 uchar i=8;
C51 COMPILER V7.50 AT93C46 01/10/2007 15:41:09 PAGE 3
118 1 while(i>0)
119 1 {
120 2 ck_93c46=0;
121 2 temp<<=1;
122 2 ck_93c46=1;
123 2 _nop_();
124 2 if(do_93c46==1)
125 2 temp|=0x01;
126 2 i--;
127 2 }
128 1 return(temp);
129 1 }
130
131 //功能:从AT93C46读出一个字节的数据,包含了之前的写入起始位、操作码和地址。
132 /***********************************
133 uchar rd_byte_93c46(uchar addr)
134 {
135 //下面三段程序完成写入起始位和操作码
136 uchar i;
137 uchar temp;
138 cs_93c46=1; //向AT93C46输入起始位和操作码110
139 ck_93c46=0;
140 di_93c46=0;
141 do_93c46=0;
142 _nop_();
143 di_93c46=1;
144 ck_93c46=1;
145 _nop_();
146 ck_93c46=0;
147 di_93c46=1;
148 ck_93c46=1;
149 _nop_();
150 ck_93c46=0;
151 di_93c46=0;
152 ck_93c46=1;
153 _nop_();
154 addr<<=1;
155 i=7;
156 while(i>0)
157 {
158 ck_93c46=0;
159 if((addr&0x80)==0)
160 di_93c46=0;
161 else
162 di_93c46=1;
163 ck_93c46=1;
164 _nop_();
165 addr<<=1;
166 i--;
167 }
168 i=8;
169 temp=0;
170 while(i>0)
171 {
172 ck_93c46=0;
173 temp<<=1;
174 ck_93c46=1;
175 _nop_();
176 if(do_93c46==1)
177 temp|=0x01;
178 i--;
179 }
C51 COMPILER V7.50 AT93C46 01/10/2007 15:41:09 PAGE 4
180 ck_93c46=0;
181 _nop_();
182 cs_93c46=0;
183 return(temp);
184 }
185 ***********************/
186 /*****************************************
187 原型:void wr_93c46(uchar dat)
188 行参:uchar dat
189 返回值:无
190 功能:向AT93c46写入一个字节,纯粹的写操作。
191 ********************************************/
192
193 void wr_93c46(uchar dat)
194 {
195 1 uchar i=8;
196 1 while(i>0)
197 1 {
198 2 ck_93c46=0;
199 2 if((dat&0x80)==0)
200 2 di_93c46=0;
201 2 else
202 2 di_93c46=1;
203 2 ck_93c46=1;
204 2 dat<<=1;
205 2 i--;
206 2 }
207 1 }
208
209 /*****************************************
210 原型:void erase_all(void)
211 行参:无
212 返回值:无
213 功能:擦除AT93C46的所有内容
214 ********************************************/
215
216 void erase_all(void)
217 {
218 1 cs_93c46=1;
219 1 di_93c46=0;
220 1 do_93c46=0;
221 1 _nop_();
222 1 wr_code_93c46(ERAL_93C46);
223 1 wr_addr_93c46(0x40);
224 1 cs_93c46=0;
225 1 }
226
227 /*****************************************
228 原型:void ewen(void)
229 行参:无
230 返回值:无
231 功能:向AT93C46写入擦写命令,使之可以写入新的内容
232 注意:该函数包含了完整的开始和结束条件
233 ********************************************/
234 void ewen(void)
235 {
236 1 cs_93c46=1;
237 1 di_93c46=0;
238 1 do_93c46=0;
239 1 _nop_();
240 1 wr_code_93c46(EWEN_93C46);
241 1 wr_addr_93c46(0x60);
C51 COMPILER V7.50 AT93C46 01/10/2007 15:41:09 PAGE 5
242 1 cs_93c46=0;
243 1 }
244 /************************************************************
245 原型:void delay_1ms(void)
246 行参:无
247 返回值:无
248 功能:延时大约1ms
249 ************************************************************/
250
251 void delay_1ms(void)
252 {
253 1 uchar i;
254 1 for(i=125;i>0;i--);
255 1 }
256 /******************************
257 原型:void delay_nms(uint n)
258 行参:uint n
259 返回值:无
260 功能:延时n ms
261 *****************************/
262 void delay_nms(uint n)
263 {
264 1 uchar i;
265 1 for(;n>0;n--)
266 1 {
267 2 for(i=125;i>0;i--)
268 2 {
269 3 ;
270 3 }
271 2 }
272 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 221 ----
CONSTANT SIZE = 4 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 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 + -