📄 24wcxx.lst
字号:
C51 COMPILER V6.12 24WCXX 11/29/2007 10:34:25 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE 24WCXX
OBJECT MODULE PLACED IN F:\YUN\安全牌\安全牌C\24WCXX.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE F:\YUN\安全牌\安全牌C\24WCXX.C DB SB OE
stmt level source
1 //器件:24WC32/64
2 //注1:上电后需1MS才能进行读写操作
3 //注2:时钟频率Fscl_max=100Hz(1.8v,2.5v)/400Hz(4.5v~5.5v)
4 //注3:32字节页写缓冲器,内部低5 位地址加1 高位地址保持不变
5 //注4:当WP=VCC时,写保护(只读),当WP=GND/悬空时,可读/写,
6 // CAT24WC32/64 可以接收从器件地址和字节地址但是装置在
7 // 接收到第一个数据字节后不发送应答信号从而避免寄存器区域
8 // 被编程改写
9
10 #include "fun.h"
11 #include "var.h"
12 /**********************只在本文件使用*****************************/
13 /*功能:提供I2C总线工作时序中的起始位*/
14 void I_start(void){
15 1 SCL=1;
16 1 SCL=1;
17 1 SDA=0;
18 1 SDA=0;
19 1 SCL=0;
20 1 SCL=0;
21 1 }
22
23 /*功能:提供I2C总线工作时序中的停止位*/
24 void I_stop(void)
25 {SDA=0;
26 1 SDA=0;
27 1 SCL=1;
28 1 SCL=1;
29 1 SDA=1;
30 1 SDA=1;
31 1 SCL=0;
32 1 SCL=0;
33 1 }
34
35 /*功能:I2C总线初始化。在MAIN()函数中应先调用本函数,然后再调用其他函数。*/
36 void I_init(void)
37 {SCL=0;
38 1 I_stop();}
39
40 /*功能:提供I2C的时钟信号,并返回在时钟电平为高期间SDA信号线上状态。
41 *本函数可用于数据接收。*/
42 bit I_clock(void)
43 {bit sample;
44 1 SCL=1;
45 1 delay(1);
46 1 sample=SDA;
47 1 SCL=0;
48 1 delay(1);
49 1 return(sample);}
50
51 /*功能:向I2C总线发送8位数据,并请求一个应答信号ACK。
52 *如果收到ACK应答则返回1,否则返回0*/
53 bit I_send(uchar I_data)
54 {uchar i;
55 1 /*发送8位数据*/
C51 COMPILER V6.12 24WCXX 11/29/2007 10:34:25 PAGE 2
56 1 for (i=0;i<8;i++)
57 1 {SDA=(bit)(I_data&0x80);
58 2 I_data=I_data<<1;
59 2 I_clock();}
60 1 /*请求应答信号ACK*/
61 1 SDA=1;
62 1 return(~I_clock());}
63
64 /*功能:从I2C总线上接收8位数据信号,并将接收到8位数据作为一个
65 *字节返回,不回送应答信号ACK。主函数在调用本函数之前应保证SDA
66 *信号线处于浮置状态,即SDA置1。*/
67 uchar I_receive(void)
68 {uchar I_data=0;
69 1 uchar i;
70 1 for(i=0;i<8;i++)
71 1 {I_data<<=1;
72 2 if(I_clock())I_data++;}
73 1 return(I_data);
74 1 }
75
76 /*功能:向I2C总线发送一个应答信号ACK,一般用于连续数据读取时。*/
77 void I_Ack(void)
78 {SDA=0;
79 1 I_clock();
80 1 SDA=1;}
81
82 /*功能:向24WCXX写入器件地址和一个指定的字地址*/
83 bit E_address(uchar Address)
84 {I_start();
85 1 if(I_send(I2C_24WCXX_WR))return(I_send(Address));
86 1 else return(FALSE);
87 1 }
88 /*bit E_address(uint Address)
89 {uchar i;
90 I_start();
91 if(I_send(I2C_24WCXX_WR))
92 {i=(uchar)Address>>8;
93 if(!I_send(i))return(FALSE);
94 i=(uchar)Address;
95 return(I_send(i));
96 }
97 else return(FALSE);
98 } */
99 /*******************************************************/
100 //写24wcxx
101 bit wr_24wcxx(uchar address) //
102 {uchar i=7;
103 1 uchar *p;
104 1 p=(uchar *)&binary_24wcxx;
105 1 I_init();
106 1 if(E_address(address))
107 1 {while(i--)
108 2 {if(!I_send(*p++))
109 3 {I_stop();return(FALSE);}
110 3 }
111 2 I_stop();delay(600);return(TRUE);
112 2 }
113 1 else{I_stop();return(FALSE);}
114 1 }
115
116 //读24wcxx
117 bit rd_24wcxx(uchar address) //
C51 COMPILER V6.12 24WCXX 11/29/2007 10:34:25 PAGE 3
118 {uchar i=7;
119 1 uchar *p;
120 1 p=(uchar *)&binary_24wcxx;
121 1 I_init();
122 1 if(E_address(address))/*发送重复启动信号*/
123 1 {I_start();
124 2 if(I_send(I2C_24WCXX_RD))
125 2 {while(i--)
126 3 {*p++=I_receive();if(i)I_Ack();}
127 3 I_stop();
128 3 return(TRUE);
129 3 }
130 2 else{I_stop();return(FALSE);}
131 2 }
132 1 else {I_stop();return(FALSE);}
133 1 }
134 /********************************************************/
C51 COMPILER V6.12 24WCXX 11/29/2007 10:34:25 PAGE 4
NAME CLASS MSPACE TYPE OFFSET SIZE
==== ===== ====== ==== ====== ====
P0 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0080H 1
P1 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0090H 1
P3 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00B0H 1
T0 . . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 00B4H 1
T1 . . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 00B5H 1
T2 . . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 0090H 1
EA . . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 00AFH 1
binary . . . . . . . . . . . . . . . . * TAG * ----- STRUCT ----- 7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -