完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
I2C 总线上,PCF8591 可以直接在1602上显示, 数据变化正常,但是PCF8591接入E2PROM后,读取出来的数据一直都是0XFF,哪位大神帮忙看看什么原因?
#include #include "i2c.h" #define DATA P0 ***it rs=P1^3; ***it rw=P1^4; ***it en=P1^5; u8 lcd1602[5]; void write_1602com(u8 com) { rs=0; rw=0; en=0; en=1; DATA=com; delay(5); en=0; } void write_1602dat(u8 dat) { rs=1; rw=0; en=0; en=1; DATA=dat; delay(5); en=0; } void init() { write_1602com(0x02); write_1602com(0x06); write_1602com(0x0c); write_1602com(0x38); write_1602com(0x01); } void display(u8 dat) { u16 t; t=dat*(50000.0/255)*2; // 不知道为什么要乘上2,不然最大值只有一半 lcd1602[4]=t/10000; lcd1602[3]=(t-lcd1602[4]*10000)/1000; lcd1602[2]=(t-lcd1602[4]*10000-lcd1602[3]*1000)/100; lcd1602[1]=(t-lcd1602[4]*10000-lcd1602[3]*1000-lcd1602[2]*100)/10; lcd1602[0]=t%10; write_1602com(0x83); write_1602dat(lcd1602[4]+'0'); delay(2); write_1602com(0x84); write_1602dat(lcd1602[3]+'0'); delay(2); write_1602com(0x85); write_1602dat(lcd1602[2]+'0'); delay(2); write_1602com(0x86); write_1602dat(lcd1602[1]+'0'); delay(2); write_1602com(0x87); write_1602dat(lcd1602[0]+'0'); delay(2); } u8 read_PCF8591() { u8 fun; start_i2c(); write_i2c(0x90); i2c_wait_ack(); // return 1; write_i2c(0x00); i2c_wait_ack(); //return 1; start_i2c(); write_i2c(0x91); i2c_wait_ack(); //return 1; fun=read_i2c(); ack_i2c(0); stop_i2c(); return fun; } void main() { init(); while(1) { write_i2c_address( 532 ,read_PCF8591()); display(read_i2c_address( 532 )); // display(read_PCF8591()); //delay(1000); } } #include "i2c.h" void delay(u8 n) { u8 x,y; for(x=n;x>0;x--) for(y=110;y>0;y--); } void nops() //5ns延时 { do{_nop_();_nop_();_nop_();_nop_();_nop_();} while(0); } void start_i2c() { sda=1; nops(); scl=1; nops(); sda=0; nops(); } void stop_i2c() { sda=0; nops(); scl=1; nops(); sda=1; nops(); } void ack_i2c(bit ck) { if(ck) sda=0; else sda=1; nops(); scl=1; nops(); scl=0; nops(); sda=1; nops(); } void i2c_wait_ack() { u8 i; scl=1; nops(); while((sda==1)&&(i<250)) i++; scl=0; nops(); } void write_i2c(u8 dat) { u8 i; for(i=0;i<8;i++) { scl=0; nops(); if(dat&0x80) sda=1; else sda=0; nops(); scl=1; dat<<=1; nops(); } } u8 read_i2c() { u8 i,temp=0; scl=0; nops(); sda=1; nops(); for(i=0;i<8;i++) { temp=temp<<1; scl=1; nops(); temp=temp|sda; scl=0; nops(); } return (temp); } void write_i2c_address(u8 add,u8 dat_byte) { start_i2c(); write_i2c(0xa2); i2c_wait_ack(); write_i2c(add/256); i2c_wait_ack(); write_i2c(add%256); i2c_wait_ack(); write_i2c(dat_byte); i2c_wait_ack(); stop_i2c(); delay(5000); } u8 read_i2c_address(u8 read_add) { u8 read_byte=0; start_i2c(); write_i2c(0xa2); i2c_wait_ack(); write_i2c(read_add/256); i2c_wait_ack(); write_i2c(read_add%256); i2c_wait_ack(); start_i2c(); write_i2c(0xa3); i2c_wait_ack(); read_byte=read_i2c(); // ack_i2c(0); stop_i2c(); return read_byte; } |
|
相关推荐
1个回答
|
|
iczoom188 发表于 2018-1-8 16:14 我外接的E2PROM at24c512 add之前是用的uint型的,后面找错误的时候改成uchar ,忘了改回来!串口接收回来的数据也不对。我感觉应该是read_i2c函数有问题! |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
551 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
910 浏览 0 评论
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】(第三篇)ADC采集+PWM输出
575 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验
572 浏览 0 评论
1221 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11769 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 18:44 , Processed in 0.668870 second(s), Total 76, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号