?? viic.lst
字號:
C51 COMPILER V7.04 VIIC 03/04/2006 08:52:55 PAGE 1
C51 COMPILER V7.04, COMPILATION OF MODULE VIIC
OBJECT MODULE PLACED IN VIIC.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE VIIC.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /********************************************************************
2 VIIC_C51.C
3 此程序是I2C操作平臺(主方式的軟件平臺)的底層的C子程序,如發(fā)送數(shù)據(jù)
4 及接收數(shù)據(jù),應答位發(fā)送,并提供了幾個直接面對器件的操作函數(shù),它很方便的
5 與用戶程序連接并擴展.....
6
7 注意:函數(shù)是采用軟件延時的方法產(chǎn)生SCL脈沖,固對高晶振頻率要作
8 一定的修改....
9 目前選用晶振蕩器22.1184M, _nop_ 時間大約為0.5uS
10
11 ********************************************************************/
12
13
14 #include "p89c66x.h"
15 #include <intrins.h>
16 #include "viic.h"
17
18 #define IIC_SLOW_MODE
19 /*端口位定義*/
20 #ifdef IIC_SLOW_MODE //100K SCL=10uS周期
21 #define SomeNopForIic() _nop_();_nop_();_nop_();_nop_()//;_nop_();_nop_();_nop_();_nop_()
22 #else //400K SCL=2.5uS周期
#define SomeNopForIic() _nop_();_nop_();_nop_()//;_nop_();_nop_();_nop_()
#endif
25
26 //sbit SDA=P3^4; //模擬I2C數(shù)據(jù)傳送位 890
27 //sbit SCL=P3^5; //模擬I2C時鐘控制位
28
29 sbit SDA=P1^5; //模擬I2C數(shù)據(jù)傳送位69x30
30 sbit SCL=P1^4; //模擬I2C時鐘控制位
31
32
33 bit b_AckForIIC;
34
35
36 /*******************************************************************
37 起動總線函數(shù)
38 函數(shù)原型: void I2c_Start();
39 功能: 啟動I2C總線,即發(fā)送I2C起始條件.
40
41 ********************************************************************/
42 void I2c_Start()
43 {
44 1 SDA=1; //發(fā)送起始條件的數(shù)據(jù)信號
45 1 SomeNopForIic();
46 1 SCL=1;
47 1 SomeNopForIic(); //起始條件建立時間大于4.7us,延時
48 1 SDA=0; //發(fā)送起始信號
49 1 SomeNopForIic(); //起始條件鎖定時間大于4μs
50 1
51 1 }
52
53
54 /*******************************************************************
55 結(jié)束總線函數(shù)
C51 COMPILER V7.04 VIIC 03/04/2006 08:52:55 PAGE 2
56 函數(shù)原型: void I2c_Stop();
57 功能: 結(jié)束I2C總線,即發(fā)送I2C結(jié)束條件.
58
59 ********************************************************************/
60 void I2c_Stop()
61 {
62 1 SDA=0; //發(fā)送結(jié)束條件的數(shù)據(jù)信號
63 1 SomeNopForIic(); //發(fā)送結(jié)束條件的時鐘信號
64 1 // SDA=0;
65 1 // SomeNopForIic();
66 1 // SDA=0;
67 1 // SomeNopForIic();
68 1 // SDA=0;
69 1 // SomeNopForIic();
70 1
71 1 SCL=1; //結(jié)束條件建立時間大于4μs
72 1 SomeNopForIic();
73 1 // SCL=1;
74 1 // SomeNopForIic();
75 1
76 1
77 1 SDA=1; //發(fā)送I2C總線結(jié)束信號
78 1 SomeNopForIic();
79 1 }
80
81
82
83
84 /*******************************************************************
85 字節(jié)數(shù)據(jù)傳送函數(shù)
86 函數(shù)原型: void I2c_SendByte(uchar c);
87 功能: 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應答,并對
88 此狀態(tài)位進行操作.(不應答或非應答都使b_AckForIIC=0 假)
89 發(fā)送數(shù)據(jù)正常,b_AckForIIC=1; b_AckForIIC=0表示被控器無應答或損壞。
90 ********************************************************************/
91 void I2c_SendByte(uchar c)
92 {
93 1 uchar BitCnt;
94 1
95 1 SCL=0;
96 1 SomeNopForIic();
97 1
98 1 for(BitCnt=0;BitCnt<8;BitCnt++) //要傳送的數(shù)據(jù)長度為8位
99 1 {
100 2 if((c<<BitCnt)&0x80)SDA=1; //判斷發(fā)送位
101 2 else SDA=0;
102 2
103 2 SomeNopForIic();
104 2 SCL=1; //置時鐘線為高,通知被控器開始接收數(shù)據(jù)位
105 2
106 2 SomeNopForIic(); //保證時鐘高電平周期大于4μs
107 2
108 2 SCL=0;
109 2 SomeNopForIic();
110 2 }
111 1
112 1 SDA=1; //8位發(fā)送完后釋放數(shù)據(jù)線,準備接收應答位
113 1 SomeNopForIic();
114 1 SCL=0;
115 1
116 1 SomeNopForIic();
117 1 SCL=1;
C51 COMPILER V7.04 VIIC 03/04/2006 08:52:55 PAGE 3
118 1 SomeNopForIic();
119 1
120 1 if(SDA==1)b_AckForIIC=0;
121 1 else b_AckForIIC=1; //判斷是否接收到應答信號
122 1 SCL=0;
123 1 SomeNopForIic();
124 1 }
125
126
127
128
129
130
131 /*******************************************************************
132 字節(jié)數(shù)據(jù)傳送函數(shù)
133 函數(shù)原型: uchar I2c_RcvByte();
134 功能: 用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應答信號),
135 發(fā)完后請用應答函數(shù)。
136 ********************************************************************/
137 uchar I2c_RcvByte()
138 {
139 1 uchar retc;
140 1 uchar BitCnt;
141 1
142 1 retc=0;
143 1 SDA=1; //置數(shù)據(jù)線為輸入方式
144 1 SomeNopForIic();
145 1 SCL=0; //置時鐘線為低,準備接收數(shù)據(jù)位
146 1 SomeNopForIic(); //時鐘低電平周期大于4.7μs
147 1
148 1 for(BitCnt=0;BitCnt<8;BitCnt++)
149 1 {
150 2
151 2 SCL=1; //置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效
152 2 retc=retc<<1;
153 2
154 2 if(SDA==1)retc=retc+1; //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中
155 2 SomeNopForIic();
156 2
157 2 SCL=0;
158 2 SomeNopForIic();
159 2 }
160 1
161 1 return(retc);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -