1、IIC总线读写EEPROM深度诠释/*-IIC总线读写EEPROM(串行扩展eeprom,24c02)(STC12C系列单片机自带eeprom,且有另外的eeprom操作方式)Allen.H(帮同学修改的一个程序)时间:2010.11.5-*/#include #include /是用括号还是双引号看情况,本地头文件用双引号,系统头文件用括号typedef unsigned char uchar;/良好的程序风格,不应该用#define/#define uchar unsigned charsbit sda=P20;/-你把sda和scl引脚可能定反了,我换过来了-sbit scl=P21;/
2、等号对其,变量名长短不一时,注意,且测试等于号=或者其他双目关系运算符两边都空一格/-void delay(uchar z)/带参数很好/大括号所在行不要写代码/函数与函数之间空一格void delay_7nop()/子程序命名最好顾名思义,比如delay_1ms(),这里考虑都是使用7nop,不带参数/*程序代码每进一层逻辑就缩进一格TAB键,TAB设置为3,4格,在keil的view-options里面设置,不要使用几个空格来缩进,统一使用TAB键*/delay函数都放在一起,函数顺序不要乱放,相关的放一起,/-void init()_nop_();_nop_();_nop_();_nop
3、_();_nop_();_nop_();_nop_();/这里0-1000多个_nop_都可以uchar i,j;/局部变量中用来自加自减可以用i,j之类的定义,计数建议不要用i,j/局部变量不占内存,函数调用时生成堆栈,不应该定义局部变量时作初始化/-局部变量命名后空一格,写正式代码for(i=z;i0;i-)for(j=100;j0;j-);/注明多少时间,在调试模式下,看窗口左边的SEC值/这里使用了_nop_()函数,所以调用此头文件#define TRUE 1/*define宏定义一般用大写,宏定义并不会减少最终代码空间define多行语句时,每一行末尾写上,最后一行可以不写,有时比
4、较短的语句写成一个子函数会牺牲更多的时间,因为函数调用耗时比较多,这个时候用一个define语句更好*/#define FALSE 0/-SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;/SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。/但更具体还是得看时序图,下面就没有都先把scl先拉高再去变sdavoid start()sda=1;delay_7nop(); /这里sda和第三行的scl信号哪个放上没什么区别,主要起始和停止信号风格保持一致就行了void stop()bit ask()/应答信号,return是什么类型这里函数就是什么类型, /每一个被传
5、送的字节后面都必须跟随一位应答位(即一帧共有9位)/如果一段时间内没有收到从机的应答信号,则自动认为从机已正确接收到数据bit flag;/真假判断,或只有0/1取值的标志位设置为bitsda=1;scl=1;delay_7nop();flag=sda;delay_7nop();scl=0;sda=0;delay_7nop();scl=1;delay_7nop();sda=1;delay_7nop();scl=1;delay_7nop();sda=0;delay_7nop();/scl=0;/允许数据变化,传数据的时候拉低才允许数据变化,/但是在开始信号和停止信号scl都为高,这里看时序图就知
6、道了sda=1;delay_7nop();scl=1;delay_7nop();delay_7nop();if(flag=1)elsereturn TRUE;/应答return FALSE;/非应答/用下面屏蔽的的应答信号也可以,上面的应答信号考虑更周全/*void ask()/应答*/-void writedata(uchar dat)/下面是readdata()和readd()保持程序风格的一致性,命名不该命为writecurrent/函数参数不要乱用P,q之类的毫无意义的名字,这里用dat,date是关键字,不能用/void writeadd(uchar add,uchar infor)
7、scl=0;delay_7nop();sda=1;/总线释放delay_7nop();uchar i;scl=0;/此句可有可无for(i=0;i8;i+)/按位写dat=dat1;/左移一位scl=0;delay_7nop();sda=CY;/psw位中的CY进位标识位,左移后最高位移入CYdelay_7nop();scl=1;/scl高电平,数据稳定delay_7nop();uchar i;scl=1;delay_7nop();while(sda=1)&(i250)i+;scl=0;delay_7nop();/-uchar readdata()uchar readd(uchar add)s
8、tart();writedata(0xa0);ask();writedata(add);ask();start();writedata(0xa1);ask();uchar r=0;/局部变量小写,全局变量首字母大写uchar i,dat;scl=0;delay_7nop();sda=1;/数据总线释放delay_7nop();for(i=0;i8;i+)/密切相关的代码紧接着写,不很相关的空一格再写return dat;scl=1;delay_7nop();dat=(datI/O-ports-)看不出P2口的变换,writeadd(25,0xaa);delay(50);/此处最少要delay(7);P1=readd(25);/P1还是P2还是P3主要是看你的硬件用哪个来测试init();/这里初始化一下/因为这里是外部EEPROM,要仿真芯片或者硬件的支持才能观察结果,本程序测试无误/xdata:外部数据存储区(64KB)当使用来了外部RAM时,应用它,keil中optionsfortarget的memory mode可选/pdata:分页的外部数据存储区bdata:可位寻址内部数据存储区(16B)idata:不可直接寻址的内部数据存储区(256B)当全局变量定义太多的时候/使用,比如:idata int或int idata来使用这个区域存储全局变量
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1