51单片机读写内部EEPROM详解_第1页
51单片机读写内部EEPROM详解_第2页
51单片机读写内部EEPROM详解_第3页
51单片机读写内部EEPROM详解_第4页
51单片机读写内部EEPROM详解_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-.z.此文档共包含三个程序。第一个程序最简单易懂,看懂了基本就会读写51单片机部EEPROM了。第二个程序和第一个读写EEPROM原理差不多,包含有LCD1602操作方法,有写字符串的方法。第三个程序在原有基础上增加了外部中断功能,细心的人会发现,操作部EEPROM过程会将总中断关闭,实际上程序要用到中断时只需在原有的EEPROM操作后加上开总中断即可。验证第二、第三个程序时需按程序主程序中的操作说明进行烧录单片机,以验证是否成功操作单片机部EEPROM。程序1:/***************************************************************作品:EEPROM实验,开机还原关电前LED的亮灭状况单片机:STC89C52RC晶振:12M编译环境:KeiluVision4V9.00***************************************************************///*include<STC89C52RC.H>*include<reg52.h>*include<intrins.h>*defineucharunsignedchar*defineuintunsignedint/****************特殊功能寄存器声明****************/sfrISP_DATA=0*e2;sfrISP_ADDRH=0*e3;sfrISP_ADDRL=0*e4;sfrISP_CMD=0*e5;sfrISP_TRIG=0*e6;sfrISP_CONTR=0*e7;sbitLED1=P2^0;sbitLED2=P2^1;sbitK1=P3^2; //按钮1sbitK2=P3^3; //按钮2voidcc(uintaddr);void*c*(uintaddr,uchardat);uchardc*(uintaddr);voidQ0();/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:主程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*//*voidmain(void){ucharV;V=dc*(0*2002); //开机读取EEPROM区2002h数据,还原关电前LED的亮灭状况if(V==2) {LED1=0;LED2=1;}elseif(V==6){LED1=0;LED2=0;}while(1){if(!K1) { while(!K1);LED1=0;LED2=1;cc(0*2000); //擦除第1个扇区(2000h~21FFh)*c*(0*2002,2); //对EEPROM区2002h写入2 } if(!K2) { while(!K2);LED1=0;LED2=0;cc(0*2000); //擦除第1个扇区(2000h~21FFh)*c*(0*2002,6); //对EEPROM区2002h写入6 }}}*//*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:擦除*一扇区(每个扇区512字节)入口:addr=*一扇区首地址┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidcc(uintaddr){ //打开IAP功能(ISP_CONTR.7)=1:允许编程改变Flash,设置Flash操作等待时间//0*83(晶振<5M)0*82(晶振<10M)0*81(晶振<20M)0*80(晶振<40M)ISP_CONTR=0*81;ISP_CMD=0*03; //用户可以对"DataFlash/EEPROM区"进行扇区擦除ISP_ADDRL=addr;//ISP/IAP操作时的地址寄存器低八位,ISP_ADDRH=addr>>8;//ISP/IAP操作时的地址寄存器高八位。EA=0;ISP_TRIG=0*46;//在ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG先写入46h,ISP_TRIG=0*B9;//再写入B9h,ISP/IAP命令才会生效。_nop_();Q0(); //关闭ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:写一字节入口:addr=扇区单元地址,dat=待写入数据┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/void*c*(uintaddr,uchardat){ISP_CONTR=0*81; ISP_CMD=0*02; //用户可以对"DataFlash/EEPROM区"进行字节编程ISP_ADDRL=addr;ISP_ADDRH=addr>>8;ISP_DATA=dat;//数据进ISP_DATAEA=0;ISP_TRIG=0*46;ISP_TRIG=0*B9;_nop_();Q0(); //关闭ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:读一字节入口:addr=扇区单元地址出口:dat=读出的数据┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/uchardc*(uintaddr){uchardat; ISP_CONTR=0*81; ISP_CMD=0*01;//用户可以对"DataFlash/EEPROM区"进行字节读ISP_ADDRL=addr;ISP_ADDRH=addr>>8;EA=0;ISP_TRIG=0*46;ISP_TRIG=0*B9;_nop_();dat=ISP_DATA; //取出数据Q0(); //关闭ISP/IAP returndat;}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:关闭ISP/IAP操作┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidQ0(){ISP_CONTR=0;//关闭IAP功能ISP_CMD=0;//待机模式,无ISP操作ISP_TRIG=0;//关闭IAP功能,清与ISP有关的特殊功能寄存器}/*STC89C52RC部EEPROM详细地址表:第一扇区第二扇区第三扇区第四扇区起始地址结束地址起始地址结束地址起始地址结束地址起始地址结束地址2000h21FFh2200h23FFh2400h25FFh2600h27FFH第五扇区第六扇区第七扇区第八扇区起始地址结束地址起始地址结束地址起始地址结束地址起始地址结束地址2800h29FFh2A00h2BFFh2C00h2DFFh2E00h2FFFh*/程序2:/***************************************************************作品:EEPROM实验,开机还原关电前LED的亮灭状况单片机:STC89C52RC晶振:12M编译环境:KeiluVision4V9.00***************************************************************///*include<STC89C52RC.H>*include<reg52.h>*include<intrins.h>*defineucharunsignedchar*defineuintunsignedint/****************特殊功能寄存器声明****************/sfrISP_DATA=0*e2;sfrISP_ADDRH=0*e3;sfrISP_ADDRL=0*e4;sfrISP_CMD=0*e5;sfrISP_TRIG=0*e6;sfrISP_CONTR=0*e7;sbitLED1=P2^0;sbitLED2=P2^1;sbitK1=P3^2; //按钮1sbitK2=P3^3; //按钮2voidcc(uintaddr);void*c*(uintaddr,uchardat);uchardc*(uintaddr);voidQ0();*ifndefuchar*defineucharunsignedchar*endif*ifndefuint*defineuintunsignedint*endif/**********************************PIN口定义**********************************/*defineLCD1602_DATAPINSP0sbitLCD1602_E=P2^7;sbitLCD1602_RW=P2^5;sbitLCD1602_RS=P2^6;/**********************************函数声明**********************************//*在51单片机12MHZ时钟下的延时函数*/voidLcd1602_Delay1ms(uintc);//误差0us/*LCD1602写入8位命令子函数*/voidLcdWrite(uchar);/*LCD1602写入8位数据子函数*/ voidLcdWriteData(uchardat) ;/*LCD1602初始化子程序*/ voidLcdInit();/*LCD1602写入字符串*/voidLCDWrite_String(uchar*,uchary,ucharz,uchar*s);/*设置LCD1602写入字符串的位置*/voidLCD_set_*y(uchar*,uchary,ucharz); ucharON_Hour=0*07; //初始开灯时间07:00 1ucharWarning_TempH=32; //高温报警温度5/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:主程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*//*voidmain(void){ucharV;V=dc*(0*2002); //开机读取EEPROM区2002h数据,还原关电前LED的亮灭状况if(V==2) {LED1=0;LED2=1;}elseif(V==6){LED1=0;LED2=0;}while(1){if(!K1) { while(!K1);LED1=0;LED2=1;cc(0*2000); //擦除第1个扇区(2000h~21FFh)*c*(0*2002,2); //对EEPROM区2002h写入2 } if(!K2) { while(!K2);LED1=0;LED2=0;cc(0*2000); //擦除第1个扇区(2000h~21FFh)*c*(0*2002,6); //对EEPROM区2002h写入6 }}}*/voidmain(void){LcdInit();//不注销下面三句,烧录一次//注销小面三句,再烧录一次//若两次烧录后现象一致,则操作部EEPROM成功/////////////////////////////////////////////////////////////////cc(0*2000); //擦除第1个扇区(2000h~21FFh)*c*(0*2000,ON_Hour); //对EEPROM区2002h写入2*c*(0*2001,Warning_TempH); //对EEPROM区2002h写入2/////////////////////////////////////////////////////////////////ON_Hour=dc*(0*2000);Warning_TempH=dc*(0*2001);if((ON_Hour==0*07)||(Warning_TempH==32)){ LcdWrite(0*80); LCDWrite_String(0,1,7,"SUCCESS");}elseLCDWrite_String(0,1,5,"ERROR");while(1);}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:擦除*一扇区(每个扇区512字节)入口:addr=*一扇区首地址┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidcc(uintaddr){ //打开IAP功能(ISP_CONTR.7)=1:允许编程改变Flash,设置Flash操作等待时间//0*83(晶振<5M)0*82(晶振<10M)0*81(晶振<20M)0*80(晶振<40M)ISP_CONTR=0*81;ISP_CMD=0*03; //用户可以对"DataFlash/EEPROM区"进行扇区擦除ISP_ADDRL=addr;//ISP/IAP操作时的地址寄存器低八位,ISP_ADDRH=addr>>8;//ISP/IAP操作时的地址寄存器高八位。EA=0;ISP_TRIG=0*46;//在ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG先写入46h,ISP_TRIG=0*B9;//再写入B9h,ISP/IAP命令才会生效。_nop_();Q0(); //关闭ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:写一字节入口:addr=扇区单元地址,dat=待写入数据┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/void*c*(uintaddr,uchardat){ISP_CONTR=0*81; ISP_CMD=0*02; //用户可以对"DataFlash/EEPROM区"进行字节编程ISP_ADDRL=addr;ISP_ADDRH=addr>>8;ISP_DATA=dat;//数据进ISP_DATAEA=0;ISP_TRIG=0*46;ISP_TRIG=0*B9;_nop_();Q0(); //关闭ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:读一字节入口:addr=扇区单元地址出口:dat=读出的数据┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/uchardc*(uintaddr){uchardat; ISP_CONTR=0*81; ISP_CMD=0*01;//用户可以对"DataFlash/EEPROM区"进行字节读ISP_ADDRL=addr;ISP_ADDRH=addr>>8;EA=0;ISP_TRIG=0*46;ISP_TRIG=0*B9;_nop_();dat=ISP_DATA; //取出数据Q0(); //关闭ISP/IAP returndat;}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:关闭ISP/IAP操作┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidQ0(){ISP_CONTR=0;//关闭IAP功能ISP_CMD=0;//待机模式,无ISP操作ISP_TRIG=0;//关闭IAP功能,清与ISP有关的特殊功能寄存器}/*STC89C52RC部EEPROM详细地址表:第一扇区第二扇区第三扇区第四扇区起始地址结束地址起始地址结束地址起始地址结束地址起始地址结束地址2000h21FFh2200h23FFh2400h25FFh2600h27FFH第五扇区第六扇区第七扇区第八扇区起始地址结束地址起始地址结束地址起始地址结束地址起始地址结束地址2800h29FFh2A00h2BFFh2C00h2DFFh2E00h2FFFh*//********************************************************************************函数名:Lcd1602_Delay1ms*函数功能:延时函数,延时1ms*输入:c*输出:无*说名:该函数是在12MHZ晶振下,12分频单片机的延时。*******************************************************************************/voidLcd1602_Delay1ms(uintc)//误差0us{uchara,b; for(;c>0;c--) { for(b=199;b>0;b--) { for(a=1;a>0;a--); } } }/********************************************************************************函数名:voidLCDWrite_String(uchar*,uchary,uchar*s)*函数功能:向LCD写入一个字符串*输入:*,y,*s*输出:无*******************************************************************************/voidLCDWrite_String(uchar*,uchary,ucharz,uchar*s) //*0~15,y0,1,2,3{ LCD_set_*y(*,y,z); while(*s) { LcdWriteData(*s); s++; }}/********************************************************************************函数名:voidLCD_set_*y(uchar*,uchary,ucharz)*函数功能:指定向LCD写入字符串的位置*输入:*,y,z //*:横坐标y:纵坐标z:字符串长度*输出:无*******************************************************************************/voidLCD_set_*y(uchar*,uchary,ucharz){ uchari; if(y==0) { LcdWrite(0*80+*); for(i=0;i<z;i++) { LcdWriteData(''); } LcdWrite(0*80+*); } if(y==1) { LcdWrite(0*c0+*); for(i=0;i<z;i++) { LcdWriteData(''); } LcdWrite(0*c0+*); } if(y==2) { LcdWrite(0*94+*); for(i=0;i<z;i++) { LcdWriteData(''); } LcdWrite(0*94+*); } if(y==3) { LcdWrite(0*d4+*); for(i=0;i<z;i++) { LcdWriteData(''); } LcdWrite(0*d4+*); }}/********************************************************************************函数名:LcdWrite*函数功能:向LCD写入一个字节的命令*输入:*输出:无*******************************************************************************/*ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时voidLcdWrite(uchar) //写入命令{LCD1602_E=0;//使能LCD1602_RS=0; //选择发送命令LCD1602_RW=0; //选择写入LCD1602_DATAPINS=;//放入命令Lcd1602_Delay1ms(1); //等待数据稳定LCD1602_E=1; //写入时序Lcd1602_Delay1ms(5); //保持时间LCD1602_E=0;}*elsevoidLcdWrite(uchar) //写入命令{LCD1602_E=0; //使能清零LCD1602_RS=0; //选择写入命令LCD1602_RW=0; //选择写入LCD1602_DATAPINS=; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1); LCD1602_E=1; //写入时序Lcd1602_Delay1ms(5);LCD1602_E=0;// Lcd1602_Delay1ms(1); LCD1602_DATAPINS=<<4;//发送低四位Lcd1602_Delay1ms(1); LCD1602_E=1; //写入时序Lcd1602_Delay1ms(5);LCD1602_E=0;}*endif/********************************************************************************函数名:LcdWriteData*函数功能:向LCD写入一个字节的数据*输入:dat*输出:无*******************************************************************************/ *ifndef LCD1602_4PINS voidLcdWriteData(uchardat) //写入数据{LCD1602_E=0; //使能清零LCD1602_RS=1; //选择输入数据LCD1602_RW=0; //选择写入LCD1602_DATAPINS=dat;//写入数据Lcd1602_Delay1ms(1); LCD1602_E=1;//写入时序Lcd1602_Delay1ms(5);//保持时间LCD1602_E=0;}*elsevoidLcdWriteData(uchardat) //写入数据{LCD1602_E=0; //使能清零LCD1602_RS=1; //选择写入数据LCD1602_RW=0; //选择写入LCD1602_DATAPINS=dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1); LCD1602_E=1; //写入时序Lcd1602_Delay1ms(5);LCD1602_E=0;LCD1602_DATAPINS=dat<<4;//写入低四位Lcd1602_Delay1ms(1); LCD1602_E=1; //写入时序Lcd1602_Delay1ms(5);LCD1602_E=0;}*endif/********************************************************************************函数名:LcdInit()*函数功能:初始化LCD屏*输入:无*输出:无*******************************************************************************/ *ifndef LCD1602_4PINSvoidLcdInit() //LCD初始化子程序{ LcdWrite(0*38);//开显示LcdWrite(0*0c);//开显示不显示光标LcdWrite(0*06);//写一个指针加1 LcdWrite(0*01);//清屏LcdWrite(0*80);//设置数据指针起点}*elsevoidLcdInit() //LCD初始化子程序{LcdWrite(0*32); //将8位总线转为4位总线LcdWrite(0*28); //在四位线下的初始化LcdWrite(0*0c);//开显示不显示光标LcdWrite(0*06);//写一个指针加1 LcdWrite(0*01);//清屏LcdWrite(0*80);//设置数据指针起点}*endif程序3:/***************************************************************作品:EEPROM实验,开机还原关电前LED的亮灭状况单片机:STC89C52RC晶振:12M编译环境:KeiluVision4V9.00***************************************************************///*include<STC89C52RC.H>*include<reg52.h>*include<intrins.h>*defineucharunsignedchar*defineuintunsignedint/****************特殊功能寄存器声明****************/sfrISP_DATA=0*e2;sfrISP_ADDRH=0*e3;sfrISP_ADDRL=0*e4;sfrISP_CMD=0*e5;sfrISP_TRIG=0*e6;sfrISP_CONTR=0*e7;sbitLED1=P2^0;sbitLED2=P2^1;sbitK1=P3^2; //按钮1sbitK2=P3^3; //按钮2voidcc(uintaddr);void*c*(uintaddr,uchardat);uchardc*(uintaddr);voidQ0();*ifndefuchar*defineucharunsignedchar*endif*ifndefuint*defineuintunsignedint*endif/**********************************PIN口定义**********************************/*defineLCD1602_DATAPINSP0sbitLCD1602_E=P2^7;sbitLCD1602_RW=P2^5;sbitLCD1602_RS=P2^6;/**********************************函数声明**********************************//*在51单片机12MHZ时钟下的延时函数*/voidLcd1602_Delay1ms(uintc);//误差0us/*LCD1602写入8位命令子函数*/voidLcdWrite(uchar);/*LCD1602写入8位数据子函数*/ voidLcdWriteData(uchardat) ;/*LCD1602初始化子程序*/ voidLcdInit(); /*LCD1602写入字符串*/voidLCDWrite_String(uchar*,uchary,ucharz,uchar*s);/*设置LCD1602写入字符串的位置*/voidLCD_set_*y(uchar*,uchary,ucharz); voidIntConfiguration();/*ucharON_Hour=0*07; //初始开灯时间07:00 1ucharWarning_TempH=32; //高温报警温度5*/ucharON_Hour; //初始开灯时间07:00 1ucharWarning_TempH; //高温报警温度/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:主程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidmain(void){LcdInit();IntConfiguration();//////////////////////////////////////////////////////////////////*cc(0*2000); //擦除第1个扇区(2000h~21FFh)*c*(0*2000,ON_Hour); //对EEPROM区2002h写入2*c*(0*2001,Warning_TempH); //对EEPROM区2002h写入2*//////////////////////////////////////////////////////////////////while(1){ON_Hour=dc*(0*2000);Warning_TempH=dc*(0*2001);if((ON_Hour==0*07)||(Warning_TempH==32)){ LcdWrite(0*80); LCDWrite_String(0,1,7,"SUCCESS");}elseLcdWrite(0*80);LCDWrite_String(0,1,5,"ERROR");}/*ucharV;V=dc*(0*2002); //开机读取EEPROM区2002h数据,还原关电前LED的亮灭状况if(V==2) {LED1=0;LED2=1;}elseif(V==6){LED1=0;LED2=0;}while(1){if(!K1) { while(!K1);LED1=0;LED2=1;cc(0*2000); //擦除第1个扇区(2000h~21FFh)*c*(0*2002,2); //对EEPROM区2002h写入2 } if(!K2) { while(!K2);LED1=0;LED2=0;cc(0*2000); //擦除第1个扇区(2000h~21FFh)*c*(0*2002,6); //对EEPROM区2002h写入6 }} */}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:擦除*一扇区(每个扇区512字节)入口:addr=*一扇区首地址┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidcc(uintaddr){ //打开IAP功能(ISP_CONTR.7)=1:允许编程改变Flash,设置Flash操作等待时间//0*83(晶振<5M)0*82(晶振<10M)0*81(晶振<20M)0*80(晶振<40M)ISP_CONTR=0*81;ISP_CMD=0*03; //用户可以对"DataFlash/EEPROM区"进行扇区擦除ISP_ADDRL=addr;//ISP/IAP操作时的地址寄存器低八位,ISP_ADDRH=addr>>8;//ISP/IAP操作时的地址寄存器高八位。EA=0;ISP_TRIG=0*46;//在ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG先写入46h,ISP_TRIG=0*B9;//再写入B9h,ISP/IAP命令才会生效。_nop_();Q0(); //关闭ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:写一字节入口:addr=扇区单元地址,dat=待写入数据┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/void*c*(uintaddr,uchardat){ISP_CONTR=0*81; ISP_CMD=0*02; //用户可以对"DataFlash/EEPROM区"进行字节编程ISP_ADDRL=addr;ISP_ADDRH=addr>>8;ISP_DATA=dat;//数据进ISP_DATAEA=0;ISP_TRIG=0*46;ISP_TRIG=0*B9;_nop_();Q0(); //关闭ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:读一字节入口:addr=扇区单元地址出口:dat=读出的数据┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/uchardc*(uintaddr){uchardat; ISP_CONTR=0*81; ISP_CMD=0*01;//用户可以对"DataFlash/EEPROM区"进行字节读ISP_ADDRL=addr;ISP_ADDRH=addr>>8;EA=0;ISP_TRIG=0*46;ISP_TRIG=0*B9;_nop_();dat=ISP_DATA; //取出数据Q0(); //关闭ISP/IAP returndat;}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:关闭ISP/IAP操作┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidQ0(){ISP_CONTR=0;//关闭IAP功能ISP_CMD=0;//待机模式,无ISP操作ISP_TRIG=0;//关闭IAP功能,清与ISP有关的特殊功能寄存器EA=1;}/*STC89C52RC部EEPROM详细地址表:第一扇区第二扇区第三扇区第四扇区起始地址结束地址起始地址结束地址起始地址结束地址起始地址结束地址2000h21FFh2200h23FFh2400h25FFh2600h27FFH第五扇区第六扇区第七扇区第八扇区起始地址结束地址起始地址结束地址起始地址结束地址起始地址结束地址2800h29FFh2A00h2BFFh2C00h2DFFh2E00h2FFFh*//********************************************************************************函数名:Lcd1602_Delay1ms*函数功能:延时函数,延时1ms*输入:c*输出:无*说名:该函数是在12MHZ晶振下,12分频单片机的延时。*******************************************************************************/voidLcd1602_Delay1ms(uintc)//误差0us{uchara,b; for(;c>0;c--) { for(b=199;b>0;b--) { for(a=1;a>0;a--); } } }/********************************************************************************函数名:voidLCDWrite_String(uchar*,uchary,uchar*s)*函数功能:向LCD写入一个字符串*输入:*,y,*s*输出:无*******************************************************************************/voidLCDWrite_String(uchar*,uchary,ucharz,uchar*s) //*0~15,y0,1,2,3{ LCD_set_*y(*,y,z); while(*s) { LcdWriteData(*s); s++; }}/********************************************************************************函数名:voidLCD_set_*y(uchar*,uchary,ucharz)*函数功能:指定向LCD写入字符串的位置*输入:*,y,z //*:横坐标y:纵坐标z:字符串长度*输出:无*******************************************************************************/voidLCD_set_*y(uchar*,uchary,ucharz){ uchari; if(y==0) { LcdWrite(0*80+*); for(i=0;i<z;i++) { LcdWriteData(''); } LcdWrite(0*80+*); } if(y==1) { LcdWrite(0*c0+*); for(i=0;i<z;i++) { LcdWriteData(''); } LcdWrite(0*c0+*); } if(y==2) { LcdWrite(0*94+*); for(i=0;i<z;i++) { LcdWriteData(''); } LcdWrite(0*94+*); } if(y==3) { LcdWrite(0*d4+*); for(i=0;i<z;i++) { LcdWriteData(''); } LcdWrite(0*d4+*); }}/********************************************************************************函数名:LcdWrite*函数功能:向LCD写入一个字节的命令*输入:*输出:无*******************************************************************************/*ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时voidLcdWrite(uchar) //写入命令{LCD1602_E=0;//使能LCD1602_RS=0; //选择发送命令LCD1602_RW=0; //选择写入LCD1602_DATAPINS=;//放入命令Lcd1602_Delay1ms(1); //等待数据稳定LCD1602_E=1; //写入时序Lcd1602_Delay1ms(5); //保持时间LCD1602_E=0;}*elsevoidLcdWrite(uchar) //写入命令{LCD1602_E=0; //使能清零LCD1602_RS=0; //选择写入命令LCD1602_RW=0; //选择写入LCD1602_DATAPINS=; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论