完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
问题:能显示,不能存储是怎么回事啊,我用I2c写pcf8591,I2c,能用啊,为什么到at24c02就不行了
#include #define uchar unsigned char #define uint unsigned int uchar code table[]={0xc0,0xf9,0xa4, 0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90}; //0到9的代码 uchar flag; ***it scl=P0^6; ***it sda=P0^5; ***it key=P3^0; /*********************************************** 名称:i2c_delay() 功能:延时 输入:无 输出:无 *************************************************************/ void i2c_delay() { ; ; ; ; } /********************************************************* 显示延时程序 *******************************************************/ void display_dealy(uchar time) { uchar x,y; for(x=time;x>0;x--) for(y=100;y>0;y--) ; } /************************************************************ 名称:i2c_init() 功能:释放时钟和数据线 输入:无 输出:无 ************************************************************/ void i2c_init() { sda=1; i2c_delay(); scl=1; i2c_delay(); } /*********************************************************** 名称:i2c_start() 功能:使i2c正常工作 输入:无 输出:无 ***********************************************************/ void i2c_start() { sda=1; //把sda拉高 i2c_delay(); // scl=1; //把数据 i2c_delay(); sda=0; i2c_delay(); //scl=0; //i2c_delay(); } /*********************************************************** 名称:i2c_stop() 功能:使i2c正常工作 输入:无 输出:无 ***********************************************************/ void i2c_stop() { sda=0; i2c_delay(); scl=1; i2c_delay(); sda=1; i2c_delay(); } /*********************************************************** 名称:i2c_ack 功能:使i2c正常工作 输入:无 输出:无 ***********************************************************/ void i2c_ack() { sda=0; scl=1; i2c_delay(); scl=0; //应答后把装scl拉低 sda=1; //释放总线 } /*********************************************************** 名称:i2c_nack 功能:使i2c正常工作 输入:无 输出:无 ***********************************************************/ void i2c_nack() { sda=1; scl=1; i2c_delay(); sda=0; scl=0; //把scl纸拉低 } /*********************************************************** 名称:i2c_test_ack 功能:使i2c正常工作 输入:无 输出:无 ***********************************************************/ void i2c_test_ack() { scl=1; i2c_delay(); if(sda==1) flag=1; //表示非应答 scl=0;//把时钟线拉低 } /*********************************************************** 名称:i2c_sendbyte(uchar date) 功能:写数据和命令 输入:date 输出:无 ***********************************************************/ void i2c_sendbyte(uchar date) { uchar i,temp; temp=date; for(i=0;i<8;i++) { scl=0; i2c_delay(); temp=temp<<1; sda=CY; i2c_delay(); scl=1; i2c_delay(); } scl=0; i2c_delay(); sda=1; i2c_delay(); } /*********************************************************** 名称:i2c_readbyte() 功能:写数据和命令 输入:date 输出:无 ***********************************************************/ uchar i2c_readbyte() { uchar j,x,k; for(j=0;j<8;j++) { scl=0; //使sda数据发生变化 i2c_delay(); x=x<<1; //把数据左移 k=sda; //把sda的值赋给k x=x|k; // 把数据相与 scl=1; //使数据操持稳定 i2c_delay(); } scl=0; sda=1; //释放总线 scl=1; return x; } /*********************************************************** 名称:i2c_add( uchar address,uchar date ) 功能:写命令与数据 输入:address,date 输出:无 ***********************************************************/ void i2c_add(uchar address,uchar date ) { i2c_start(); //启动i2c总线 i2c_sendbyte(0xa0); //发送芯片近制字节 i2c_ack(); //从机响应,为0 i2c_sendbyte(address); //发送内存地址字节 i2c_ack(); // 从机响应,为0 i2c_sendbyte(date); //发送数据字节 i2c_ack(); //从机响应,为0 i2c_stop(); //停止i2c总线 } /*********************************************************** 名称:i2c_readadd( ) 功能:写命令与数据 输入:address 输出: y ***********************************************************/ uchar i2c_readadd(uchar address) { uchar y; //用于存储数据 i2c_start(); //开启i2c总线 i2c_sendbyte(0xa0); //发送芯片控制位 i2c_ack(); //从机给个应答,为0 i2c_sendbyte(address); //发送存储地址 i2c_ack(); //从机给个应答,为0 i2c_start(); //重启i2c总线,做好接收准备 i2c_sendbyte(0xa1); //发送读信号 i2c_ack(); //从机给个应答为0 y=i2c_readbyte(); //读取存储器中的值 i2c_nack(); //主机发送个非应答的信号,为1 i2c_stop(); //停止数据总线 return y; //返回数据 } /*************************************************** 名称:void display(uchar n) 功能:显示数值 输入:n 输出:无 *******************************************************/ void display(uchar n ) { P1=0x01; //个位 P0=table[n%10]; display_dealy(5); P1=0x00; P1=0x02; //十位 P0=table[n/10%10]; display_dealy(5); P1=0x00; P1=0x04; //百位 P0=table[n/100]; display_dealy(5); P1=0x00; } void main() { uchar ii; i2c_init(); ii=i2c_readadd(2); //读取存储器的值 if(ii==255) //大过255把数值清0 ii=0; display(ii); //显示读出来的值 while(1) { if(key==0) //判断是否有按键 按下 { display_dealy(30); // 消抖动 if(key==0) //再确认一下有没有按键 按下 { ii++ ; //自加1 while(!key); //等待按键松开 } if(ii==255) //当加到255时,把值清0; ii=0; } i2c_add(2,ii ); //把数据写进存储器 display(ii); //显示数值 } } |
|
相关推荐
3个回答
|
|
uchar i2c_readbyte()这个函数里应该是scl下降沿读数据,你的是上升沿,还是写
|
|
|
|
这是我以前学习51时候好使的一个程序,把IO口改一下,好使之后可以加其他的程序比如1602等 |
|
|
|
#include"i2c.h"
void delay_i2c(uint x) { while(x--); } void init_i2c() { scl=1;sda=1; } void i2c_start() { sda=1;delay_i2c(1); scl=1;delay_i2c(1); sda=0;delay_i2c(1); } void i2c_stop() { sda=0;delay_i2c(1); scl=1;delay_i2c(1); sda=1;delay_i2c(1); } void i2c_ACK() { uchar i; scl=0;delay_i2c(1); scl=1;delay_i2c(1); while((sda==1)&&(i<254)) {i++;} scl=0;delay_i2c(1); } void write_byte(uchar date) { uchar temp; uchar i; temp=date; for(i=0;i<8;i++) { temp=temp<<1; scl=0;delay_i2c(1); sda=CY;delay_i2c(1); scl=1;delay_i2c(1); } scl=0;delay_i2c(1); sda=1;delay_i2c(1); } uchar read_byte() { uchar i,k=0; scl=0;delay_i2c(1); sda=1; for(i=0;i<8;i++) { scl=1;delay_i2c(1); k=k<<1|sda; delay_i2c(1); scl=0;delay_i2c(1); } return k; } |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》第三十五章 摄像头实验
757 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第三十章 DHT11数字温湿度传感器
728 浏览 0 评论
826 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
1459 浏览 0 评论
1208 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12058 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 07:48 , Processed in 0.585365 second(s), Total 77, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号