📄 ex08.lst
字号:
C51 COMPILER V7.03 EX08 05/23/2005 23:20:59 PAGE 1
C51 COMPILER V7.03, COMPILATION OF MODULE EX08
OBJECT MODULE PLACED IN ex08.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ex08.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*******************************************************************************
2 Title: 演示程序8 - 读写AT93C46 *
3 Name: ex08.c *
4 Date: 2005-5-21 *
5 Ver: 1.0 *
- *
6 web: http://www.mcustudy.com *
7 ********************************************************************************
8 *
9 * AT93C46读写演示程序 *
10 * 从地址0x00开始写入数据, 然后再读出 *
11 * *
12 * 注意:在擦除和写入数据之前,必须先写入EWEN指令 *
- *
13 ********************************************************************************/
14
15 #include <reg51.h>
16 #include <intrins.h>
17
18 //define OP code
19 #define OP_EWEN_H 0x00 // 00 write enable
20 #define OP_EWEN_L 0x60 // 11X XXXX write enable
21 #define OP_EWDS_H 0x00 // 00 disable
22 #define OP_EWDS_L 0x00 // 00X XXXX disable
23
24 #define OP_ERAL_H 0x00 // 00 erase all
25 #define OP_ERAL_L 0x40 // 10X XXXX erase all
26 #define OP_WRAL_H 0x00 // 00 write all
27 #define OP_WRAL_L 0x20 // 01X XXXX write all
28
29 #define OP_WRITE_H 0x40 // 01 A6-A0 write data
30
31 #define OP_READ_H 0x80 // 10 A6-A0 read data
32
33 #define OP_ERASE_H 0xc0 // 11 A6-A0 erase a word
34
35
36 //define pin
37 sbit CS = P1^1;
38 sbit SK = P1^2;
39 sbit DI = P1^0;
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);
C51 COMPILER V7.03 EX08 05/23/2005 23:20:59 PAGE 2
54
55 main()
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 = 00;
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 // 写入数据indata到addr
84 void write(unsigned char addr, unsigned char indata)
85 {
86 1 inop(OP_WRITE_H, addr); // 写入指令和地址
87 1 shin(indata);
88 1 CS = 0;
89 1 delayms(10); // Twp
90 1 }
91
92
93 // 读取addr处的数据
94 unsigned char read(unsigned char 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()
C51 COMPILER V7.03 EX08 05/23/2005 23:20:59 PAGE 3
116 {
117 1 inop(OP_ERAL_H, OP_ERAL_L);
118 1 delayms(30);
119 1 CS = 0;
120 1 }
121
122
123 //移入op_h的高两位和op_l的低7位
124 //op_h为指令码的高两位
125 //op_l为指令码的低7位或7位地址
126 void inop(unsigned char op_h, unsigned char op_l)
127
128 {
129 1
130 1 unsigned char i;
131 1
132 1 SK = 0; // 开始位
133 1 DI = 1;
134 1 CS = 1;
135 1 _nop_();
136 1 _nop_();
137 1 SK = 1;
138 1 _nop_();
139 1 _nop_();
140 1 SK = 0; // 开始位结束
141 1
142 1 DI = (bit)(op_h & 0x80); // 先移入指令码高位
143 1 SK = 1;
144 1 op_h <<= 1;
145 1 SK = 0;
146 1
147 1 DI = (bit)(op_h & 0x80); // 移入指令码次高位
148 1 SK = 1;
149 1 _nop_();
150 1 _nop_();
151 1 SK = 0;
152 1
153 1 // 移入余下的指令码或地址数据
154 1 op_l <<= 1;
155 1 for(i = 0; i < 7; i++)
156 1 {
157 2 DI = (bit)(op_l & 0x80); // 先移入高位
158 2 SK = 1;
159 2 op_l <<= 1;
160 2 SK = 0;
161 2 }
162 1 DI = 1;
163 1 }
164
165
166 void shin(unsigned char indata)
167 //移入数据
168 {
169 1 unsigned char i;
170 1 for(i = 0; i < 8; i++)
171 1 {
172 2 DI = (bit)(indata & 0x80); // 先移入高位
173 2 SK = 1;
174 2 indata <<= 1;
175 2 SK = 0;
176 2 }
177 1 DI = 1;
C51 COMPILER V7.03 EX08 05/23/2005 23:20:59 PAGE 4
178 1 }
179
180 unsigned char shout(void)
181 // 移出数据
182 {
183 1 unsigned char i, out_data;
184 1 for(i = 0; i < 8; i++)
185 1 {
186 2 SK = 1;
187 2 out_data <<= 1;
188 2 SK = 0;
189 2 out_data |= (unsigned char)DO;
190 2 }
191 1 return(out_data);
192 1 }
193
194 // 延时子程序
195 void delayms(unsigned char ms)
196 {
197 1 unsigned char i;
198 1 while(ms--)
199 1 {
200 2 for(i = 0; i < 140; i++);
201 2 }
202 1 }
203
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 + -