📄 i2c_intf.lst
字号:
C51 COMPILER V7.50 I2C_INTF 10/03/2008 17:53:12 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE I2C_INTF
OBJECT MODULE PLACED IN ..\hex\i2c_intf.obj
COMPILER INVOKED BY: D:\Program Files\KEIL_UV3\C51\BIN\C51.EXE i2c_intf.c LARGE OPTIMIZE(SIZE) BROWSE DEBUG OBJECTEXTEND
- CODE OBJECT(..\hex\i2c_intf.obj)
line level source
1 // *******************************************
2
3 // *******************************************
4
5 #include <stdio.h>
6 #include "i2c_intf.h"
7
8 void print_byte(char *s, unsigned char b);
9
10
11
12 #define NOP_DELAY do { _NOP_; _NOP_; } while (0)
13
14
15 #define SCL_PULSE do { SCL_P = 1; NOP_DELAY; SCL_P = 0; NOP_DELAY; } while (0)
16
17 unsigned char i2c_dev_addr;
18
19 void i2c_init(void)
20 {
21 1 SDA_P = 1;
22 1 SCL_P = 1;
23 1 }
24
25 void i2c_send_start_bit(void)
26 {
27 1 SDA_P = 0; NOP_DELAY;
28 1 SCL_P = 0; NOP_DELAY;
29 1 }
30
31 void i2c_send_restart_bit(void)
32 {
33 1 SDA_P = 1; NOP_DELAY;
34 1 SCL_P = 1; NOP_DELAY;
35 1 SDA_P = 0; NOP_DELAY;
36 1 SCL_P = 0; NOP_DELAY;
37 1 }
38
39 void i2c_send_stop_bit(void)
40 {
41 1 SDA_P = 0; NOP_DELAY;
42 1 SCL_P = 1; NOP_DELAY;
43 1 SDA_P = 1; NOP_DELAY;
44 1 }
45
46 void i2c_send_byte(unsigned char b)
47 {
48 1 unsigned char i;
49 1
50 1 for (i=0; i<8; i++) {
51 2 ACC = b;
52 2 SDA_P = ACC_7;
53 2 SCL_PULSE;
54 2 b = b << 1;
C51 COMPILER V7.50 I2C_INTF 10/03/2008 17:53:12 PAGE 2
55 2 }
56 1 }
57
58 unsigned char i2c_read_byte(void)
59 {
60 1 unsigned char c, i;
61 1
62 1 SDA_P = 1;
63 1
64 1 for (i=0; i<8; i++) {
65 2 SCL_P = 1; NOP_DELAY;
66 2
67 2 ACC = c;
68 2 ACC = ACC << 1;
69 2 ACC_0 = SDA_P;
70 2 c = ACC;
71 2 SCL_P = 0; NOP_DELAY;
72 2 }
73 1 return c;
74 1 }
75
76 char i2c_read_ack(void)
77 {
78 1 char result;
79 1
80 1 SDA_P = 1; NOP_DELAY;
81 1 SCL_P = 1; NOP_DELAY;
82 1 result = SDA_P;
83 1 SCL_P = 0; NOP_DELAY;
84 1 SDA_P = 1; NOP_DELAY;
85 1 return result;
86 1 }
87
88 void i2c_send_ack(char ack)
89 {
90 1 SDA_P = ack; NOP_DELAY;
91 1 SCL_P = 1; NOP_DELAY;
92 1 SCL_P = 0; NOP_DELAY;
93 1 SDA_P = 1; NOP_DELAY;
94 1 }
95
96
97 char i2c_write_reg(unsigned char offset, unsigned char d)
98 {
99 1 i2c_send_start_bit();
100 1 i2c_send_byte(i2c_dev_addr);
101 1 if (i2c_read_ack()) {
102 2 i2c_send_stop_bit();
103 2 return 1; // no device acknowledge
104 2 }
105 1 i2c_send_byte(offset);
106 1 if (i2c_read_ack()) {
107 2 i2c_send_stop_bit();
108 2 return 2; // device no accept the data, terminate transfer
109 2 }
110 1 i2c_send_byte(d);
111 1 i2c_read_ack();
112 1 i2c_send_stop_bit();
113 1 return 0;
114 1 }
115
116 char i2c_write_p0_reg(unsigned char offset, unsigned char d)
C51 COMPILER V7.50 I2C_INTF 10/03/2008 17:53:12 PAGE 3
117 {
118 1 i2c_dev_addr = PORT0_ADDR;
119 1 return i2c_write_reg(offset, d);
120 1 }
121
122 char i2c_write_p1_reg(unsigned char offset, unsigned char d)
123 {
124 1 i2c_dev_addr = PORT1_ADDR;
125 1 return i2c_write_reg(offset, d);
126 1 }
127
128 char i2c_read_reg(unsigned char offset, unsigned char *d)
129 {
130 1 i2c_send_start_bit();
131 1 i2c_send_byte(i2c_dev_addr);
132 1 if (i2c_read_ack()) {
133 2 i2c_send_stop_bit();
134 2 return 1; // no device acknowledge
135 2 }
136 1 i2c_send_byte(offset);
137 1 if (i2c_read_ack()) {
138 2 i2c_send_stop_bit();
139 2 return 2; // device no accept the data, terminate transfer
140 2 }
141 1 i2c_send_restart_bit();
142 1 i2c_send_byte(i2c_dev_addr | 0x01);
143 1 if (i2c_read_ack())
144 1 return 1; // no device acknowledge
145 1 *d = i2c_read_byte();
146 1 i2c_send_ack(1);
147 1 i2c_send_stop_bit();
148 1 return 0;
149 1 }
150
151 char i2c_read_p0_reg(unsigned char offset, unsigned char *d)
152 {
153 1 i2c_dev_addr = PORT0_ADDR;
154 1 return i2c_read_reg(offset, d);
155 1 }
156
157 char i2c_read_p1_reg(unsigned char offset, unsigned char *d)
158 {
159 1 i2c_dev_addr = PORT1_ADDR;
160 1 return i2c_read_reg(offset, d);
161 1 }
162
163
164
165
166
167
168
169
170
171
C51 COMPILER V7.50 I2C_INTF 10/03/2008 17:53:12 PAGE 4
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION i2c_init (BEGIN)
; SOURCE LINE # 19
; SOURCE LINE # 20
; SOURCE LINE # 21
0000 D293 SETB P1_3
; SOURCE LINE # 22
0002 D292 SETB P1_2
; SOURCE LINE # 23
0004 22 RET
; FUNCTION i2c_init (END)
; FUNCTION i2c_send_start_bit (BEGIN)
; SOURCE LINE # 25
; SOURCE LINE # 26
; SOURCE LINE # 27
0000 C293 CLR P1_3
0002 00 NOP
0003 00 NOP
; SOURCE LINE # 28
0004 C292 CLR P1_2
0006 00 NOP
0007 00 NOP
; SOURCE LINE # 29
0008 22 RET
; FUNCTION i2c_send_start_bit (END)
; FUNCTION i2c_send_restart_bit (BEGIN)
; SOURCE LINE # 31
; SOURCE LINE # 32
; SOURCE LINE # 33
0000 D293 SETB P1_3
0002 00 NOP
0003 00 NOP
; SOURCE LINE # 34
0004 D292 SETB P1_2
0006 00 NOP
0007 00 NOP
; SOURCE LINE # 35
0008 C293 CLR P1_3
000A 00 NOP
000B 00 NOP
; SOURCE LINE # 36
000C C292 CLR P1_2
000E 00 NOP
000F 00 NOP
; SOURCE LINE # 37
0010 22 RET
; FUNCTION i2c_send_restart_bit (END)
; FUNCTION i2c_send_stop_bit (BEGIN)
; SOURCE LINE # 39
; SOURCE LINE # 40
; SOURCE LINE # 41
0000 C293 CLR P1_3
0002 00 NOP
0003 00 NOP
; SOURCE LINE # 42
0004 D292 SETB P1_2
0006 00 NOP
C51 COMPILER V7.50 I2C_INTF 10/03/2008 17:53:12 PAGE 5
0007 00 NOP
; SOURCE LINE # 43
0008 D293 SETB P1_3
000A 00 NOP
000B 00 NOP
; SOURCE LINE # 44
000C 22 RET
; FUNCTION i2c_send_stop_bit (END)
; FUNCTION _i2c_send_byte (BEGIN)
; SOURCE LINE # 46
;---- Variable 'b' assigned to Register 'R7' ----
; SOURCE LINE # 47
; SOURCE LINE # 50
;---- Variable 'i' assigned to Register 'R6' ----
0000 E4 CLR A
0001 FE MOV R6,A
0002 ?C0032:
; SOURCE LINE # 51
0002 EF MOV A,R7
; SOURCE LINE # 52
0003 A2E7 MOV C,ACC_7
0005 9293 MOV P1_3,C
; SOURCE LINE # 53
0007 D292 SETB P1_2
0009 00 NOP
000A 00 NOP
000B C292 CLR P1_2
000D 00 NOP
000E 00 NOP
; SOURCE LINE # 54
000F 25E0 ADD A,ACC
0011 FF MOV R7,A
; SOURCE LINE # 55
0012 0E INC R6
0013 EE MOV A,R6
0014 B408EB CJNE A,#08H,?C0032
; SOURCE LINE # 56
0017 ?C0044:
0017 22 RET
; FUNCTION _i2c_send_byte (END)
; FUNCTION i2c_read_byte (BEGIN)
; SOURCE LINE # 58
;---- Variable 'c' assigned to Register 'R7' ----
; SOURCE LINE # 59
; SOURCE LINE # 62
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -