📄 pcf8591-da-lcd1602-c51.lst
字号:
218 1 lcd_wcmd(0x06); //移动光标
219 1 delay(5);
220 1 lcd_wcmd(0x01); //清除LCD的显示内容
221 1 delay(5);
222 1 }
223
224 /*******************************************************************/
225 /* */
226 /* 设定显示位置 */
227 /* */
228 /*******************************************************************/
229
230 void lcd_pos(uchar pos)
231 {
232 1 lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
233 1 }
234
235 //-------------------------------------------------------------------
236 // 函数名称: iic_start()
237 // 函数功能: 启动I2C总线子程序
238 //-------------------------------------------------------------------
239 void iic_start(void)
240 { //时钟保持高,数据线从高到低一次跳变,I2C通信开始
241 1 SDA = 1;
C51 COMPILER V7.08 PCF8591_DA_LCD1602_C51 12/21/2006 16:15:07 PAGE 5
242 1 SCL = 1;
243 1 delayNOP(); // 延时5us
244 1 SDA = 0;
245 1 delayNOP();
246 1 SCL = 0;
247 1 }
248 //-------------------------------------------------------------------
249 // 函数名称: iic_stop()
250 // 函数功能: 停止I2C总线数据传送子程序
251 //-------------------------------------------------------------------
252 void iic_stop(void)
253 {
254 1 SDA = 0; //时钟保持高,数据线从低到高一次跳变,I2C通信停止
255 1 SCL = 1;
256 1 delayNOP();
257 1 SDA = 1;
258 1 delayNOP();
259 1 SCL = 0;
260 1 }
261 //------------------------------------------------------------------
262 // 函数名称: iicInit_()
263 // 函数功能: 初始化I2C总线子程序
264 //------------------------------------------------------------------
265 void iicInit(void)
266 {
267 1 SCL = 0;
268 1 iic_stop();
269 1 }
270 //-------------------------------------------------------------------
271 // 函数名称: slave_ACK
272 // 函数功能: 从机发送应答位子程序
273 //-------------------------------------------------------------------
274 void slave_ACK(void)
275 {
276 1 SDA = 0;
277 1 SCL = 1;
278 1 delayNOP();
279 1 SCL = 0;
280 1 }
281 //-------------------------------------------------------------------
282 // 函数名称: slave_NOACK
283 // 函数功能: 从机发送非应答位子程序,迫使数据传输过程结束
284 //-------------------------------------------------------------------
285 void slave_NOACK(void)
286 {
287 1 SDA = 1;
288 1 SCL = 1;
289 1 delayNOP();
290 1 SDA = 0;
291 1 SCL = 0;
292 1 }
293 //-------------------------------------------------------------------
294 // 函数名称: check_ACK
295 // 函数功能: 主机应答位检查子程序,迫使数据传输过程结束
296 //-------------------------------------------------------------------
297 void check_ACK(void)
298 {
299 1 SDA = 1; // 将p1.1设置成输入,必须先向端口写1
300 1 SCL = 1;
301 1 F0 = 0;
302 1 delayNOP();
303 1 if(SDA == 1) // 若SDA=1表明非应答,置位非应答标志F0
C51 COMPILER V7.08 PCF8591_DA_LCD1602_C51 12/21/2006 16:15:07 PAGE 6
304 1 F0 = 1;
305 1 SCL = 0;
306 1 }
307 //-------------------------------------------------------------------
308 // 函数名称: IICSendByte
309 // 入口参数: ch
310 // 函数功能: 发送一个字节
311 //-------------------------------------------------------------------
312 void IICSendByte(uchar ch)
313
314 {
315 1 unsigned char idata n=8; // 向SDA上发送一位数据字节,共八位
316 1
317 1 while(n--)
318 1 {
319 2 if((ch&0x80) == 0x80) // 若要发送的数据最高位为1则发送位1
320 2 {
321 3 SDA = 1; // 传送位1
322 3 SCL = 1;
323 3 delayNOP();
324 3 // SDA = 0;
325 3 SCL = 0;
326 3 }
327 2 else
328 2 {
329 3 SDA = 0; // 否则传送位0
330 3 SCL = 1;
331 3 delayNOP();
332 3 SCL = 0;
333 3 }
334 2 ch = ch<<1; // 数据左移一位
335 2 }
336 1 }
337 //-------------------------------------------------------------------
338 // 函数名称: IICreceiveByte
339 // 返回接收的数据
340 // 函数功能: 接收一字节子程序
341 //-------------------------------------------------------------------
342 uchar IICreceiveByte(void)
343 {
344 1 uchar idata n=8; // 从SDA线上读取一上数据字节,共八位
345 1 uchar tdata=0;
346 1 while(n--)
347 1 {
348 2 SDA = 1;
349 2 SCL = 1;
350 2 tdata =tdata<<1; //左移一位
351 2 if(SDA == 1)
352 2 tdata = tdata|0x01; // 若接收到的位为1,则数据的最后一位置1
353 2 else
354 2 tdata = tdata&0xfe; // 否则数据的最后一位置0
355 2 SCL = 0;
356 2 }
357 1
358 1 return(tdata);
359 1 }
360 //-------------------------------------------------------------------
361 // 函数名称: DAC_PCF8591
362 // 入口参数: slave_add从机地址,n要发送的数据个数
363 // 函数功能: 发送n位数据子程序
364 //-------------------------------------------------------------------
365 void DAC_PCF8591(uchar controlbyte)
C51 COMPILER V7.08 PCF8591_DA_LCD1602_C51 12/21/2006 16:15:07 PAGE 7
366 {
367 1
368 1 iic_start(); // 启动I2C
369 1 delayNOP();
370 1
371 1 IICSendByte(PCF8591_WRITE); // 发送地址位
372 1 check_ACK(); // 检查应答位
373 1 if(F0 == 1)
374 1 {
375 2 SystemError = 1;
376 2 return; // 若非应答,置错误标志位
377 2 }
378 1 IICSendByte(controlbyte&0x77); //Control byte
379 1 check_ACK(); //检查应答位
380 1 if(F0 == 1)
381 1 {
382 2 SystemError = 1;
383 2 return; // 若非应答,置错误标志位
384 2 }
385 1 }
386
387 //-------------------------------------------------------------------
388 // 函数名称: ADC_PCF8591
389 // 入口参数: controlbyte控制字
390 // 函数功能: 连续读入4路通道的A/D转换结果到receivebuf
391 //-------------------------------------------------------------------
392 /*
393 void ADC_PCF8591(uchar controlbyte)
394 {
395 uchar idata i; //,receive_da;
396
397 iic_start();
398
399 IICSendByte(PCF8591_WRITE); //控制字
400 check_ACK();
401 if(F0 == 1)
402 {
403 SystemError = 1;
404 return;
405 }
406
407 IICSendByte(controlbyte); //控制字
408 check_ACK();
409 if(F0 == 1)
410 {
411 SystemError = 1;
412 return;
413 }
414
415 iic_start(); //重新发送开始命令
416 IICSendByte(PCF8591_READ); //控制字
417 check_ACK();
418 if(F0 == 1)
419 {
420 SystemError = 1;
421 return;
422 }
423
424 IICreceiveByte(); //空读一次,调整读顺序
425 slave_ACK(); //收到一个字节后发送一个应答位
426
427 // while(i<4)
C51 COMPILER V7.08 PCF8591_DA_LCD1602_C51 12/21/2006 16:15:07 PAGE 8
428 for(i=0;i<4;i++)
429 {
430 // receive_da=IICreceiveByte();
431 // receivebuf[i]=receive_da;
432 receivebuf[i] = IICreceiveByte();
433 slave_ACK(); //收到一个字节后发送一个应答位
434 }
435 slave_NOACK(); //收到最后一个字节后发送一个非应答位
436 iic_stop();
437 }*/
438
439 /*********************************************************
440 输出三角波
441 *********************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -