📄 iic.lst
字号:
C51 COMPILER V8.02 IIC 04/21/2007 15:52:42 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE IIC
OBJECT MODULE PLACED IN IIC.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE IIC.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h>
2 #include<intrins.h>
3 #define uchar unsigned char
4 #define uint unsigned int
5 #define IIC_READ 0XA1 //定义读指令
6 #define IIC_WRITE 0XA0 //定义写指令
7 #define NOP _nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
8
9 //==============================
10
11 sbit SDA=P0^6;
12 sbit SCL=P0^7;
13
14 //===============================
15 //define a bit_operation byte to use in shift operation
16 //use this mode can achieve high operation speed
17 uchar bdata bbyte;//定义位操作用数组,采用此方法可提高位操作速度
18 sbit a0=bbyte^0;
19 sbit a1=bbyte^1;
20 sbit a2=bbyte^2;
21 sbit a3=bbyte^3;
22 sbit a4=bbyte^4;
23 sbit a5=bbyte^5;
24 sbit a6=bbyte^6;
25 sbit a7=bbyte^7;
26 //========================================
27 bit IFACK; //record the SDA state to confirn if ACK has happened
28 bit NO_ACK; //no ack flag
29 bit BUS_FAULT; //bus fault flag
30 //========================================
31 //FUNCTION:ROUTES TO PROVIDE A START SIGNAL
32 void start(void)
33 {
34 1 SCL=0;SDA=1; NOP;SCL=1;SDA=0;NOP;SCL=0;
35 1 }
36 //=======================================
37 //FUNCTION:ROUTES TO PROVIDE A STOP SIGNAL
38 void stop(void)
39 {
40 1 SCL=0;SDA=0;NOP;SCL=1;SDA=1;NOP;SCL=0;
41 1 }
42 //=====================================
43 //FUNCTION:ROUTES TO PROVIDE ACK SINGAL
44 void ack(void)
45 {
46 1 SCL=0;SDA=0;NOP;SCL=1;NOP;SCL=0;
47 1 }
48 //=====================================
49 //FUNCTION:ROUTES TO RELEASE THE SDA TO RECEIVE A ACK SIGNAL
50 // OR TO PROVIDE A NO_ACK SIGNAL
51 //type=1等待应答信号
52 //type=0 产生无应答信号
53 void nack(uchar type)
54 {
55 1 SCL=0;SDA=1;NOP;SCL=1;IFACK=SDA; NOP;SCL=0;
C51 COMPILER V8.02 IIC 04/21/2007 15:52:42 PAGE 2
56 1 if(type)
57 1 {
58 2 if(IFACK)//如果无应答信号,则置标志位NO_ACK,程序中止
59 2 {
60 3 NO_ACK=1;//用户可以加入自己的异常处理程序
61 3 //while(1);
62 3 }
63 2 else NO_ACK=0;
64 2 }
65 1 }
66 //=======================================================
67 //FUNCTION:THE IIC DEVICE SHIFT OUT A BYTE TO THE MASTER
68 uchar inbyte(void)
69 {//从IIC器件中读出数据
70 1 SDA=1;
71 1 SCL=1;a7=SDA;NOP;SCL=0;
72 1 SCL=1;a6=SDA;NOP;SCL=0;
73 1 SCL=1;a5=SDA;NOP;SCL=0;
74 1 SCL=1;a4=SDA;NOP;SCL=0;
75 1 SCL=1;a3=SDA;NOP;SCL=0;
76 1 SCL=1;a2=SDA;NOP;SCL=0;
77 1 SCL=1;a1=SDA;NOP;SCL=0;
78 1 SCL=1;a0=SDA;NOP;SCL=0;
79 1 return(bbyte);
80 1 }
81 //=======================================================
82 //FUNCTION:THE IIC DEVICE SHIFT IN A BYTE FROM THE MASTER
83 void outbyte(uchar outdata)
84 {//将数据写放IIC器件
85 1 bbyte=outdata;
86 1 SDA=a7;SCL=1;NOP;SCL=0;
87 1 SDA=a6;SCL=1;NOP;SCL=0;
88 1 SDA=a5;SCL=1;NOP;SCL=0;
89 1 SDA=a4;SCL=1;NOP;SCL=0;
90 1 SDA=a3;SCL=1;NOP;SCL=0;
91 1 SDA=a2;SCL=1;NOP;SCL=0;
92 1 SDA=a1;SCL=1;NOP;SCL=0;
93 1 SDA=a0;SCL=1;NOP;SCL=0;
94 1 }
95
96 /**********************写函数****************************************
97 ** 函数名称: 写数据
98 ** 入口参数:add为读起始地址,ptr数据保存指针,writelen为写出数据长度
99 ********************************************************************/
100 void writebyteseq(unsigned char page_addr, unsigned char byte_address,uchar *ptr,uchar writelen)
101 {
102 1 uchar temph;
103 1 uchar i;
104 1 // unsigned char x;
105 1 temph = (page_addr<<1);
106 1
107 1 start();
108 1 outbyte(IIC_WRITE);
109 1 nack(1);
110 1 outbyte(temph);
111 1 nack(1);
112 1 outbyte(byte_address);
113 1 nack(1);
114 1 for(i=0;i<writelen;i++)
115 1 {
116 2 outbyte(*(ptr+i));
117 2 nack(1);
C51 COMPILER V8.02 IIC 04/21/2007 15:52:42 PAGE 3
118 2 }
119 1 stop();
120 1 }
121 /**********************读函数***************************************
122 ** 函数名称: 连续读数据
123 ** 入口参数:add为读起始地址,ptr数据保存指针,readlen为读出数据长度
124 ********************************************************************/
125 void readbyteseq(unsigned char page_addr, unsigned char byte_address,uchar *ptr,uchar readlen)
126 {
127 1
128 1 uchar temph;
129 1 uchar i;
130 1 temph = (page_addr<<1); // 2 address bytes.
131 1 start();
132 1 outbyte(IIC_WRITE);
133 1 nack(1);
134 1 outbyte(temph);
135 1 nack(1);
136 1 outbyte(byte_address);
137 1 nack(1);
138 1 start();
139 1 outbyte(IIC_READ);
140 1 nack(1);
141 1 for(i=0;i<readlen-1;i++)
142 1 {
143 2 *(ptr+i)=inbyte();
144 2 ack();
145 2 }
146 1 *(ptr+readlen-1)=inbyte();
147 1 nack(0);
148 1 stop();
149 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 543 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 12
IDATA SIZE = ---- ----
BIT SIZE = 3 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -