📄 wl006.lst
字号:
C51 COMPILER V7.08 WL006 11/03/2004 11:01:25 PAGE 1
C51 COMPILER V7.08, COMPILATION OF MODULE WL006
OBJECT MODULE PLACED IN wl006.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE wl006.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************************************
2 * *
3 * File : wl006.c *
4 * Date : 2004-1-5 *
5 * Version : 1.0 *
6 * *
7 ********************************************************************************
8 * Descriptoon: *
9 * AT93C46读写演示程序 *
10 * 从地址0x00开始写入数据"www.mcu-diy.com", 然后再读出 *
11 * *
12 * 注意:在擦除和写入数据之前,必须先写入EWEN指令 *
13 * *
14 * *
15 *******************************************************************************/
16 #include <reg51.h>
17 #include <intrins.h>
18
19 //define OP code
20 #define OP_EWEN_H 0x00 // 00 write enable
21 #define OP_EWEN_L 0x60 // 11X XXXX write enable
22 #define OP_EWDS_H 0x00 // 00 disable
23 #define OP_EWDS_L 0x00 // 00X XXXX disable
24
25 #define OP_WRITE_H 0x40 // 01 A6-A0 write data
26 #define OP_READ_H 0x80 // 10 A6-A0 read data
27
28 #define OP_ERASE_H 0xc0 // 11 A6-A0 erase a word
29
30 #define OP_ERAL_H 0x00 // 00 erase all
31 #define OP_ERAL_L 0x40 // 10X XXXX erase all
32 #define OP_WRAL_H 0x00 // 00 write all
33 #define OP_WRAL_L 0x20 // 01X XXXX write all
34
35
36 //define pin
37 sbit CS = P1^4;
38 sbit SK = P1^0;
39 sbit DI = P1^2;
40 sbit DO = P1^3;
41
42 unsigned char code dis_code[] = {0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e,0xff};
43
44 void start();
45 void ewen();
46 void ewds();
47 void erase();
48 void write(unsigned char addr, unsigned char indata);
49 unsigned char read(unsigned char addr);
50 void inop(unsigned char op_h, unsigned char op_l);
51 void shin(unsigned char indata);
52 unsigned char shout();
53 void delayms(unsigned char ms);
54
55 main()
C51 COMPILER V7.08 WL006 11/03/2004 11:01:25 PAGE 2
56 {
57 1 unsigned char i;
58 1 CS = 0; //初始化端口
59 1 SK = 0;
60 1 DI = 1;
61 1 DO = 1;
62 1
63 1 ewen(); // 使能写入操作
64 1 erase(); // 擦除全部内容
65 1
66 1 for(i = 0 ; i < 8; i++) //写入显示代码到AT93C46
67 1 {
68 2 write(i, dis_code[i]);
69 2 }
70 1
71 1 ewds(); // 禁止写入操作
72 1
73 1 i = 0;
74 1 while(1)
75 1 {
76 2 P0 = read(i); // 循环读取AT93C46内容,并输出到P0口
77 2 i++;
78 2 i &= 0x07; // 循环读取地址为0x00~0x07
79 2 delayms(250);
80 2 }
81 1 }
82
83
84 void write(unsigned char addr, unsigned char indata)
85 // 写入数据indata到addr
86 {
87 1 inop(OP_WRITE_H, addr); // 写入指令和地址
88 1 shin(indata);
89 1 CS = 0;
90 1 delayms(10); // Twp
91 1 }
92
93 unsigned char read(unsigned char addr)
94 // 读取addr处的数据
95 {
96 1 unsigned char out_data;
97 1 inop(OP_READ_H, addr); // 写入指令和地址
98 1 out_data = shout();
99 1 CS = 0;
100 1 return out_data;
101 1 }
102
103 void ewen()
104 {
105 1 inop(OP_EWEN_H, OP_EWEN_L);
106 1 CS= 0;
107 1 }
108
109 void ewds()
110 {
111 1 inop(OP_EWDS_H, OP_EWDS_L);
112 1 CS= 0;
113 1 }
114
115 void erase()
116 {
117 1 inop(OP_ERAL_H, OP_ERAL_L);
C51 COMPILER V7.08 WL006 11/03/2004 11:01:25 PAGE 3
118 1 delayms(30);
119 1 CS = 0;
120 1 }
121
122
123 void inop(unsigned char op_h, unsigned char op_l)
124 //移入op_h的高两位和op_l的低7位
125 //op_h为指令码的高两位
126 //op_l为指令码的低7位或7位地址
127 {
128 1
129 1 unsigned char i;
130 1
131 1 SK = 0; // 开始位
132 1 DI = 1;
133 1 CS = 1;
134 1 _nop_();
135 1 _nop_();
136 1 SK = 1;
137 1 _nop_();
138 1 _nop_();
139 1 SK = 0; // 开始位结束
140 1
141 1 DI = (bit)(op_h & 0x80); // 先移入指令码高位
142 1 SK = 1;
143 1 op_h <<= 1;
144 1 SK = 0;
145 1
146 1 DI = (bit)(op_h & 0x80); // 移入指令码次高位
147 1 SK = 1;
148 1 _nop_();
149 1 _nop_();
150 1 SK = 0;
151 1
152 1 // 移入余下的指令码或地址数据
153 1 op_l <<= 1;
154 1 for(i = 0; i < 7; i++)
155 1 {
156 2 DI = (bit)(op_l & 0x80); // 先移入高位
157 2 SK = 1;
158 2 op_l <<= 1;
159 2 SK = 0;
160 2 }
161 1 DI = 1;
162 1 }
163
164
165 void shin(unsigned char indata)
166 //移入数据
167 {
168 1 unsigned char i;
169 1 for(i = 0; i < 8; i++)
170 1 {
171 2 DI = (bit)(indata & 0x80); // 先移入高位
172 2 SK = 1;
173 2 indata <<= 1;
174 2 SK = 0;
175 2 }
176 1 DI = 1;
177 1 }
178
179 unsigned char shout(void)
C51 COMPILER V7.08 WL006 11/03/2004 11:01:25 PAGE 4
180 // 移出数据
181 {
182 1 unsigned char i, out_data;
183 1 for(i = 0; i < 8; i++)
184 1 {
185 2 SK = 1;
186 2 out_data <<= 1;
187 2 SK = 0;
188 2 out_data |= (unsigned char)DO;
189 2 }
190 1 return(out_data);
191 1 }
192
193 void delayms(unsigned char ms)
194 // 延时子程序
195 {
196 1 unsigned char i;
197 1 while(ms--)
198 1 {
199 2 for(i = 0; i < 120; i++);
200 2 }
201 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 250 ----
CONSTANT SIZE = 8 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 2
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 + -