📄 iic24c02int.lst
字号:
C51 COMPILER V8.02 IIC24C02INT 03/07/2007 21:31:32 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE IIC24C02INT
OBJECT MODULE PLACED IN IIc24c02Int.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\c51.exe IIc24c02Int.c DB OE
line level source
1 //参考程序A:AT24C02.C SMBUS 24C02 读/写 2005.12.25
2 //程序功能:在AT24C02的地址00---3FH中依次存入连续的数据10H--4FH
3 //再依次从地址00---3FH中读出数据并通过SAA1064驱动四位数码管显示出来.
4 //第一,二位数码管显示地址,第三,四位数码管显示存入该地址内的数据.
5 //显示格式:
6 //存储器的地址 存储器单元的内容
7 //00H---3FH 40H---4FH
8 #include "TestSerial.h"
9 #define WRITE 0x00 // SMBUS寻址字节的写标志位
10 #define READ 0x01 // SMBUS寻址字节的读标志位
11 // Device addresses
12 #define CHIP_A 0xA0 //AT24C02器件自身的寻址字节
13 // #define CHIP_B 0x70 //AT24C02器件自身的寻址字节
14 #define SMB_BUS_ERROR 0x0 //总线错误 SAA1064
15 //MT为主发送器,MR为主接收器
16 #define SMB_START 0x08 // (MT & MR) 发送起始位
17 #define SMB_RP_START 0x10 // (MT & MR) 重复起始位
18 #define SMB_MTADDACK 0x18 // (MT) 发送从地址 + W 后收到ACK
19 #define SMB_MTADDNACK 0x20 // (MT) 发送从地址 + W 后收到NACK
20 #define SMB_MTDBACK 0x28 // (MT) 发送数据后收到ACK
21 #define SMB_MTDBNACK 0x30 // (MT) 发送数据后收到NACK
22 #define SMB_MTARBLOST 0x38 //(MT)竞争失败
23 #define SMB_MRADDACK 0x40 // (MR) 发送从地址 + R 后收到 ACK
24 #define SMB_MRADDNACK 0x48 // (MR) 发送从地址 + R 后收到 NACK
25 #define SMB_MRDACK 0x50 // (MR) 收到数据字节 后已发送ACK
-
26 #define SMB_MRDBNACK 0x58 // (MR) 收到数据字节 后已发送NACK
27 char xdata DATA0[6]={0x17,0x3f,0x06,0x5b,0x4f};
28 char xdata DATA2[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
29 char SLAW,DATA1[64]; // 保存从地址+ WRITE 位
30 char SLAR; // 保存从地址+ WRITE 位
31 char WORD,WORDADR; // 保存被收/发的数据字节
32 char xdata sendnumber; // 保存被收/发的数据字节的数目
33 //unsigned char xdata WORDADR; //保存被传送的数据在24C02中的首地址.
34 unsigned char xdata SENDMODE; //SENDMODE作读/写控制字
35 unsigned char xdata i,j,k,sla,n,m,p;
36 bit SM_BUSY; //忙碌标志位 void sleep_ms( unsigned int cou
-nt); //延时
37 //void DISPLAY(void); //通过SAA1064驱动四位数码管显示
38 void SMBUS_ISR (void); //中断服务程序
39 char SLA_READ(char chip,char wordadr,char number);
40 void SLA_SEND(char chip,char wordadr, char word,char number);
41 //void sleep_ms(unsigned int count);
42 void IIC_Int(void)
43 {
44 1 // unsigned char check; // 测试用的工作变量
45 1 // XBR0 = 0x01; // 选交叉开关 :P0.0-->SDA,P0.1-->CLK
46 1 // XBR2 = 0x40; // 交叉开关使能
47 1 SMB0CN = 0x44; // 允许SMBUS, 应答返回AA(低电平
48 1 SMB0CR = 0xc9; // SMBus 速率= 100 kHz,系统时钟为11.0592MHZ
49 1 EIE1 |= 2; // SMBus 中断使能
50 1 // EA = 1; // 开中断
51 1 SM_BUSY = 0; // SM_BUSY是忙碌标志位
52 1 SI = 0; //SM_BUSY中断标志位
53 1 //写64个连续的数据到AT24C02中去并依次存放.
C51 COMPILER V8.02 IIC24C02INT 03/07/2007 21:31:32 PAGE 2
54 1 //64个连续的数据的存放地址:00H--3fH.第一个数为10H,最后一个数为4FH.
55 1 /*
56 1 i=0x10;
57 1 sla=CHIP_A;
58 1 for (j=0;j<0x40;j++) //向24C02的000地址依次写入64个数据,
59 1 { //64个数据的数值从10H---4FH
60 1 SLA_SEND(sla, j, i,0x01); // 写入AT24C02
61 1 i++;
62 1 }
63 1 for (j=0;j<0x40;j++) //从24C02的00地址依次连续读出64个数据,
64 1 { //64个数据的数值应该是从10H---3FH(连续存放)
65 1 check=SLA_READ(sla, j,0x01);
66 1 DATA1[j]=check; //读出来的数据依次连续存入数组DATA[]中
67 1 }
68 1 for (j=0;j<0x40;j++) //把要显示的两位地址和两位数据存入DATA2[]中
69 1 { i=DATA1[j];
70 1 k=i&0x0f;
71 1 m=DATA2[k]; //j为地址,i=DATA1[j]=check,i地址j中存放的数据
72 1 DATA0[4]=m;
73 1 k=i&0xf0;
74 1 k=k>>4;
75 1 n=DATA2[k];
76 1 DATA0[3]=n;
77 1 k=j&0x0f;
78 1 m=DATA2[k];
79 1 DATA0[2]=m;
80 1 k=j&0xf0;
81 1 k=k>>4;
82 1 n=DATA2[k];
83 1 DATA0[1]=n;
84 1 // DISPLAY();
85 1 for (i=0; i < 256; i++) ;
86 1
87 1 sleep_ms(1000);
88 1 }
89 1 while(1);*/
90 1 }
91
92
93 /*void DISPLAY (void)
94 {
95 sla=CHIP_B;
96 DATA0[0]=0x17; //0x17是SAA1064的控制字.
97 for (p=0;p<0x5;p++)
98 {i=DATA0[p]; //向SAA1064写入五个数:SAA1064的控制字一字节,
99 SLA_SEND(sla, p, i,0x01); // 地址2字节,数据2字节.共五字节
100 }
101 }
102
103 */
104
105
106 void SLA_Send_String(unsigned char idata *ch)
107 {
108 1 sla=CHIP_A;
109 1 ch=0;
110 1 for (j=0;j<0x20;j++) //向24C02的000地址依次写入64个数据,
111 1 { //64个数据的数值从10H---4FH
112 2 SLA_SEND(sla, j, ch[j],0x01); // 写入AT24C02
113 2 i++;
114 2 }
115 1 }
C51 COMPILER V8.02 IIC24C02INT 03/07/2007 21:31:32 PAGE 3
116 void SLA_SEND(unsigned char idata chip, unsigned char idata wordadr, unsigned char idata word,unsigned cha
-r idata number)
117 {
118 1 SENDMODE=0x01;
119 1 sendnumber=number+1;
120 1 while(SM_BUSY); // 若SMBUS忙碌就等待
121 1 SM_BUSY = 1; // 置SM_BUSY位(忙碌标志位)为1
122 1 SLAW = (chip| WRITE); // COMMAND = 7 个地址位 + 一位WRITE.
123 1 WORD = word; // WORD中存放要送到24C02中去的数据(8位)
124 1 WORDADR = wordadr; // OP_CODE 中存放被传送数据送入24C02的首地址.
125 1 STO = 0;
126 1 STA = 1; // 启动数据传输
127 1 while(SM_BUSY); // 等待传输完成
128 1 }
129 char SLA_READ(unsigned char idata chip, unsigned char idata wordadr,unsigned char idata number){
130 1 sendnumber=number;
131 1 SENDMODE=0;
132 1 while(SM_BUSY); // 若SMBUS忙碌就等待
133 1 SM_BUSY = 1; // 置SM_BUSY位(忙碌标志位)为1
134 1 SLAR = (chip| READ); // COMMAND = 7 个地址位 + 一位READ
135 1 WORDADR = wordadr; // OP_CODE 中存放从24C02读出数据的的首地址.
136 1 STO = 0;
137 1 STA = 1; // 启动传输
138 1 while(SM_BUSY); // 等待传输完成
139 1 return WORD; //返回读出来的数据(一个字节)
140 1 }
141 void SMBUS_ISR (void) interrupt 7 //中断服务程序
142 {
143 1 switch (SMB0STA){ // 根据中断状态码跳转
144 2 //(SMB0STA 是中断状态寄存器)
145 2 case SMB_START: //0x08, (MT & MR) 发送起始位
146 2 SMB0DAT = SLAW ; // 装入被访问的从芯片的写地址
147 2 STA = 0; // 人工清除 STA 位
148 2 SI = 0; // 清除中断标志位
149 2 break;
150 2 case SMB_RP_START: //0x10,(MT & MR) 重复发送起始位
151 2 SMB0DAT = SLAR; // 装入被访问的从芯片的读地址
152 2 STA = 0; // 人工清除 STA 位
153 2 SI = 0; // 清除中断标志位
154 2 break;
155 2 case SMB_MTADDACK: //0x18 ,(MT) 发送从地址 + W 后收到ACK
156 2 SMB0DAT = WORDADR;
157 2 SI = 0; // 清除中断标志位
158 2 break;
159 2 case SMB_MTADDNACK: //0x20,(MT) 发送从地址 + W 后收到NACK
160 2 STO = 1;
161 2 STA = 1;
162 2 SI = 0; // 清除中断标志位
163 2 break;
164 2 case SMB_MTDBACK: //0x28,(MT) 发送数据后收到ACK
165 2 switch (SENDMODE){ // 检查低1位
166 3 case 1:
167 3 sendnumber--;
168 3 if(sendnumber)
169 3 SMB0DAT = WORD;
170 3 else{
171 4 STO=1;
172 4 SM_BUSY=0;
173 4 }
174 3 break;
175 3 case 0:
176 3 STO = 0;
C51 COMPILER V8.02 IIC24C02INT 03/07/2007 21:31:32 PAGE 4
177 3 STA = 1;
178 3 break;
179 3 default:
180 3 STO = 1;
181 3 SM_BUSY = 0;
182 3 break;
183 3 }
184 2 SI = 0;
185 2 break;
186 2 case SMB_MTDBNACK: //0x30
187 2 STO = 1;
188 2 STA = 1;
189 2 SI = 0; // 清除中断标志
190 2 break;
191 2 case SMB_MRADDACK: //0x40
192 2 AA = 0;
193 2 SI = 0;
194 2 break;
195 2 case SMB_MRADDNACK: //0x48
196 2 STO = 0;
197 2 STA = 1;
198 2 SI = 0;
199 2 break;
200 2 case SMB_MRDBNACK: //0x58
201 2 WORD = SMB0DAT;
202 2 STO = 1;
203 2 SM_BUSY = 0;
204 2 AA = 1;
205 2 SI = 0;
206 2 break;
207 2 default:
208 2 STO = 1;
209 2 SM_BUSY = 0;
210 2 break;
211 2 }
212 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 291 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 31 ----
PDATA SIZE = ---- ----
DATA SIZE = 68 5
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -