24c02汇编语言程序

合集下载

汇编AT24C02一个字节程序段之欧阳语创编

汇编AT24C02一个字节程序段之欧阳语创编
MOVC A,@A+DPTR
MOV P0,A
CLR P1.0
CALL DELAY ;显示延时
SETB P1.0
ANL 32H,#0FH
MOV A,32H
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV P0,A
CLR P1.1
CALL DELAY ;显示延时
RET
TAB1: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H
;界说引脚
时间:2021.03.01
创作:欧阳语
SDA BIT P3.3
SCL BIT P3.2
ORG 0000H
MAIN: MOV 30H,#25H ;存想存的数字
MOV 31H,#34H
MOV R1,30H
LL: MOV B,R1
CALL W24C02 ;写入24c02
CALL R24C02 ;读出24c02
NOP
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
NACK: SETB SDA ;非应答法度段
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
NOP
RET
END
时间:2021.03.01
创作:欧阳语
CALL DISPLAY ;显示数字
INC R1
JMP LL
;**************************** 显示 *************************************************

最好的24C02储存开机次数实验读写程序

最好的24C02储存开机次数实验读写程序

24C02储存开机次数实验24C02是2K字节的串行EEPROM, 内部含有256个8位字节,该器件通过总线操作,并有专门的写保护功能。

串行EEPROM简称I2C总线式串行器件。

串行器件不仅占用很少的资源和I/O线,而且体积大大缩小,同时具有工作电源宽、抗干扰能力强、功耗低、数据不易丢失和支持在线编程等特点。

I2C总线是一种用于IC器件之间连接的二线制总线。

它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:不管是单片机、存储器、LCD驱动器还是键盘接口。

我们通过一个实验来了解24C02的读写操作过程:该实验功能是单片机复位一次,自动从24C02中读取数据,然后加1,最终数码管中的数据就是开机的次数,具有一定的实用意义。

相关原理:程序运行的照片:接线方法:1、接8位数码管的数据线。

将数码管部份的数据口 JP5接到CPU部份的P0口JP51.2、接8位数码管的显示位线。

将数码管部份的显示位口 JP8接到CPU部份的P2口JP52.3、用一根2PIN数据线一端插入CPU部份JP53(P3口)的P3.6,P3.7另外一端插入24C02部份的控制端JP38。

烧写后用手按复位键可以看到数码管每按一下加一。

程序流程图:汇编语言参考程序: SDA24 EQU P3.7 SCLK24 EQU P3.6 ORG 0000HAJMP MAINORG 0080HMAIN:CLR P3.7 ;打开写保护MOV DPTR,#TABMOV A,#00H ;读地址LCALL RD24CJNE A,#10,TTTT: JNC TT1AJMP TT2TT1: MOV A,#00TT2: MOV 30H,AMOVC A,@A+DPTRCLR P2.6 ;开数码管MOV P0,A ;送显示MOV A,30HINC AMOV B,AMOV A,#00HLCALL WT24AJMP $TAB: DB 28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60HRD24: PUSH ACC ;读24C02子程序。

C51编写的AT24C02详细的读写程序

C51编写的AT24C02详细的读写程序

C51_AT24C02读写程序:/*void start() //开始信号void stop() //停止信号void Ack() //发确认信号void NoAck() //发无确认信号void init()//初始化信号,拉高SDA和SCL两条总线bit write_byte(uchar date)//写一字节,将date 写入AT24C02 中uchar read_byte()//读一字节,从AT24C02 中读一字节bit busy() //应答查询,stop()后,启动A T24C02内部写周期,启动查询//初始化EEPROM子程序内容为0XFF,nPage(0~31)void Init_Flash(uchar nPage) //8 bytes/1 page init 0xFFvoid write_add(uchar address,uchar date)//向AT24C02 中写数据//从AT24C02中给定的地址nAddr起,将存放在以指针nContent开头的存储空间中的nLen 个字节数据,连续写入AT24C02void write_flash(uchar *nContent,uchar nAddr, uchar nLen)uchar read_add(uchar address)//从AT24C02 中读出数据//从AT24C02中给定的地址nAddr起,读取nLen个字节数据存放在以指针nContent开头的存储空间。

void read_flash(uchar *nContent,uchar nAddr, uchar nLen)*//*单片机P2口接74HC138(三八译码器)P2.3--74HC138:/EI、P2.2--74HC138:A2、P2.1--74HC138:A1、P2.0--74HC138:A0译码器输出Y0,Y1、Y2、Y3、Y4、Y5、Y6、Y7均低电平有效,分别选通1~8个数码管。

24c02读写程序

24c02读写程序
}
//===================================================================//
//==========================================================
i=readx(); stop();
delay1(10);
return(i);
}
void x24c02_write(uchar address,uchar info)
{
EA=0;
start(); writex(0xa0);
clock(); writex(address);
clock(); writex(info);
clock(); stop();
EA=1;
delay1(50);
}
//====================================================================//
main (){
}
uchar readx()
{
uchar i,j,k=0;
scl=0; flash(); sda=1;
for (i=0;i<8;i++){
flash(); scl=1; flash();
if (sda==1) j=1;
else j=0;
uchar x24c02_read(uchar address); //从24c02的地址address中读取一个字节数据
void x24c02_write(uchar address,uchar info);

飞思卡尔IIC的24c02程序

飞思卡尔IIC的24c02程序

本程序是HCS系列都可以本人已通过实验下面是程序代码/*****************头文件*****************************************/#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */#include "iic24c02.h"/*********************延时函数************************************/ void delay(void){byte i;i=8;while(i>0){i--;}}/*********************ICC初始化************************************/ void Init_IIC(void){SOPT1_IICPS=0; //IIC 在PTA引脚上// IICF=0x0d; //设置波特率<100kbps// IICF=0X4B;IICF=0X24;IICC_IICEN=1;//使能IICIICC_TXAK=0; //当接收完一字节数据产生确认位IICC_IICIE=0;//禁止中断// IICA=0x38;}/*********************写函数************************************/void WRITE_IIC(uchar addres,uchar date){byte temp;IICC_IICEN = 0;IICC_IICEN = 1; //使能IICtemp = IICS; //清中断IICS_IICIF = 1;IICC_MST=0;IICS_SRW=0;IICC_TX=1; //写使能IICC_MST=1; //设为主模式delay();IICD=0xA0; //发送芯片地址,写命令while(!IICS_IICIF );temp = IICS;IICS_IICIF=1;IICD=addres; //发送寄存器地址while(!IICS_IICIF);temp = IICS;IICS_IICIF=1;IICD=date;//写第1个字节while(!IICS_IICIF);temp = IICS;IICS_IICIF=1;IICC1_TX=0;IICS_SRW=0;IICC1_MST=0;}/*********************读一个字节************************************/byte IIC_read_one_byte(byte address){byte temp;IICC_RSTA=0;IICC_IICEN = 0;IICC_IICEN = 1; //使能IICtemp = IICS; /* Clear any pending interrupt */IICS_IICIF = 1;IICC1_MST=0;IICS_SRW=0;IICC_TX=1; //写使能IICC_MST=1; //置为主模式delay();IICD=0xA0; //发送芯片地址,写命令while(!IICS_IICIF);temp = IICS;IICS_IICIF=1;IICD=address; //发送寄存器地址while(!IICS_IICIF);temp = IICS;IICS_IICIF=1;IICC_TXAK=1;IICC_RSTA=1; //重新启动IICD=0xA1; //读命令while(!IICS_IICIF);temp = IICS;IICS_IICIF=1;IICC_TX=0; //读使能temp=IICD;while(!IICS_IICIF);temp = IICS;IICS_IICIF=1;temp=IICD; //读一个字节IICC_MST=0;delay();return(temp);}。

24C02读写C语言程序

24C02读写C语言程序
24C02读写C语言程序-下面是本人编写的源程
2010-09-01 10:08
>下面是本人编写的源程序,已经调试成功,下载就可以使用,程序编写的不是很规范
,希望各位读者批评指正!!!
>/***********************************************************
> for(i=0;i<n;i++)//写入8字节数据
> {
> SendData(s);
> Test_Ack();
> if(flag==0) return(0);
> }
> I2C_Stop();
> return(1);
>}
>/*************************************************************
> SCL=0;
> delay();
> SDA=0;
> delay();
>}
>/********************************************************
>**名称:Test_Ack()
>**功能:检测应答位
>*********************************************************/
>void Ack()
>{
> SDA=0;
> delay();
> SCL=1;
> delay();

24c02典型程序

24c02典型程序

24c02典型程序#include<reg52.h>#include<i2c.h>#include<lcd.h>#define uchar unsigned char#define uint unsigned int#define adwrite 0xae //24c02地址(写)#define adread 0xaf //24c02地址(读)uchar num_wr[4]={'a','b','c','d'}; //存放写入数据(液晶显示abcd)//uchar num_rd[4]; //存放读24c02回的数据/**************************************** ***函数名称:delayms()功能:延迟j毫秒参数:char j返回值:无***************************************** ***/void delayms(uchar j){uint i;for(;j>0;j--){for(i=0;i<125;i++){;}}}/**************************************** ***函数名称:rom_write()功能:循环写进num个字节参数:如下返回值:无***************************************** ***/void rom_write(uchar date[],ucharaddress,uchar num){uchar i; // 循环次数iic_start();iic_write(adwrite); // 24c02写地址iic_ack();iic_write(address); // 24c02起始存储地址写入可自动+1iic_ack();for(i=0;i<num;i++) // 循环写入num个字节{iic_write(date[i]);iic_ack();}iic_stop(); // 结束}/**************************************** ***函数名称:rom_read()功能:读回1个字节参数:uchar address返回值:q***************************************** ***/unsigned char rom_read (uchar address){ uchar q;iic_start();iic_write(0xae); //写入芯片地址iic_ack();iic_write(address); //写入存储地址iic_ack();iic_start();iic_write(0xaf); //读回地址iic_ack();q=iic_read(); //读数据iic_noack();iic_stop(); //最后非应答return q; //读回该地址存储的数}/*******************************************函数名称:main()功能:初始化及循环调用子函数显示参数:无返回值:无***************************************** ***//*void main(){uchar i;init(); //1602初始化wp=0;P2=0xff;rom_write(num_wr,6,4); //从24c02地址6开始写入4个数据delayms(40);for(i=6;i<10;i++) //液晶1602显示'abcd' w_dat(rom_read(i));while(1);}*/。

24C02程序

24C02程序

//重新发送
val = IIc_write_byte(Address_24C02);//写器件地址
}
IIc_write_byte(add);//写存储的地址
for(i=0;number>0;number--)
{
IIc_write_byte(*p++);//写存储的数据
}
IIc_stop();
return(1);
/*在 24c02 的 add 地址中写入一个数据
date;返回 1 设备正常*/
/******************************************************************************
************
用页写 CAT24WC01 可一次写入 8 个字节数据,CAT24WC02/04/08/16 可以一次写入 16 个字
IIc_Sad = 1; IIc_Scl = 1; _NOP_(); IIc_Sad = 0; _NOP_(); IIc_Scl = 0; }
/*停止 I2C 总线*/ void IIc_stop() {
IIc_Sad = 0; _NOP_(); IIc_Scl = 1;
_NOP_(); IIc_Sad = 1; //总线置于空闲状态 }
vaule++;
IIc_Scl = 0;
_NOP_();
}
IIc_Sad = !Master_ack;//主机应答信号
_NOP_();
IIc_Scl = 1;
_NOP_();
IIc_Scl = 0;
_NOP_();
return vaule;
}

24C02经典程序

24C02经典程序

总线上主和从(即发送和接收)的关系不是一成不变的,而是取决于此时数据传送的方向。SDA和SCL均为双向I/O线,通过上拉电阻接正电源。当总线空闲时,两根线都是高电平。连接总线的器件的输出级必须是集电极或漏极开路,以具有线“与”功能。I2C总线的数据传送速率在标准工作方式下为100kbit/s,在快速方式下,最高传送速率可达400kbit/s。
当主器件发送完一个字节的数据后,接着发出对应于SCL线上的一个时钟(ACK)认可位,在此时钟内主器件释放SDA线,一个字节传送结束,而从器件的响应信号将SDA线拉成低电平,使SDA在该时钟的高电平期间为稳定的低电平。从器件的响应信号结束后,SDA线返回高电平,进入下一个传送周期。
I2C总线还具有广播呼叫地址用于寻址总线上所有器件的功能。若一个器件不需要广播呼叫寻址中所提供的任何数据,则可以忽略该地址不作响应。如果该器件需要广播呼叫寻址中提供的数据,则应对地址作出响应,其表现为一个接收器。
5.总线竞争的仲裁 总线上可能挂接有多个器件,有时会发生两个或多个主器件同时想占用总线的情况。例如,多单片机系统中,可能在某一时刻有两个单片机要同时向总线发送数据,这种情况叫做总线竞争。I2C总线具有多主控能力,可以对发生在SDA线上的总线竞争进行仲裁,其仲裁原则是这样的:当多个主器件同时想占用总线时,如果某个主器件发送高电平,而另一个主器件发送低电平,则发送电平与此时SDA总线电平不符的那个器件将自动关闭其输出级。总线竞争的仲裁是在两个层次上进行的。首先是地址位的比较,如果主器件寻址同一个从器件,则进入数据位的比较,从而确保了竞争仲裁的可*性。由于是利用I2C总线上的信息进行仲裁,因此不会造成信息的丢失。
clr p1.0 ;发开始信号
mov a,r3 ;送器件地址

24c02程序

24c02程序

按下4×4键盘任意一个键,记下数码管显示的值。

复位单片机后数码管显示刚才显示的值学习IIC接口的EEPROM读写:IIC接口的时序比较复杂,对初学者难度较大,要对照at24c02资料的时序图认真研究才明白*/#include<reg51.h>sbit speaker=P3^7;sbit led_k=P1^4;/////////////////键盘sbit v1=P2^0;sbit v2=P2^1;sbit v3=P2^2;sbit v4=P2^3;sbit h1=P2^4;sbit h2=P2^5;sbit h3=P2^6;sbit h4=P2^7;/////////////////显示sbit shu1=P1^3;/*第1位数码管共阴端*/sbit shu2=P1^2;/*第2位数码管共阴端*/sbit shu3=P1^1;/*第3位数码管共阴端*/sbit shu4=P1^0;/*第4位数码管共阴端*/////////////////24c02sbit sda=P1^6;sbit scl=P1^5;void start();void delay1();unsigned int read(unsigned int word_address);void write(unsigned int word_address,da);void delayms(unsigned int i);unsigned char yima[]={0xeb,0x88,0xb3,0xba,0xd8,0x7a,0x7b,0xa8,0xfb,0xfa};/*译码表,此表数据和硬件相关*/unsigned int b=0;/*要显示的数据*/unsigned int b_count=0;/*扫描次数*/void delayms(unsigned int i);unsigned char keyboar();void t0()interrupt 1 using 1 /*中断程序负责显示b的值*/{unsigned char a1=0,a2=0,a3=0,a4=0;static int k=0;/*数码管扫描显示*/a1=b/1000;/*取b的千位*/a2=b%1000/100;/*取b的百位*/a3=b%100/10;/*取b的十位*/a4=b%10;/*取b的个位*/if(k==0){shu4=1;shu1=0;shu2=0;shu3=0;P0=yima[a1];}else if(k==1){shu4=0;shu1=1;shu2=0;shu3=0;P0=yima[a4];}else if(k==2){shu4=0;shu1=0;shu2=1;shu3=0;P0=yima[a3];}else if(k==3){shu4=0;shu1=0;shu2=0;shu3=1;P0=yima[a2];}k++;if(k>3)k=0;TH0=240;}main(){//write(1,60);unsigned char b_tem;b=read(1); //读取eeprom地址为1的数据并赋值给b,定时中断程序把b显示在数码管speaker=0;/*关闭蜂鸣器电源,否则蜂鸣器会发热*/led_k=0;//关闭ledEA=1;/*开全局中断*/TR0=1;/*定时器0开始计数*/ET0=1;/*定时器0开中断*/TMOD=0X01;/*定时器0工作在方式1:16位计数模式*/while(0){}while(1){b_tem=keyboar();/*把按键的代表的值给b */if(b_tem<17){if(b!=b_tem) //当按下的按键与上次按下的不同时,执行写EERPOM。

EEPROM24C02,程序将对存储器进行读和写

EEPROM24C02,程序将对存储器进行读和写

/*EEPROM24C02,程序将对存储器进行读和写,因此涉及到键盘程序,比较复杂,耐心学,例子读取24C02内部数据,在数码管上显示,可通过按键来进行不同地址数据的读取和保存*/#include <reg51.h>#include <intrins.h>#define W24C02 0xA0 //存储器的写地址#define R24C02 0xA1 //存储器的读地址#define MSB 0x80 //8位二进制最高位置1#define LSB 0x01 //8位二进制最低位置1/********************/sbit SDA=P3^6; //A T24C02串行数据5脚sbit SCL=P3^7; //A T24C02串行时钟6脚sbit SPK=P3^4; //蜂鸣器,按键用时蜂鸣void I2C_write(unsigned char tmp); //向I2C总线写数据unsigned char I2C_read(); //向I2C总线读数据void I2C_ACK(bit tmp); //ACK应答void I2C_start(void); //I2C传送数据的开始void I2C_stop(void); //I2C传送数据的结束void _24c02menu(void); //当我们按下按键进入处理I2C数据时用的函数void _24c02wdate(unsigned char tmp); //当我们对24C02存储器进行写数据用到的函数void display(unsigned char *lp,unsigned char lc);//显示,在键盘程序里用过void displaystr(unsigned char *lp,unsigned char lc);//字符的显示函数,同上void delay();//延时子函数void ReadKey(void); //扫描键盘获取键值unsigned char l_key=0xFF; //定义变量,存放键值unsigned char l_keyold=0; //做为按键松开否的凭证code unsigned char l_24C02[5]={0x5b,0x66,0x39,0x3f,0x5b};//定义数组常量在数码管上显示24C02unsigned char l_address=0; //读24C02的地址变量unsigned char l_tmpdate[6]={0,0,0x10,0,0,0}; //数组变量code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};//共阴数码管0-9 a-f - 表code unsigned char key_tab[17]={0xed,0x7e,0x7d,0x7b,0xbe,0xbd,0xbb,0xde,0xdd,0xdb,0x77,0xb7,0xee,0xd7,0xeb,0xe7,0XFF};//========================此数组为键盘编码,// 1 2 3 a// 4 5 6 b// 7 8 9 e// * 0 # fvoid main(void) //入口函数{TMOD=0x01; //设置定时器0为模式1方式,TH0=0XD1; //设置初值,为12毫秒TL0=0X20;EA=1; //开启总中断ET0=1; //开启定时器中断0EX0=1; //开启外部中断0IT0=1; // 设置成下降沿触发方式P0=0xf0; //while(1){displaystr(l_24C02,5); //用这个函数显示5个字符if(l_key==0x0e){l_key=0xff; //按下#键调用_24c02menu(); //此函数}}}//以下一部份在键盘程序里有说明,此处不在讲述void key_scan() interrupt 0 //外部中断0 0的优先级最高{EX0=0;TH0=0XD1;TL0=0X20;TR0=1;}void timer0_isr(void) interrupt 1 //定时器0的中断函数{TR0=0;ReadKey();}void ReadKey(void){unsigned char i,j,key;j=0xfe;key=0xff;for (i=0;i<4;i++){P0=j;if ((P0&0xf0)!=0xf0){key=P0;break;}j=_crol_(j,1);}if (key==0xff){l_keyold=0xff;P0=0xf0;SPK=1;EX0=1;return;}else{TH0=0X2E;TL0=0X20;TR0=1;SPK=0;}if(l_keyold!=key){l_keyold=key;for(i=0;i<17;i++){if (key==key_tab[i]){l_key=i;break;}}}}void display(unsigned char *lp,unsigned char lc)//显示{unsigned char i;P2=0;P1=P1&0xF8;for(i=0;i<lc;i++){P2=table[lp[i]];P2=0;if(i==7)break;P1++;}}void displaystr(unsigned char *lp,unsigned char lc)//显示{unsigned char i;P2=0;P1=P1&0xF8;for(i=0;i<lc;i++){P2=lp[i];delay();P2=0;if(i==7)break;P1++;}}void delay(void) //{unsigned char i=10;while(i)i--;}void _24c02menu(void) //处理I2C数据时用的函数{unsigned char tmp,tmp2;P2=0; //数码管显示清0l_key=0xfe; //进入存储器处理程序先读取0地址的数据while (1){if(l_key==0x0c){ //如果按下*号键退出循环,即退出回到主函数l_key=0xff;break;}switch(l_key){ //扫描键盘做相应处理case 0x0a: //按下0X0A键,我们可将它理解为上翻键l_key=0xff;if(l_address>0){l_address--; //将地址减1l_key=0xfe; //读取数据break;case 0x0b: //按下0X0A键,我们可将它理解为下翻键l_key=0xff;if(l_address<255){l_address++; //将地址加1l_key=0xfe; ////读取数据}break;case 0x0e: //如果按下#号键,调用写存储器函数l_key=0xff;_24c02wdate(tmp);l_key=0xfe;break;case 0xfe: //此按值是在键盘是没有的,我们有内部给他增加做为读数据处理l_key=0xff;I2C_start(); //I2C读数据的开始,到下面的结束是读一地址的整个过程,I2C_write(W24C02); //向I2C总线发出读取24C02的地址I2C_ACK(0); //下面就得你们自己结合I2C串口协议进行,先看看24C02数据手册是怎么讲I2C协议的I2C_write(l_address);//先写入地址,I2C_ACK(1);I2C_stop();I2C_start(); //再开始读取数据I2C_write(R24C02);I2C_ACK(0);tmp=I2C_read();I2C_ACK(1);I2C_stop(); //读取一个地址的数据结束l_tmpdate[0]=l_address/16; //数码管前两位显示地址(以16进制显示)l_tmpdate[1]=l_address%16; //将地址变量分开用两位数据l_tmpdate[3]=tmp/100; //后面用10进制数显示数据,中间用"-"隔开,数组l_tmpdate[2]tmp2=tmp%100; //8位二进制最大十进制为255,所以我们也将它分开三位显示l_tmpdate[4]=tmp2/10;l_tmpdate[5]=tmp2%10;break;}display(l_tmpdate,6);}}void _24c02wdate(unsigned char tmp)//对24C02的写数据处理函数{unsigned char tmp2=0;while(1){if (l_key==0x0c){ //如果按下*号键退出循环,即退出回到上一极函数l_key=0xff;break;}if(l_key==0x0e){ //如果按下#号键,将更改的数据写入24C02存储器l_key=0xff;I2C_start(); //下面是写一地址数据的过程I2C_write(W24C02); //先向总线发出写24C02的地址I2C_ACK(0);I2C_write(l_address); //写入地址I2C_ACK(0);I2C_write(tmp); //然后写入数据I2C_ACK(1);I2C_stop();break;}switch(l_key){ //下面是对数据的处理case 0x01: //如果按下1键,数据百位加1l_key=0xff;if(tmp<155)tmp+=100;break;case 0x02: //如果按下2键,数据十位加1l_key=0xff;if(tmp<245)tmp+=10;break;case 0x03: //如果按下3键,数据个位加1l_key=0xff;if(tmp<255)tmp++;break;case 0x04: //如果按下4键,数据百位减1l_key=0xff;if(tmp>=100)tmp-=100;break;case 0x05: //如果按下5键,数据十位减1l_key=0xff;if(tmp>=10)tmp-=10;break;case 0x06: //如果按下6键,数据个位减1l_key=0xff;if(tmp>0)tmp--;break;}l_tmpdate[3]=tmp/100; //地址不变我们不用修改,更改数据显示即可tmp2=tmp%100;l_tmpdate[4]=tmp2/10;l_tmpdate[5]=tmp2%10;display(l_tmpdate,6);}}void I2C_write(unsigned char tmp)//I2C写入一个8位二进制数,高位在前低位在后{unsigned char i;for(i=0;i<8;i++){SCL=0;_nop_();_nop_();_nop_();SDA=(bit)(tmp&0x80);tmp<<=1;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();}SCL=0;}unsigned char I2C_read(void)////I2C读取一个8位二进制数,也是高位在前低位在后{unsigned char i,tmp;tmp=0;for(i=0;i<8;i++){SCL=0;_nop_();_nop_();_nop_(); //加入空指令增加稳定性,这关系到频率问题SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();tmp<<=1;if(SDA==1)tmp++;}SCL=0;return tmp;}void I2C_ACK(bit tmp) //根据tmp的1、0来决定应答信号{SDA=tmp;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=0;}void I2C_start(void) //看看I2C开始的波形,再对应SDA、SCL的输出{SDA=1;_nop_();SCL=1;_nop_();SDA=0;_nop_();SCL=0;_nop_();}/*********/void I2C_stop(void) //I2C结束{SDA=0;_nop_();SCL=1;_nop_();SDA=1;_nop_();SCL=0;_nop_();}。

STM32-24C02读写程序(亲自编写测试可用)

STM32-24C02读写程序(亲自编写测试可用)

本文档内容为在STM32条件下的24C02读写程序。

全文共分四部分,第一部分24C02的C程序,第二部分为24C02的.h程序,第三部分为端口与时钟配置函数,第四部分为主函数。

下面分别进行介绍。

第一部分:24C02的.c函数******************************************************************************/ #include "stm32f10x.h"#include "system_config.h"#include "24C02.h"u8 savedata[10]={10,9,8,7,6,5,4,3,2,1};/****************************************************************************** ** Function Name : AT24C02_SDA_IO_SET(uchar io_set)* Description : SDA方向控制* Input : None* Output : None* Return : None******************************************************************************* /void AT24C02_SDA_IO_SET(unsigned char io_set){GPIO_InitTypeDef GPIO_InitStructure;if(io_set){GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 ;//SDA 设置为输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);}else{GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 ;//SDA 设置为输入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB, &GPIO_InitStructure);}}/****************************************************************************** ** Function Name : delay2* Description : 延时函数* Input : None* Output : None* Return : None******************************************************************************* /void delay2(u8 x){u8 i;for(i=0;i<x;i++);}/****************************************************************************** ** Function Name : delay2* Description : 延时函数* Input : None* Output : None* Return : None******************************************************************************* /void delay_nop(void){uint8_t i=10;//延时1.5uswhile(i--);}/****************************************************************************** ** Function Name : 24C02_init()* Description : 初始化函数* Input : None* Output : None* Return : None******************************************************************************* /void I2C_init(void){//SCL=1SCL_H;delay_nop();//SDA=1SDA_H;delay_nop();}/****************************************************************************** ** Function Name : I2C_start()* Description : 开始信号* Input : None* Output : None* Return : None******************************************************************************* /void I2C_start(){SDA_H;delay_nop();SCL_H;delay_nop();SDA_L;delay_nop();SCL_L;delay_nop();}/****************************************************************************** ** Function Name : I2C_stop()* Description : 开始信号* Input : None* Output : None* Return : None******************************************************************************* /void I2C_stop(){SDA_L;delay_nop();SCL_H;delay_nop();SDA_H;delay_nop();}/****************************************************************************** ** Function Name : I2C_write_bit()* Description : 开始信号* Input : None* Output : None* Return : None******************************************************************************* /void I2C_write_bit(int j){int i,temp,temp1;temp=j;//AT24C02_SDA_IO_SET(1);//发送数据for(i=0;i<8;i++){temp1=temp&0x80;//高位在前相与temp=temp<<1;SCL_L;//时钟线设为低delay_nop();if(temp1==0x80)//发送数据到SDA线上{SDA_H;delay_nop();}else{SDA_L;delay_nop();}SCL_H;//时钟线设为高,开始传输数据delay_nop();}SCL_L;//一个字节发送完成delay_nop();SDA_H;delay_nop();}/****************************************************************************** ** Function Name : I2C_read_bit()* Description : 读取一个字节数据* Input : None* Output : None* Return : None******************************************************************************* /u8 I2C_read_bit(){u8 i,j,k=0;SCL_L;delay_nop();SDA_H;delay_nop();A T24C02_SDA_IO_SET(0);//SDA设置为输入for(i=0;i<8;i++){delay_nop();SCL_H;delay_nop();if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==1)j=1;elsej=0;k=(k<<1)|j;SCL_L;delay_nop();}A T24C02_SDA_IO_SET(1);//SDA设置为输出delay_nop();return(k);}/****************************************************************************** ** Function Name : I2C_reply()* Description : 读取应答信号* Input : None* Output : None* Return : None******************************************************************************* /void I2C_reply(){u16 i=0;A T24C02_SDA_IO_SET(0);//SDA设置为输入SCL_H;delay_nop();while((GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==1)&&(i<5000))i++;SCL_L;delay_nop();A T24C02_SDA_IO_SET(1);//SDA设置为输出}/****************************************************************************** ** Function Name : I2C_write_addr()* Description : 指定地址写* Input : None* Output : None* Return : None******************************************************************************* /void I2C_write_addr(u8 addr,u8 data){I2C_start();//开始信号I2C_write_bit(0xa0);//发送写命令I2C_reply();//等待应答I2C_write_bit(addr);//发送写地址I2C_reply();//等待应答I2C_write_bit(data);//发送写数据I2C_reply();//等待应答I2C_stop();//停止信号delay2(250);}/****************************************************************************** ** Function Name : I2C_read_addr()* Description : 指定地址读* Input : None* Output : None* Return : None******************************************************************************* /int I2C_read_addr(int addr){int i=0;I2C_start();//开始信号I2C_write_bit(0xa0);//发送写命令因为要先写入要读的地址I2C_reply();//等待应答I2C_write_bit(addr);//发送读地址I2C_reply();//等待应答I2C_start();//开始信号I2C_write_bit(0xa1);//发送读命令I2C_reply();//等待应答i=I2C_read_bit();I2C_stop();//停止信号delay2(250);return(i);}第二部分:24C02的.h函数#define SCL_H GPIO_SetBits(GPIOB,GPIO_Pin_6)#define SCL_L GPIO_ResetBits(GPIOB,GPIO_Pin_6)#define SDA_H GPIO_SetBits(GPIOB,GPIO_Pin_7)#define SDA_L GPIO_ResetBits(GPIOB,GPIO_Pin_7)#define Write_able GPIO_ResetBits(GPIOB,GPIO_Pin_5)//24C02写使能控制引脚void AT24C02_SDA_IO_SET(unsigned char io_set);void delay2(u8 x) ;void delay_nop(void);void I2C_init(void);void I2C_start();void I2C_stop();void I2C_write_bit(int j);u8 I2C_read_bit();void I2C_reply();void I2C_write_addr(u8 addr,u8 data) ;int I2C_read_addr(int addr) ;第三部分:端口与时钟配置函数由于我们使用的是PB6作为时钟线,PB7作为数据线,所以端口配置PB6,PB7就可以了。

最好的24C02储存开机次数实验 读写程序-推荐下载

最好的24C02储存开机次数实验 读写程序-推荐下载

汇编语言参考程序: SDA24 EQU P3.7 SCLK24 EQU P3.6 ORG 0000H AJMP MAIN ORG 0080H MAIN:
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术通关,1系电过,力管根保线据护敷生高设产中技工资术艺料0不高试仅中卷可资配以料置解试技决卷术吊要是顶求指层,机配对组置电在不气进规设行范备继高进电中行保资空护料载高试与中卷带资问负料题荷试2下卷2,高总而中体且资配可料置保试时障卷,各调需类控要管试在路验最习;大题对限到设度位备内。进来在行确管调保路整机敷使组设其高过在中程正资1常料中工试,况卷要下安加与全强过,看度并22工且22作尽22下可22都能22可地护以缩1关正小于常故管工障路作高高;中中对资资于料料继试试电卷卷保破连护坏接进范管行围口整,处核或理对者高定对中值某资,些料审异试核常卷与高弯校中扁对资度图料固纸试定,卷盒编工位写况置复进.杂行保设自护备动层与处防装理腐置,跨高尤接中其地资要线料避弯试免曲卷错半调误径试高标方中高案资等,料,编试要5写、卷求重电保技要气护术设设装交备备置底4高调、动。中试电作管资高气,线料中课并敷3试资件且、设卷料中拒管技试试调绝路术验卷试动敷中方技作设包案术,技含以来术线及避槽系免、统不管启必架动要等方高多案中项;资方对料式整试,套卷为启突解动然决过停高程机中中。语高因文中此电资,气料电课试力件卷高中电中管气资壁设料薄备试、进卷接行保口调护不试装严工置等作调问并试题且技,进术合行,理过要利关求用运电管行力线高保敷中护设资装技料置术试做。卷到线技准缆术确敷指灵设导活原。。则对对:于于在调差分试动线过保盒程护处中装,高置当中高不资中同料资电试料压卷试回技卷路术调交问试叉题技时,术,作是应为指采调发用试电金人机属员一隔,变板需压进要器行在组隔事在开前发处掌生理握内;图部同纸故一资障线料时槽、,内设需,备要强制进电造行回厂外路家部须出电同具源时高高切中中断资资习料料题试试电卷卷源试切,验除线报从缆告而敷与采设相用完关高毕技中,术资要资料进料试行,卷检并主查且要和了保检解护测现装处场置理设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。

最好的24C02储存开机次数实验 读写程序

最好的24C02储存开机次数实验 读写程序

24C02储存开机次数实验24C02是2K字节的串行EEPROM, 内部含有256个8位字节,该器件通过总线操作,并有专门的写保护功能。

串行EEPROM简称I2C总线式串行器件。

串行器件不仅占用很少的资源和I/O 线,而且体积大大缩小,同时具有工作电源宽、抗干扰能力强、功耗低、数据不易丢失和支持在线编程等特点。

I2C总线是一种用于IC器件之间连接的二线制总线。

它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:不管是单片机、存储器、LCD驱动器还是键盘接口。

我们通过一个实验来了解24C02的读写操作过程:该实验功能是单片机复位一次,自动从24C02中读取数据,然后加1,最终数码管中的数据就是开机的次数,具有一定的实用意义。

相关原理:程序运行的照片:接线方法:1、接8位数码管的数据线。

将数码管部份的数据口 JP5接到CPU部份的P0口JP51.2、接8位数码管的显示位线。

将数码管部份的显示位口 JP8接到CPU部份的P2口JP52.3、用一根2PIN数据线一端插入CPU部份JP53(P3口)的P3.6,P3.7另外一端插入24C02部份的控制端JP38。

烧写后用手按复位键可以看到数码管每按一下加一。

程序流程图:汇编语言参考程序: SDA24 EQU P3.7 SCLK24 EQU P3.6 ORG 0000HAJMP MAINORG 0080HMAIN:CLR P3.7 ;打开写保护MOV DPTR,#TABMOV A,#00H ;读地址LCALL RD24CJNE A,#10,TTTT: JNC TT1AJMP TT2TT1: MOV A,#00TT2: MOV 30H,AMOVC A,@A+DPTRCLR P2.6 ;开数码管MOV P0,A ;送显示MOV A,30HINC AMOV B,AMOV A,#00HLCALL WT24AJMP $TAB: DB 28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60HRD24: PUSH ACC ;读24C02子程序。

24C02(IIC)读写操作

24C02(IIC)读写操作

1. AT24C02写操作首先我们来看一下写AT24C02。

一般步骤是:1) 发送起始信号2) 发送写器件地址3) 等待应答4) 发送要写入的24C02 的地址5) 等待应答6) 发送要写入的数据7) 等待应答8) 发送数据结束发送结束信号具体程序如下:/****************************************************************************** ** 函数名: AT24Cxx_WriteOneByte* 函数功能: 24c02写一个字节地址数据* 输入: addr dt* 输出: 无********************************************/void AT24Cxx_WriteOneByte(u16 addr,u8 dt){I2C_Start();if(EE_TYPE>AT24C16){I2C_Send_Byte(0xA0);I2C_Wait_Ack();I2C_Send_Byte(addr>>8); //发送数据地址高位}else{I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址+数据地址}I2C_Wait_Ack();I2C_Send_Byte(addr%256);//双字节是数据地址低位//单字节是数据地址低位I2C_Wait_Ack();I2C_Send_Byte(dt);I2C_Wait_Ack();I2C_Stop();delay_ms(10);}2. AT24C02读操作那么读取AT24C02 的步骤是:1)发送起始信号2) 发送写器件地址3) 等待应答4) 发送要读取的AT24C02 的地址5) 等待应答6) 再发送其实信号7) 发送读器件地址8) 等待应答9) 接收数据10) 如果没有接收完数据,发送应答11) 接收数据12) 直到接收完数据,发送非应答13) 发送结束信号/****************************************************************************** ** 函数名: AT24Cxx_ReadOneByte* 函数功能: 24c02读一个字节地址数据* 输入: addr* 输出: 返回值temp*****************************************************************************/ u8 AT24Cxx_ReadOneByte(u16 addr){u8 temp=0;I2C_Start();if(EE_TYPE>AT24C16){I2C_Send_Byte(0xA0);I2C_Wait_Ack();I2C_Send_Byte(addr>>8); //发送数据地址高位}else{I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址+数据地址}I2C_Wait_Ack();I2C_Send_Byte(addr%256);//双字节是数据地址低位//单字节是数据地址低位I2C_Wait_Ack();I2C_Start();I2C_Send_Byte(0xA1);I2C_Wait_Ack();temp=I2C_Read_Byte(0); // 0 代表NAC I2C_NAck();I2C_Stop();return temp;}。

最好的24C02储存开机次数实验 读写程序

最好的24C02储存开机次数实验 读写程序

24C02储存开机次数实验24C02是2K字节的串行EEPROM, 内部含有256个8位字节,该器件通过总线操作,并有专门的写保护功能。

串行EEPROM简称I2C总线式串行器件。

串行器件不仅占用很少的资源和I/O线,而且体积大大缩小,同时具有工作电源宽、抗干扰能力强、功耗低、数据不易丢失和支持在线编程等特点。

I2C总线是一种用于IC器件之间连接的二线制总线。

它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:不管是单片机、存储器、LCD驱动器还是键盘接口。

我们通过一个实验来了解24C02的读写操作过程:该实验功能是单片机复位一次,自动从24C02中读取数据,然后加1,最终数码管中的数据就是开机的次数,具有一定的实用意义。

相关原理:程序运行的照片:接线方法:1、接8位数码管的数据线。

将数码管部份的数据口 JP5接到CPU部份的P0口JP51.2、接8位数码管的显示位线。

将数码管部份的显示位口 JP8接到CPU部份的P2口JP52.3、用一根2PIN数据线一端插入CPU部份JP53(P3口)的P3.6,P3.7另外一端插入24C02部份的控制端JP38。

烧写后用手按复位键可以看到数码管每按一下加一。

程序流程图:汇编语言参考程序:SDA24 EQU P3.7 SCLK24 EQU P3.6 ORG 0000HAJMP MAINORG 0080HMAIN:CLR P3.7 ;打开写保护MOV DPTR,#TABMOV A,#00H ;读地址LCALL RD24CJNE A,#10,TTTT: JNC TT1AJMP TT2TT1: MOV A,#00TT2: MOV 30H,AMOVC A,@A+DPTRCLR P2.6 ;开数码管MOV P0,A ;送显示MOV A,30HINC AMOV B,AMOV A,#00HLCALL WT24AJMP $TAB: DB 28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60HRD24: PUSH ACC ;读24C02子程序。

ATMEL24c02使用详解(汇编及C程序都有)

ATMEL24c02使用详解(汇编及C程序都有)

ATMEL 24c02使用详解(汇编及C程序都有)1000字ATMEL 24c02是一种串行EEPROM存储器,具有2KB的存储容量,可通过I2C总线进行读写操作。

使用ATMEL 24c02时,需先设置I2C总线的通信速率和设备地址。

然后,可以使用汇编语言或C语言编写程序进行读写数据操作。

汇编语言程序示例:1. 设置I2C总线通信速率及设备地址```LDAA #$0 ;设置I2C总线通信速率为100kHzSTAA SCLDIVLDAA #$A0 ;设置EEPROM的设备地址为0xA0STAA SLA```2. 写入数据到EEPROM```BYTE_WRITE PROCLDAA #$00 ;设置数据的存储地址为0x00STAA DADDRLDAA #$A5 ;设置需要写入的数据为0xA5STAA DATAJSR I2C_WRITE ;调用I2C总线写入函数RTSBYTE_WRITE ENDP```3. 从EEPROM读取数据```BYTE_READ PROCLDAA #$00 ;设置数据的读取地址为0x00STAA DADDRJSR I2C_START ;发送起始信号LDAA #$A1 ;设置EEPROM的设备地址为0xA1,读操作时需要在地址末位添加1JSR I2C_SEND ;发送EEPROM设备地址LDAA #$00 ;设置要读取的数据长度为1JSR I2C_READ ;调用I2C总线读取函数LDA DATA ;将读取到的数据保存到DATA寄存器中RTSBYTE_READ ENDP```C语言程序示例:1. 在main函数中,调用I2C_Init()函数,设置I2C总线速率和设备地址。

```void main(){I2C_Init(); //设置I2C总线速率和设备地址}```2. 写入数据到EEPROM```void Write_Byte(unsigned char addr, unsigned char dat) {I2C_Start(); //发送起始信号I2C_SendByte(0xa0); //写入EEPROM的设备地址I2C_SendByte(addr); //设置存储地址I2C_SendByte(dat); //写入数据I2C_Stop(); //发送停止信号}```3. 从EEPROM读取数据```unsigned char Read_Byte(unsigned char addr){unsigned char res;I2C_Start(); //发送起始信号I2C_SendByte(0xa0); //写入EEPROM的设备地址I2C_SendByte(addr); //设置读取地址I2C_Start(); //发送起始信号I2C_SendByte(0xa1); //设置EEPROM的设备地址为读取模式 res = I2C_ReadByte(); //读取数据I2C_Stop(); //发送停止信号return res; //返回读取的数据}```即可进行EEPROM的读写操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
;名称:IWRNBYTE子程序
;描述:向器件指定地址写N个数据
;入口参数:器件地址字ASLA,子地址SUBA,发送数据缓存区MTD,发送字节书NUMBYTE
;******************************************************************
IWRNBYTE:
;名称:STRRT子程序
;描述:启动I2C总线子程序—发送I2C总线起始条件
;******************************************************************
START:SETB SDA ;发送起始条件数据信号
NOP ;起始条件建立时间大于4.7us
SETB SCL ;时钟线位高,接收数据位
NOP
NOP
MOV C,SDA ;读取数据位
MOV A,R2
CLR SCL ;将SCL拉低,时间大于4.7us
NOP
NOP ;起始条件锁定时间大于4.7us
CLR SCL ;钳住I2C总线,准备发送或接收数据
NOP
RET
;******************************************************************
NOP
NOP
NOP
NOP
NOP
CLR SCL ;保持数据时间,大于4.7us
NOP
NOP
RET
;******************************************************************
NOP
NOP
NOP ;延迟时间大于4.7us
RET
;******************************************************************
;名称:MACK子程序
;描述:发送应答信号子程序
;名称:RDBYTE子程序
;描述:读取字节子程序,读出的数据存放在ACC
;******************************************************************
RDBYTE:MOV R0,#08H
RLP: SETB SDA
NOP
SETB SCL ;发送停止条件的时钟信号
NOP
NOP
NOP
NOP
NOP ;起始条件建立时间大于4.7us
SETB SDA ;LCALL CACK
JNB ACK, IRDNBYTE
MOV R1, #MRD
RON1: LCALL RDBYTE ;读操作开始
MOV @R1, A
DJNZ R3, SACK
CLR ACK
NOP
NOP
MOV C,SDA
JC CEND
SETB ACK ;判断应答位
CEND:NOP
CLR SCL
NOP
RET
;******************************************************************
MOV A, XUBA ;指定子地址
LCALL WRBYTE
LCALL CACK
MOV R1, #MTD
WRDA:
MOV A, @R1
LCALL WRBYTE ;开始写入数据
;名称:CACK子程序
;描述:检查应答位子程序,返回值:ACK=1时表示有应答
;******************************************************************
CACK:SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
SJMP WLP1
;******************************************************************
NOP
NOP ;保持数据时间,大于4.7us
CLR SCL
NOP
NOP
RET
;******************************************************************
SETB SCL ;发送起始条件的信号
NOP
NOP
NOP
NOP
NOP ;起始条件锁定时间大于4.7us
CLR SDA ;发送起始信号
NOP
NOP
JC WRI
SJMP WRO ;判读数据位
WLP1: DJNZ R0,WLP
NOP
RET
WRI: SETB SDA ;发送1
NOP
SETB SCL
LCALL MNACK ;最后一字节发非应答位
RETRDN: LCALL STOP
RET
SACK: LCALL MACK
INC R1
SJMP
;******************************************************************
RLC A ;进行数据位的处理
MOV R2,A
NOP
NOP
NOP
DJNZ R0,RLP ;未够8位,继续读入
RET
;主程序
MAIN: MOV R4,#0F0H ;延时,等待其他芯片复位完成
;名称:STOP子程序
;描述:停止I2C总线子程序--发送I2C总线停止条件
;******************************************************************
STOP:CLR SDA ;发送停止条件的数据信号
NOP
NOP
MOV R3, NUMBYTE
LCALL START ,启动总线
MOV A, SLA
LCALL WRBYTE ;发送器件地址字
LCALL CACK
JNB ACK, RETWRN ;无应答则退出
ACK BIT 10H ;答应标志位
SLA DATA 50H ;期间地址字
SUBA DATE 51H ;器件子地址
NUMBYTE DATA 52H; 读/写字节数
SDA BIT P1.7
SCL BIT P1.6 ;I2C总线定义
MTD EQU 30H ;发送数据缓存区首地址(30H-3FH)
MRD EQU 40H ;接受数据缓存区首地址(10H-4FH)
ORG 0000H
LJMP MAIN ;跳转到主程序
;******************************************************************
;名称:MACK子程序
;描述:发送非应答信号子程序
;******************************************************************
MNACK:SETB SDA ;将SDA置1
NOP
NOP
SETB SCL
;名称:WRBYTE子程序
;描述:发送字节子程序,字节数据放入ACC
;******************************************************************
WRBYTE:MOV R0,#08H
WLP: RLC A ;取数据位
MOV R3, NUMBYTE
LCALL START
MOV A, SLA
LCALL WRBYTE ;发送器件地址字
LCALL CACK
JNB ACK, RETRDN
LCALL CACK
JNB R1
DJNZ R3, WRDA ;判断是否写完
RETWRN:
LCALL STOP
RET
;******************************************************************
MOV A, SUBA ;指定子地址
LCALL WRBYTE
LCALL START ;重新启动总线
MOV A, SLA
INC A ;准备进行读写操作
LCALL WRBYTE
;******************************************************************
MACK:CLR SDA ;将SDA置0
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR SCL
SJMP WLP1
WRO: CLR SDA ;发送0
NOP
SETB SCL
;名称:IRDNBYTE子程序
;描述:从器件指定地址读取N个数据
;入口参数:器件地址字SAL,子地址SUBA,发送数据缓存区MRD,发送字节书NUMBYTE
;******************************************************************
IRDNBYTE:
相关文档
最新文档