📄 test.lst
字号:
C51 COMPILER V8.02 TEST 11/11/2007 21:15:12 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE TEST
OBJECT MODULE PLACED IN test.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE test.c OPTIMIZE(9,SPEED) BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h>
2 #include <intrins.h>
3
4 #define ERROR 10
5
6 #define LEDPORT P0 //数码管接线脚
7
8 sbit SCL=P3^5; //AT24C02-256的接线脚
9 sbit SDA=P3^6;
10
11 enum eepromtype {AT2401,AT2402,AT2404,AT2408,AT2416,AT2432,AT2464,AT24128,AT24256};
12 enum eepromtype enumer;
13 unsigned char code buf1[]={1,3,5,7,9,10,11,12,13,15};/* 发送缓冲区 */
14 unsigned char buf2[10]; /* 接收缓冲区 */
15
16
17
18 /* 一个通用的24C01-24C256共9种EEPROM的字节读写操作程序,
19 此程序有五个入口条件,分别为读写数据缓冲区指针,
20 进行读写的字节数,EEPROM首址,EEPROM控制字节,
21 以及EEPROM类型。此程序结构性良好,具有极好的容错性,程序机器码也不多:
22 DataBuff为读写数据输入/输出缓冲区的首址
23 Length 为要读写数据的字节数量
24 Addr 为EEPROM的片内地址 AT24256为0~32767
25 Control 为EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,
26 表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址;
27 enumer为枚举变量,需为AT2401至AT24256中的一种,分别对应AT24C01至AT24C256;
28 函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;
29 ERROR为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1
30 SDA和SCL由用户自定义,这里暂定义为P3^0和P3^1; */
31 /* ----- AT24C01~AT24C256 的读写程序 ------ */
32 bit RW24xx(unsigned char *DataBuff,unsigned char Length,unsigned int Addr,
33 unsigned char Control,enum eepromtype enumer)
34 {
35 1 void Delay(unsigned int DelayCount); /* 延时 */
36 1 void Start(void); /* 启动总线 */
37 1 void Stop(void); /* 停止IIC总线 */
38 1 bit RecAck(void); /* 检查应答位 */
39 1 void NoAck(void); /* 不对IIC总线产生应答 */
40 1 void Ack(void); /* 对IIC总线产生应答 */
41 1 unsigned char Receive(void); /* 从IIC总线上读数据子程序 */
42 1 void Send(unsigned char sendbyte); /* 向IIC总线写数据 */
43 1 unsigned char data j,i=ERROR;
44 1 bit errorflag=1; /* 出错标志 */
45 1 while(i--)
46 1 {
47 2 Start(); /* 启动总线 */
48 2 Send(Control & 0xfe); /* 向IIC总线写数据 */
49 2 if(RecAck()) continue; /* 如写正确结束本次循环 */
50 2 if(enumer > AT2416)
51 2 {
52 3 Send((unsigned char)(Addr >> 8));
53 3 if(RecAck()) continue;
54 3 }
55 2 Send((unsigned char)Addr); /* 向IIC总线写数据 */
C51 COMPILER V8.02 TEST 11/11/2007 21:15:12 PAGE 2
56 2 if(RecAck()) continue; /* 如写正确结束本次循环 */
57 2 if(!(Control & 0x01))
58 2 {
59 3 j=Length;
60 3 errorflag=0; /* 清错误特征位 */
61 3 while(j--)
62 3 {
63 4 Send(*DataBuff++); /* 向IIC总线写数据 */
64 4 if(!RecAck()) continue; /* 如写正确结束本次循环 */
65 4 errorflag=1;
66 4 break;
67 4 }
68 3 if(errorflag==1) continue;
69 3 break;
70 3 }
71 2 else
72 2 {
73 3 Start(); /* 启动总线 */
74 3 Send(Control); /* 向IIC总线写数据 */
75 3 if(RecAck()) continue;
76 3 while(--Length) /* 字节长为0结束 */
77 3 {
78 4 *DataBuff ++= Receive();
79 4 Ack(); /* 对IIC总线产生应答 */
80 4 }
81 3 *DataBuff=Receive(); /* 读最后一个字节 */
82 3 NoAck(); /* 不对IIC总线产生应答 */
83 3 errorflag=0;
84 3 break;
85 3 }
86 2 }
87 1 Stop(); /* 停止IIC总线 */
88 1 if(!(Control & 0x01))
89 1 {
90 2 Delay(255);
91 2 Delay(255);
92 2 Delay(255);
93 2 Delay(255);
94 2 }
95 1 return(errorflag);
96 1 }
97
98
99
100 /* * * * * 以下是对IIC总线的操作子程序 * * * * */
101 /* * * * * * 启动总线 * * * * */
102 void Start(void)
103 {
104 1 SCL=0; /* SCL处于高电平时,SDA从高电平转向低电平表示 */
105 1 SDA=1; /* 一个"开始"状态,该状态必须在其他命令之前执行 */
106 1 SCL=1;
107 1 _nop_(); _nop_(); _nop_();
108 1 SDA=0;
109 1 _nop_(); _nop_(); _nop_(); _nop_();
110 1 SCL=0;
111 1 SDA=1;
112 1 }
113
114
115
116 /* * * * * 停止IIC总线 * * * * */
117 void Stop(void)
C51 COMPILER V8.02 TEST 11/11/2007 21:15:12 PAGE 3
118 {
119 1 SCL=0; /*SCL处于高电平时,SDA从低电平转向高电平 */
120 1 SDA=0; /*表示一个"停止"状态,该状态终止所有通讯 */
121 1 SCL=1;
122 1 _nop_(); _nop_(); _nop_(); /* 空操作 */
123 1 SDA=1;
124 1 _nop_(); _nop_(); _nop_();
125 1 SCL=0;
126 1 }
127 /* * * * * 检查应答位 * * * * */
128 bit RecAck(void)
129 {
130 1 SCL=0;
131 1 SDA=1;
132 1 SCL=1;
133 1 _nop_(); _nop_(); _nop_(); _nop_();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -