51_LanQiaoBei/模板/zuolan_v1标志位/prj/Listings/iic.lst

210 lines
6.6 KiB
Plaintext
Raw Normal View History

2025-04-13 01:02:19 +08:00
C51 COMPILER V9.60.7.0 IIC 03/10/2025 18:03:54 PAGE 1
C51 COMPILER V9.60.7.0, COMPILATION OF MODULE IIC
OBJECT MODULE PLACED IN .\Objects\iic.obj
COMPILER INVOKED BY: D:\Keil_v5\C51\BIN\C51.EXE ..\driver\iic.c OPTIMIZE(8,SPEED) BROWSE INCDIR(..\driver;..\user) DEBUG
- OBJECTEXTEND PRINT(.\Listings\iic.lst) TABS(2) OBJECT(.\Objects\iic.obj)
line level source
1 /* # I2C代码片段说明
2 1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
3 2.
4 参赛选手可以自行编写相关代码或以该代码为基础根据所选单片机类型、运<E38081>
-<2D><>速度和试题
5 中对单片机时钟频率的要求,进行代码调试和修改。
6 */
7 #include "iic.h"
8
9 #include "intrins.h"
10 #define DELAY_TIME 5
11 sbit scl = P2 ^ 0;
12 sbit sda = P2 ^ 1;
13 //
14 static void I2C_Delay(unsigned char n) {
15 1 do {
16 2 _nop_();
17 2 _nop_();
18 2 _nop_();
19 2 _nop_();
20 2 _nop_();
21 2 _nop_();
22 2 _nop_();
23 2 _nop_();
24 2 _nop_();
25 2 _nop_();
26 2 _nop_();
27 2 _nop_();
28 2 _nop_();
29 2 _nop_();
30 2 _nop_();
31 2 } while (n--);
32 1 }
33
34 //
35 void I2CStart(void) {
36 1 sda = 1;
37 1 scl = 1;
38 1 I2C_Delay(DELAY_TIME);
39 1 sda = 0;
40 1 I2C_Delay(DELAY_TIME);
41 1 scl = 0;
42 1 }
43
44 //
45 void I2CStop(void) {
46 1 sda = 0;
47 1 scl = 1;
48 1 I2C_Delay(DELAY_TIME);
49 1 sda = 1;
50 1 I2C_Delay(DELAY_TIME);
51 1 }
52
53 //
C51 COMPILER V9.60.7.0 IIC 03/10/2025 18:03:54 PAGE 2
54 void I2CSendByte(unsigned char byt) {
55 1 unsigned char i;
56 1
57 1 for (i = 0; i < 8; i++) {
58 2 scl = 0;
59 2 I2C_Delay(DELAY_TIME);
60 2 if (byt & 0x80) {
61 3 sda = 1;
62 3 } else {
63 3 sda = 0;
64 3 }
65 2 I2C_Delay(DELAY_TIME);
66 2 scl = 1;
67 2 byt <<= 1;
68 2 I2C_Delay(DELAY_TIME);
69 2 }
70 1
71 1 scl = 0;
72 1 }
73
74 //
75 unsigned char I2CReceiveByte(void) {
76 1 unsigned char da;
77 1 unsigned char i;
78 1 for (i = 0; i < 8; i++) {
79 2 scl = 1;
80 2 I2C_Delay(DELAY_TIME);
81 2 da <<= 1;
82 2 if (sda) da |= 0x01;
83 2 scl = 0;
84 2 I2C_Delay(DELAY_TIME);
85 2 }
86 1 return da;
87 1 }
88
89 //
90 unsigned char I2CWaitAck(void) {
91 1 unsigned char ackbit;
92 1
93 1 scl = 1;
94 1 I2C_Delay(DELAY_TIME);
95 1 ackbit = sda;
96 1 scl = 0;
97 1 I2C_Delay(DELAY_TIME);
98 1
99 1 return ackbit;
100 1 }
101
102 //
103 void I2CSendAck(unsigned char ackbit) {
104 1 scl = 0;
105 1 sda = ackbit;
106 1 I2C_Delay(DELAY_TIME);
107 1 scl = 1;
108 1 I2C_Delay(DELAY_TIME);
109 1 scl = 0;
110 1 sda = 1;
111 1 I2C_Delay(DELAY_TIME);
112 1 }
113
114 unsigned char Ad_Read(unsigned char addr) {
115 1 unsigned char temp;
C51 COMPILER V9.60.7.0 IIC 03/10/2025 18:03:54 PAGE 3
116 1 // 选择芯片为PCF
117 1 I2CStart();
118 1 I2CSendByte(0x90);
119 1 I2CWaitAck();
120 1 I2CSendByte(addr);
121 1 I2CWaitAck();
122 1
123 1 I2CStart();
124 1 I2CSendByte(0x91);
125 1 I2CWaitAck();
126 1 temp = I2CReceiveByte();
127 1 I2CSendAck(1);
128 1 I2CStop();
129 1 return temp;
130 1 }
131 // 数字电压255->5V
132 void Da_Write(unsigned char dat) {
133 1 // 选择芯片为PCF
134 1 I2CStart();
135 1 I2CSendByte(0x90);
136 1 I2CWaitAck();
137 1 I2CSendByte(0x41);
138 1 I2CWaitAck();
139 1 I2CSendByte(dat);
140 1 I2CWaitAck();
141 1 }
142 void EEPROM_Write(unsigned char *str, unsigned char addr, unsigned char num) {
143 1 I2CStart();
144 1 I2CSendByte(0xa0);
145 1 I2CWaitAck();
146 1 I2CSendByte(addr);
147 1 I2CWaitAck();
148 1
149 1 while (num--) {
150 2 I2CSendByte(*str++);
151 2 I2CWaitAck();
152 2 I2C_Delay(200);
153 2 }
154 1 I2CStop();
155 1 I2C_Delay(255);
156 1 I2C_Delay(255);
157 1 I2C_Delay(255);
158 1 I2C_Delay(255);
159 1 }
160 void EEPROM_Read(unsigned char *str, unsigned char addr, unsigned char num) {
161 1 I2CStart();
162 1 I2CSendByte(0xa0);
163 1 I2CWaitAck();
164 1 I2CSendByte(addr);
165 1 I2CWaitAck();
166 1
167 1 I2CStart();
168 1 I2CSendByte(0xa1);
169 1 I2CWaitAck();
170 1 while (num--) {
171 2 *str++ = I2CReceiveByte();
172 2 if (num)
173 2 I2CSendAck(0);
174 2 else
175 2 I2CSendAck(1);
176 2 }
177 1 I2CStop();
C51 COMPILER V9.60.7.0 IIC 03/10/2025 18:03:54 PAGE 4
178 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 388 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 10
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)