📄 zlg7290.lst
字号:
C51 COMPILER V6.12 ZLG7290 07/01/2008 10:48:12 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE ZLG7290
OBJECT MODULE PLACED IN .\zlg7290.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE .\zlg7290.c DEBUG OBJECTEXTEND
stmt level source
1 #include <reg52.h>
2 #include <intrins.h>
3 #include <absacc.h>
4 #include <stdio.h>
5 #include <math.h>
6
7 #define uint unsigned int
8 #define uchar unsigned char
9 #define x 0x80
10 #define y 0x80
11 #define comm 0
12 #define dat1 1
13
14 #define ZLG7290_I2C_ADDR 0x38 //ZLG7290的IIC地址
15 #define ZLG7290_Key 0x01 //键值寄存器
16 #define I2C_DELAY_VALUE 12
17 #define I2C_STOP_WAIT_VALUE 120
18 sbit I2C_SDA=P1^3; //模拟I2C数据传送位
19 sbit I2C_SCL=P1^4; //模拟I2C时钟控制位
20
21
22 #define _Nop() _nop_() //定义空指令
23 volatile bit flagint0 = 0;
24 sbit rs = P1^1; //H=data; L=command;
25 sbit rw = P1^0; //H=read; L=write;
26 sbit e = P1^7; //input enable;
27 sbit busy=P0^7; //lcd busy bit
28
29 void wr_lcd (uchar dat_comm,uchar content);
30 void chk_busy (void);
31 void delay (uint us);
32 //I2C总线初始化,使总线处于空闲状态
33
34 void I2C_Stop();
35
36
37 //I2C总线综合发送函数,向从机发送多个字节的数据
38 void I2C_Delay();
39 void I2C_Start();
40 void I2C_Write(uchar dat);
41 char I2C_Read();
42 bit I2C_GetAck();
43 void I2C_PutAck(bit ack);
44
45 //I2C总线综合接收函数,从从机接收多个字节的数据
46 bit I2C_Gets(unsigned char SlaveAddr,unsigned int SubAddr,unsigned char SubMod,uchar *dat,unsigned char Si
-ze);
47
48
49 bit ZLG7290_ReadReg(unsigned char RegAddr, uchar *dat);
50
51 void chn_disp (uchar code *chn);
52 void init_lcd (void);
53 void clrram (void);
54 void wr_lcd (uchar dat_comm,uchar content);
C51 COMPILER V6.12 ZLG7290 07/01/2008 10:48:12 PAGE 2
55 void chk_busy (void);
56 void delay (uint us);
57 void del(uchar i,uchar *p);
58 uchar code tab1[]={
59 "输入值:"};
60
61 uchar code tab2[]={
62 "输出值:"};
63
64 unsigned char data I2C_Delay_t;
65
66 /*
67 宏定义:I2C_Delay()
68 功能:延时,模拟I2C总线专用
69 */
70 void I2C_Delay()
71 {
72 1 I2C_Delay_t=(I2C_DELAY_VALUE);
73 1 while (--I2C_Delay_t!=0);
74 1 }
75 /*
76 函数:I2C_Init()
77 功能:I2C总线初始化,使总线处于空闲状态
78 说明:在main()函数的开始处,通常应当要执行一次本函数
79 */
80 /*void I2C_Init()
81 {
82 I2C_SCL =1;
83 I2C_Delay();
84 I2C_SDA =1;
85 I2C_Delay();
86 }
87 /*
88 函数:I2C_Start()
89 功能:产生I2C总线的起始状态
90 说明:
91 SCL处于高电平期间,当SDA出现下降沿时启动I2C总线
92 不论SDA和SCL处于什么电平状态,本函数总能正确产生起始状态
93 本函数也可以用来产生重复起始状态
94 本函数执行后,I2C总线处于忙状态
95 */
96 void I2C_Start()
97 {
98 1 I2C_SDA=1;
99 1 I2C_Delay();
100 1 I2C_SCL=1;
101 1 I2C_Delay();
102 1 I2C_SDA =0;
103 1 I2C_Delay();
104 1 I2C_SCL=0;
105 1 I2C_Delay();
106 1 }
107 /*
108 函数:I2C_Write()
109 功能:向I2C总线写1个字节的数据
110 参数:
111 dat:要写到总线上的数据
112 */
113 void I2C_Write(uchar dat)
114 {
115 1 unsigned char t=8;
116 1 do
C51 COMPILER V6.12 ZLG7290 07/01/2008 10:48:12 PAGE 3
117 1 {
118 2 I2C_SDA=(bit)(dat&0x80);
119 2 dat <<=1;
120 2 I2C_SCL=1;
121 2 I2C_Delay();
122 2 I2C_SCL=0;
123 2 I2C_Delay();
124 2 } while (--t!=0);
125 1 }
126 /*
127 函数:I2C_Read()
128 功能:从从机读取1个字节的数据
129 返回:读取的一个字节数据
130 */
131 char I2C_Read()
132 {
133 1 uchar dat;
134 1 unsigned char t=8;
135 1 I2C_SDA=1;
136 1 do
137 1 {
138 2 I2C_SCL=1;
139 2 I2C_Delay();
140 2 dat<<=1;
141 2 if (I2C_SDA)dat|=0x01;
142 2 I2C_SCL=0;
143 2 I2C_Delay();
144 2 } while(--t!=0);
145 1 return dat;
146 1 }
147 /*函数:I2C_GetAck()
148 功能:读取从机应答位
149 返回:
150 0:从机应答
151 1:从机非应答
152 说明:
153 从机在收到每个字节的数据后,要产生应答位
154 从机在收到最后1个字节的数据后,一般要产生非应答位
155 */
156 bit I2C_GetAck()
157 {
158 1 bit ack;
159 1 I2C_SDA = 1;
160 1 I2C_Delay();
161 1 I2C_SCL = 1;
162 1 I2C_Delay();
163 1 ack = I2C_SDA;
164 1 I2C_SCL = 0;
165 1 I2C_Delay();
166 1 return ack;
167 1 }
168 /*
169 函数:I2C_PutAck()
170 功能:主机产生应答位或非应答位
171 参数:
172 ack=0:主机产生应答位
173 ack=1:主机产生非应答位
174 说明:
175 主机在接收完每一个字节的数据后,都应当产生应答位
176 主机在接收完最后一个字节的数据后,应当产生非应答位
177 */
178 void I2C_PutAck(bit ack)
C51 COMPILER V6.12 ZLG7290 07/01/2008 10:48:12 PAGE 4
179 {
180 1 I2C_SDA = ack;
181 1 I2C_Delay();
182 1 I2C_SCL = 1;
183 1 I2C_Delay();
184 1 I2C_SCL = 0;
185 1 I2C_Delay();
186 1 }
187
188 /*
189 函数:I2C_Stop()
190 功能:产生I2C总线的停止状态
191 说明:
192 SCL处于高电平期间,当SDA出现上升沿时停止I2C总线
193 不论SDA和SCL处于什么电平状态,本函数总能正确产生停止状态
194 本函数执行后,I2C总线处于空闲状态
195 */
196 void I2C_Stop()
197 {
198 1 unsigned int t = I2C_STOP_WAIT_VALUE;
199 1 I2C_SDA = 0;
200 1 I2C_Delay();
201 1 I2C_SCL = 1;
202 1 I2C_Delay();
203 1 I2C_SDA = 1;
204 1 I2C_Delay();
205 1 while ( --t != 0 ); //在下一次产生Start之前,要加一定的延时
206 1 }
207 /*
208 函数:I2C_Puts()
209 功能:I2C总线综合发送函数,向从机发送多个字节的数据
210 参数:
211 SlaveAddr:从机地址(7位纯地址,不含读写位)
212 SubAddr:从机的子地址
213 SubMod:子地址模式,0-无子地址,1-单字节子地址,2-双字节子地址
214 *dat:要发送的数据
215 Size:数据的字节数
216 返回:
217 0:发送成功
218 1:在发送过程中出现异常
219 说明:
220 本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
221 当从机没有子地址时,参数SubAddr任意,而SubMod应当为0
222 */
223 /*bit I2C_Puts
224 (
225 unsigned char SlaveAddr,
226 unsigned int SubAddr,
227 unsigned char SubMod,
228 char *dat,
229 unsigned int Size
230 )
231 {
232 //定义临时变量
233 unsigned char i;
234 char a[3];
235 //检查长度
236 if ( Size == 0 ) return 0;
237 //准备从机地址
238 a[0] = (SlaveAddr << 1);
239 //检查子地址模式
240 if ( SubMod > 2 ) SubMod = 2;
C51 COMPILER V6.12 ZLG7290 07/01/2008 10:48:12 PAGE 5
241 //确定子地址
242 switch ( SubMod )
243 {
244 case 0:
245 break;
246 case 1:
247 a[1] = (char)(SubAddr);
248 break;
249 case 2:
250 a[1] = (char)(SubAddr >> 8);
251 a[2] = (char)(SubAddr);
252 break;
253 default:
254 break;
255 }
256 //发送从机地址,接着发送子地址(如果有子地址的话)
257 SubMod++;
258 I2C_Start();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -