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