📄 hali2c.lst
字号:
C51 COMPILER V8.01 HALI2C 04/17/2008 09:54:34 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE HALI2C
OBJECT MODULE PLACED IN .\Debug\hali2c.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE e2prom\hali2c.c LARGE OPTIMIZE(9,SIZE) REGFILE(.\Debug\VA4010_SDK_V2.ORC) B
-ROWSE NOINTPROMOTE INCDIR(.\common;.\e2prom;.\file;.\fmtx;.\ir;.\keyboard;.\lcm;.\led;.\main;.\matrixkey;.\mp3ctrl;.\sd;
-.\usbhost;.\include;.\lib) DEBUG OBJECTEXTEND PRINT(.\Debug\hali2c.lst) OBJECT(.\Debug\hali2c.obj)
line level source
1 /****************************************************************
2 * Viaon Technology (Suzhou) Co.,Ltd
3 *
4 * Copyright 2007, Viaon Technology (Suzhou) Co.,Ltd,Suzhou,China
5 * All rights reserved.
6 *
7 *
8 * Filename: hali2c.c
9 *
10 * Programmer: Greg
11 *
12 * Created: 1/2/2008
13 *
14 * Description: public functions
15 *
16 *
17 * Change History (most recent first): 2008.1.2
18 ****************************************************************/
19
20 /* 51系列单片机在使用时,有时需要模拟I2C总线, */
21 /* 这里举出一个实例(读写串行EEPROM芯片at2402) */
22 /************************************************************************/
23 /* Name:AT24C02存储器的读写程序,用到I2C总线,含相对独立的I2C总线读写函数 */
24 /* Language: C51单片机编程语言 */
25 /* Platform: Win98,Intel Celeron 433 Processor,伟福仿真器,仿真8751 */
26 /* Author: StephenZhu javasdk@163.com */
27 /* Date: 2003年5月21日,5月22日,5月29日 */
28 /* Version: 1.1.1 */
29 /* Others: None */
30 /************************************************************************/
31
32 //#include<string.h>
33 //#include<reg52.h>
34 //#include<intrins.h>
35
36 #include "utiltypedef.h"
37 #include "va4010reg.h"
38 #include "common.h"
39
40 #include "hali2c.h"
41
42
43 //bit F0;
44
45 /********** Function Definition 函数定义 ************/
46 #define DELAY(x) DelayUs(x)
47 #if (E2PROM_TYPE != E2PROM_NONE)
48
49 //Chose two gpio pin as SCL, SDA according PCB connection
50 //From master's point of view
51 //SCL: Output, SDA: Bidirection, Master should give up SDA when not use.
52 #if (BOARD_ID == EVB_V1)
sbit SCL=P1^7;/*假设由P1.7和P1.6控制*/
C51 COMPILER V8.01 HALI2C 04/17/2008 09:54:34 PAGE 2
sbit SDA=P1^6;
#define SCL_OUTPUT() (P1_DDR|=0X80)
#define SDA_OUTPUT() (P1_DDR|=0x40)
#define SDA_INPUT() (P1_DDR&=0xbf)
#elif(BOARD_ID == HZ_111)
sbit SCL=P2^6;
sbit SDA=P2^7;
#define SCL_OUTPUT() (P2_DDR|=0x40)
#define SDA_OUTPUT() (P2_DDR|=0X80)
#define SDA_INPUT() (P2_DDR&=0x7f)
#elif(BOARD_ID == HX_001)
67 sbit SCL=P2^6;
68 sbit SDA=P2^7;
69
70 #define SCL_OUTPUT() (P2_DDR|=0x40)
71 #define SDA_OUTPUT() (P2_DDR|=0X80)
72 #define SDA_INPUT() (P2_DDR&=0x7f)
73
74 #endif
75
76 void I2C_Start(void)
77 {
78 1 /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
79 1 //Set SDA Direction
80 1 SCL_OUTPUT();
81 1 SDA_OUTPUT();
82 1 SDA=1;
83 1 SCL=1;
84 1 DELAY(DELAY_TIME);
85 1 SDA=0;
86 1 DELAY(DELAY_TIME);
87 1 SCL=0;
88 1 DELAY(DELAY_TIME);
89 1 }
90
91 void I2C_Stop(void)
92 {
93 1 /*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
94 1 SDA_OUTPUT();
95 1 SCL_OUTPUT();
96 1
97 1 SDA=0;
98 1 SCL=1;
99 1 DELAY(DELAY_TIME);
100 1 SDA=1;
101 1 DELAY(DELAY_TIME);
102 1 SCL=0;
103 1 DELAY(DELAY_TIME);
104 1 }
105
106 void SEND_0(void) /* SEND ACK */
107 {
108 1 /*发送0,在SCL为高电平时使SDA信号为低*/
109 1 SDA_OUTPUT();
110 1 SCL_OUTPUT();
111 1
112 1 SDA=0;
113 1 //DELAY(DELAY_TIME);
114 1 SCL=1;
115 1 DELAY(DELAY_TIME);
C51 COMPILER V8.01 HALI2C 04/17/2008 09:54:34 PAGE 3
116 1 SCL=0;
117 1 DELAY(DELAY_TIME);
118 1 }
119
120 void SEND_1(void)
121 {
122 1 /*发送1,在SCL为高电平时使SDA信号为高*/
123 1 SDA_OUTPUT();
124 1 SCL_OUTPUT() ;
125 1
126 1 SDA=1;
127 1 //DELAY(DELAY_TIME);
128 1 SCL=1;
129 1 DELAY(DELAY_TIME);
130 1 SCL=0;
131 1 DELAY(DELAY_TIME);
132 1 }
133
134 #if 0
BYTE Check_Acknowledge(void)
{
bit tmp;
SDA_INPUT();
SCL_OUTPUT();
/*发送完一个字节后检验设备的应答信号*/
SCL=1; // the ninth cycle, check SDA
DELAY(DELAY_TIME/2);
tmp = SDA; //get response from slave device
DELAY(DELAY_TIME/2);
SCL=0;
DELAY(DELAY_TIME);
//if(tmp==1)
// return FALSE;
//return TRUE;
return (tmp==1)?I2C_NAK:I2C_ACK;
}
#else
156 void Check_Acknowledge(void)
157 {
158 1 //bit tmp;
159 1
160 1 SDA_INPUT();
161 1 SCL_OUTPUT();
162 1
163 1 /*发送完一个字节后检验设备的应答信号*/
164 1 SCL=1; // the ninth cycle, check SDA
165 1 DELAY(DELAY_TIME/2);
166 1 //tmp = SDA; //get response from slave device
167 1 DELAY(DELAY_TIME/2);
168 1 SCL=0;
169 1 DELAY(DELAY_TIME);
170 1
171 1 //return (tmp==1)?I2C_NAK:I2C_ACK;
172 1 return;
173 1 }
174
175 #endif
176
177 //why reentrant
C51 COMPILER V8.01 HALI2C 04/17/2008 09:54:34 PAGE 4
178 void WriteI2CByte(BYTE b)//reentrant
179 {
180 1 /*向I2C总线写一个字节*/
181 1 BYTE i;
182 1 //SDA_OUTPUT();
183 1 for(i=0;i<8;i++)
184 1 if((b<<i)&0x80)
185 1 SEND_1();
186 1 else
187 1 SEND_0();
188 1 }
189
190
191
192 BYTE ReadI2CByte(void)//reentrant
193 {
194 1 /*从I2C总线读一个字节*/
195 1 BYTE b=0;
196 1 BYTE i;
197 1
198 1 SDA_INPUT();
199 1 SCL_OUTPUT();
200 1 //Here master should generate 8 cycle on SCL
201 1 for(i=0;i<8;i++)
202 1 {
203 2 SCL=1; /*接受数据*/
204 2 DELAY(DELAY_TIME/2);
205 2 //F0=SDA; //Receive data from device
206 2 if(SDA==1){
207 3 b=b<<1;
208 3 b=b|0x01;
209 3 }else
210 2 b=b<<1;
211 2 DELAY(DELAY_TIME/2);
212 2 SCL=0;
213 2 DELAY(DELAY_TIME);
214 2 }
215 1 return b;
216 1 }
217
218 #endif
219
220
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 188 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -