




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
-.z.此文檔共包含三個程序。第一個程序最簡單易懂,看懂了基本就會讀寫51單片機部EEPROM了。第二個程序和第一個讀寫EEPROM原理差不多,包含有LCD1602操作方法,有寫字符串的方法。第三個程序在原有基礎(chǔ)上增加了外部中斷功能,細心的人會發(fā)現(xiàn),操作部EEPROM過程會將總中斷關(guān)閉,實際上程序要用到中斷時只需在原有的EEPROM操作后加上開總中斷即可。驗證第二、第三個程序時需按程序主程序中的操作說明進行燒錄單片機,以驗證是否成功操作單片機部EEPROM。程序1:/***************************************************************作品:EEPROM實驗,開機還原關(guān)電前LED的亮滅狀況單片機:STC89C52RC晶振:12M編譯環(huán)境: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();/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):主程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*//*voidmain(void){ucharV;V=dc*(0*2002); //開機讀取EEPROM區(qū)2002h數(shù)據(jù),還原關(guān)電前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個扇區(qū)(2000h~21FFh)*c*(0*2002,2); //對EEPROM區(qū)2002h寫入2 } if(!K2) { while(!K2);LED1=0;LED2=0;cc(0*2000); //擦除第1個扇區(qū)(2000h~21FFh)*c*(0*2002,6); //對EEPROM區(qū)2002h寫入6 }}}*//*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):擦除*一扇區(qū)(每個扇區(qū)512字節(jié))入口:addr=*一扇區(qū)首地址┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidcc(uintaddr){ //打開IAP功能(ISP_CONTR.7)=1:允許編程改變Flash,設(shè)置Flash操作等待時間//0*83(晶振<5M)0*82(晶振<10M)0*81(晶振<20M)0*80(晶振<40M)ISP_CONTR=0*81;ISP_CMD=0*03; //用戶可以對"DataFlash/EEPROM區(qū)"進行扇區(qū)擦除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(); //關(guān)閉ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):寫一字節(jié)入口:addr=扇區(qū)單元地址,dat=待寫入數(shù)據(jù)┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/void*c*(uintaddr,uchardat){ISP_CONTR=0*81; ISP_CMD=0*02; //用戶可以對"DataFlash/EEPROM區(qū)"進行字節(jié)編程ISP_ADDRL=addr;ISP_ADDRH=addr>>8;ISP_DATA=dat;//數(shù)據(jù)進ISP_DATAEA=0;ISP_TRIG=0*46;ISP_TRIG=0*B9;_nop_();Q0(); //關(guān)閉ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):讀一字節(jié)入口:addr=扇區(qū)單元地址出口:dat=讀出的數(shù)據(jù)┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/uchardc*(uintaddr){uchardat; ISP_CONTR=0*81; ISP_CMD=0*01;//用戶可以對"DataFlash/EEPROM區(qū)"進行字節(jié)讀ISP_ADDRL=addr;ISP_ADDRH=addr>>8;EA=0;ISP_TRIG=0*46;ISP_TRIG=0*B9;_nop_();dat=ISP_DATA; //取出數(shù)據(jù)Q0(); //關(guān)閉ISP/IAP returndat;}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):關(guān)閉ISP/IAP操作┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidQ0(){ISP_CONTR=0;//關(guān)閉IAP功能ISP_CMD=0;//待機模式,無ISP操作ISP_TRIG=0;//關(guān)閉IAP功能,清與ISP有關(guān)的特殊功能寄存器}/*STC89C52RC部EEPROM詳細地址表:第一扇區(qū)第二扇區(qū)第三扇區(qū)第四扇區(qū)起始地址結(jié)束地址起始地址結(jié)束地址起始地址結(jié)束地址起始地址結(jié)束地址2000h21FFh2200h23FFh2400h25FFh2600h27FFH第五扇區(qū)第六扇區(qū)第七扇區(qū)第八扇區(qū)起始地址結(jié)束地址起始地址結(jié)束地址起始地址結(jié)束地址起始地址結(jié)束地址2800h29FFh2A00h2BFFh2C00h2DFFh2E00h2FFFh*/程序2:/***************************************************************作品:EEPROM實驗,開機還原關(guān)電前LED的亮滅狀況單片機:STC89C52RC晶振:12M編譯環(huán)境: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;/**********************************函數(shù)聲明**********************************//*在51單片機12MHZ時鐘下的延時函數(shù)*/voidLcd1602_Delay1ms(uintc);//誤差0us/*LCD1602寫入8位命令子函數(shù)*/voidLcdWrite(uchar);/*LCD1602寫入8位數(shù)據(jù)子函數(shù)*/ voidLcdWriteData(uchardat) ;/*LCD1602初始化子程序*/ voidLcdInit();/*LCD1602寫入字符串*/voidLCDWrite_String(uchar*,uchary,ucharz,uchar*s);/*設(shè)置LCD1602寫入字符串的位置*/voidLCD_set_*y(uchar*,uchary,ucharz); ucharON_Hour=0*07; //初始開燈時間07:00 1ucharWarning_TempH=32; //高溫報警溫度5/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):主程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*//*voidmain(void){ucharV;V=dc*(0*2002); //開機讀取EEPROM區(qū)2002h數(shù)據(jù),還原關(guān)電前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個扇區(qū)(2000h~21FFh)*c*(0*2002,2); //對EEPROM區(qū)2002h寫入2 } if(!K2) { while(!K2);LED1=0;LED2=0;cc(0*2000); //擦除第1個扇區(qū)(2000h~21FFh)*c*(0*2002,6); //對EEPROM區(qū)2002h寫入6 }}}*/voidmain(void){LcdInit();//不注銷下面三句,燒錄一次//注銷小面三句,再燒錄一次//若兩次燒錄后現(xiàn)象一致,則操作部EEPROM成功/////////////////////////////////////////////////////////////////cc(0*2000); //擦除第1個扇區(qū)(2000h~21FFh)*c*(0*2000,ON_Hour); //對EEPROM區(qū)2002h寫入2*c*(0*2001,Warning_TempH); //對EEPROM區(qū)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);}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):擦除*一扇區(qū)(每個扇區(qū)512字節(jié))入口:addr=*一扇區(qū)首地址┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidcc(uintaddr){ //打開IAP功能(ISP_CONTR.7)=1:允許編程改變Flash,設(shè)置Flash操作等待時間//0*83(晶振<5M)0*82(晶振<10M)0*81(晶振<20M)0*80(晶振<40M)ISP_CONTR=0*81;ISP_CMD=0*03; //用戶可以對"DataFlash/EEPROM區(qū)"進行扇區(qū)擦除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(); //關(guān)閉ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):寫一字節(jié)入口:addr=扇區(qū)單元地址,dat=待寫入數(shù)據(jù)┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/void*c*(uintaddr,uchardat){ISP_CONTR=0*81; ISP_CMD=0*02; //用戶可以對"DataFlash/EEPROM區(qū)"進行字節(jié)編程ISP_ADDRL=addr;ISP_ADDRH=addr>>8;ISP_DATA=dat;//數(shù)據(jù)進ISP_DATAEA=0;ISP_TRIG=0*46;ISP_TRIG=0*B9;_nop_();Q0(); //關(guān)閉ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):讀一字節(jié)入口:addr=扇區(qū)單元地址出口:dat=讀出的數(shù)據(jù)┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/uchardc*(uintaddr){uchardat; ISP_CONTR=0*81; ISP_CMD=0*01;//用戶可以對"DataFlash/EEPROM區(qū)"進行字節(jié)讀ISP_ADDRL=addr;ISP_ADDRH=addr>>8;EA=0;ISP_TRIG=0*46;ISP_TRIG=0*B9;_nop_();dat=ISP_DATA; //取出數(shù)據(jù)Q0(); //關(guān)閉ISP/IAP returndat;}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):關(guān)閉ISP/IAP操作┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidQ0(){ISP_CONTR=0;//關(guān)閉IAP功能ISP_CMD=0;//待機模式,無ISP操作ISP_TRIG=0;//關(guān)閉IAP功能,清與ISP有關(guān)的特殊功能寄存器}/*STC89C52RC部EEPROM詳細地址表:第一扇區(qū)第二扇區(qū)第三扇區(qū)第四扇區(qū)起始地址結(jié)束地址起始地址結(jié)束地址起始地址結(jié)束地址起始地址結(jié)束地址2000h21FFh2200h23FFh2400h25FFh2600h27FFH第五扇區(qū)第六扇區(qū)第七扇區(qū)第八扇區(qū)起始地址結(jié)束地址起始地址結(jié)束地址起始地址結(jié)束地址起始地址結(jié)束地址2800h29FFh2A00h2BFFh2C00h2DFFh2E00h2FFFh*//********************************************************************************函數(shù)名:Lcd1602_Delay1ms*函數(shù)功能:延時函數(shù),延時1ms*輸入:c*輸出:無*說名:該函數(shù)是在12MHZ晶振下,12分頻單片機的延時。*******************************************************************************/voidLcd1602_Delay1ms(uintc)//誤差0us{uchara,b; for(;c>0;c--) { for(b=199;b>0;b--) { for(a=1;a>0;a--); } } }/********************************************************************************函數(shù)名:voidLCDWrite_String(uchar*,uchary,uchar*s)*函數(shù)功能:向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++; }}/********************************************************************************函數(shù)名:voidLCD_set_*y(uchar*,uchary,ucharz)*函數(shù)功能:指定向LCD寫入字符串的位置*輸入:*,y,z //*:橫坐標(biāo)y:縱坐標(biāo)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+*); }}/********************************************************************************函數(shù)名:LcdWrite*函數(shù)功能:向LCD寫入一個字節(jié)的命令*輸入:*輸出:無*******************************************************************************/*ifndef LCD1602_4PINS //當(dāng)沒有定義這個LCD1602_4PINS時voidLcdWrite(uchar) //寫入命令{LCD1602_E=0;//使能LCD1602_RS=0; //選擇發(fā)送命令LCD1602_RW=0; //選擇寫入LCD1602_DATAPINS=;//放入命令Lcd1602_Delay1ms(1); //等待數(shù)據(jù)穩(wěn)定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;//發(fā)送低四位Lcd1602_Delay1ms(1); LCD1602_E=1; //寫入時序Lcd1602_Delay1ms(5);LCD1602_E=0;}*endif/********************************************************************************函數(shù)名:LcdWriteData*函數(shù)功能:向LCD寫入一個字節(jié)的數(shù)據(jù)*輸入:dat*輸出:無*******************************************************************************/ *ifndef LCD1602_4PINS voidLcdWriteData(uchardat) //寫入數(shù)據(jù){LCD1602_E=0; //使能清零LCD1602_RS=1; //選擇輸入數(shù)據(jù)LCD1602_RW=0; //選擇寫入LCD1602_DATAPINS=dat;//寫入數(shù)據(jù)Lcd1602_Delay1ms(1); LCD1602_E=1;//寫入時序Lcd1602_Delay1ms(5);//保持時間LCD1602_E=0;}*elsevoidLcdWriteData(uchardat) //寫入數(shù)據(jù){LCD1602_E=0; //使能清零LCD1602_RS=1; //選擇寫入數(shù)據(jù)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/********************************************************************************函數(shù)名:LcdInit()*函數(shù)功能:初始化LCD屏*輸入:無*輸出:無*******************************************************************************/ *ifndef LCD1602_4PINSvoidLcdInit() //LCD初始化子程序{ LcdWrite(0*38);//開顯示LcdWrite(0*0c);//開顯示不顯示光標(biāo)LcdWrite(0*06);//寫一個指針加1 LcdWrite(0*01);//清屏LcdWrite(0*80);//設(shè)置數(shù)據(jù)指針起點}*elsevoidLcdInit() //LCD初始化子程序{LcdWrite(0*32); //將8位總線轉(zhuǎn)為4位總線LcdWrite(0*28); //在四位線下的初始化LcdWrite(0*0c);//開顯示不顯示光標(biāo)LcdWrite(0*06);//寫一個指針加1 LcdWrite(0*01);//清屏LcdWrite(0*80);//設(shè)置數(shù)據(jù)指針起點}*endif程序3:/***************************************************************作品:EEPROM實驗,開機還原關(guān)電前LED的亮滅狀況單片機:STC89C52RC晶振:12M編譯環(huán)境: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;/**********************************函數(shù)聲明**********************************//*在51單片機12MHZ時鐘下的延時函數(shù)*/voidLcd1602_Delay1ms(uintc);//誤差0us/*LCD1602寫入8位命令子函數(shù)*/voidLcdWrite(uchar);/*LCD1602寫入8位數(shù)據(jù)子函數(shù)*/ voidLcdWriteData(uchardat) ;/*LCD1602初始化子程序*/ voidLcdInit(); /*LCD1602寫入字符串*/voidLCDWrite_String(uchar*,uchary,ucharz,uchar*s);/*設(shè)置LCD1602寫入字符串的位置*/voidLCD_set_*y(uchar*,uchary,ucharz); voidIntConfiguration();/*ucharON_Hour=0*07; //初始開燈時間07:00 1ucharWarning_TempH=32; //高溫報警溫度5*/ucharON_Hour; //初始開燈時間07:00 1ucharWarning_TempH; //高溫報警溫度/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):主程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidmain(void){LcdInit();IntConfiguration();//////////////////////////////////////////////////////////////////*cc(0*2000); //擦除第1個扇區(qū)(2000h~21FFh)*c*(0*2000,ON_Hour); //對EEPROM區(qū)2002h寫入2*c*(0*2001,Warning_TempH); //對EEPROM區(qū)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區(qū)2002h數(shù)據(jù),還原關(guān)電前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個扇區(qū)(2000h~21FFh)*c*(0*2002,2); //對EEPROM區(qū)2002h寫入2 } if(!K2) { while(!K2);LED1=0;LED2=0;cc(0*2000); //擦除第1個扇區(qū)(2000h~21FFh)*c*(0*2002,6); //對EEPROM區(qū)2002h寫入6 }} */}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):擦除*一扇區(qū)(每個扇區(qū)512字節(jié))入口:addr=*一扇區(qū)首地址┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidcc(uintaddr){ //打開IAP功能(ISP_CONTR.7)=1:允許編程改變Flash,設(shè)置Flash操作等待時間//0*83(晶振<5M)0*82(晶振<10M)0*81(晶振<20M)0*80(晶振<40M)ISP_CONTR=0*81;ISP_CMD=0*03; //用戶可以對"DataFlash/EEPROM區(qū)"進行扇區(qū)擦除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(); //關(guān)閉ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):寫一字節(jié)入口:addr=扇區(qū)單元地址,dat=待寫入數(shù)據(jù)┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/void*c*(uintaddr,uchardat){ISP_CONTR=0*81; ISP_CMD=0*02; //用戶可以對"DataFlash/EEPROM區(qū)"進行字節(jié)編程ISP_ADDRL=addr;ISP_ADDRH=addr>>8;ISP_DATA=dat;//數(shù)據(jù)進ISP_DATAEA=0;ISP_TRIG=0*46;ISP_TRIG=0*B9;_nop_();Q0(); //關(guān)閉ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):讀一字節(jié)入口:addr=扇區(qū)單元地址出口:dat=讀出的數(shù)據(jù)┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/uchardc*(uintaddr){uchardat; ISP_CONTR=0*81; ISP_CMD=0*01;//用戶可以對"DataFlash/EEPROM區(qū)"進行字節(jié)讀ISP_ADDRL=addr;ISP_ADDRH=addr>>8;EA=0;ISP_TRIG=0*46;ISP_TRIG=0*B9;_nop_();dat=ISP_DATA; //取出數(shù)據(jù)Q0(); //關(guān)閉ISP/IAP returndat;}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):關(guān)閉ISP/IAP操作┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/voidQ0(){ISP_CONTR=0;//關(guān)閉IAP功能ISP_CMD=0;//待機模式,無ISP操作ISP_TRIG=0;//關(guān)閉IAP功能,清與ISP有關(guān)的特殊功能寄存器EA=1;}/*STC89C52RC部EEPROM詳細地址表:第一扇區(qū)第二扇區(qū)第三扇區(qū)第四扇區(qū)起始地址結(jié)束地址起始地址結(jié)束地址起始地址結(jié)束地址起始地址結(jié)束地址2000h21FFh2200h23FFh2400h25FFh2600h27FFH第五扇區(qū)第六扇區(qū)第七扇區(qū)第八扇區(qū)起始地址結(jié)束地址起始地址結(jié)束地址起始地址結(jié)束地址起始地址結(jié)束地址2800h29FFh2A00h2BFFh2C00h2DFFh2E00h2FFFh*//********************************************************************************函數(shù)名:Lcd1602_Delay1ms*函數(shù)功能:延時函數(shù),延時1ms*輸入:c*輸出:無*說名:該函數(shù)是在12MHZ晶振下,12分頻單片機的延時。*******************************************************************************/voidLcd1602_Delay1ms(uintc)//誤差0us{uchara,b; for(;c>0;c--) { for(b=199;b>0;b--) { for(a=1;a>0;a--); } } }/********************************************************************************函數(shù)名:voidLCDWrite_String(uchar*,uchary,uchar*s)*函數(shù)功能:向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++; }}/********************************************************************************函數(shù)名:voidLCD_set_*y(uchar*,uchary,ucharz)*函數(shù)功能:指定向LCD寫入字符串的位置*輸入:*,y,z //*:橫坐標(biāo)y:縱坐標(biāo)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+*); }}/********************************************************************************函數(shù)名:LcdWrite*函數(shù)功能:向LCD寫入一個字節(jié)的命令*輸入:*輸出:無*******************************************************************************/*ifndef LCD1602_4PINS //當(dāng)沒有定義這個LCD1602_4PINS時voidLcdWrite(uchar) //寫入命令{LCD1602_E=0;//使能LCD1602_RS=0; //選擇發(fā)送命令LCD1602_RW=0; //選擇寫入LCD1602_DATAPINS=;//放入命令Lcd1602_Delay1ms(1); //等待數(shù)據(jù)穩(wěn)定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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB 5009.137-2025食品安全國家標(biāo)準(zhǔn)食品中銻的測定
- 天府新區(qū)航空職業(yè)學(xué)院《企業(yè)文化與團隊建設(shè)》2023-2024學(xué)年第二學(xué)期期末試卷
- 南京工業(yè)大學(xué)《電路與模擬電子技術(shù)C》2023-2024學(xué)年第二學(xué)期期末試卷
- 邵陽職業(yè)技術(shù)學(xué)院《藏族文學(xué)概論》2023-2024學(xué)年第一學(xué)期期末試卷
- 山東科技職業(yè)學(xué)院《教育寫作》2023-2024學(xué)年第二學(xué)期期末試卷
- 麗水學(xué)院《四史》2023-2024學(xué)年第一學(xué)期期末試卷
- 梧州職業(yè)學(xué)院《生物醫(yī)學(xué)檢測技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 陽泉職業(yè)技術(shù)學(xué)院《法語語音》2023-2024學(xué)年第一學(xué)期期末試卷
- 鄭州升達經(jīng)貿(mào)管理學(xué)院《健身與指導(dǎo)》2023-2024學(xué)年第二學(xué)期期末試卷
- 配電箱供貨合同
- 車庫建筑設(shè)計規(guī)范《車庫建筑設(shè)計規(guī)范》JGJ100-2015修訂對照表(2022)
- 《智能運輸系統(tǒng)》復(fù)習(xí)提綱解析
- 圖書館智能照明控制系統(tǒng)設(shè)計-畢業(yè)論文
- 土地復(fù)墾方案編制規(guī)程第1部分通則
- 雙減作業(yè)分層設(shè)計-四年級語文下冊分層作業(yè)設(shè)計案例13《貓》含答案
- 機動車登記翻譯(適用于出國資料)
- 感染性休克指導(dǎo)課件
- 監(jiān)控系統(tǒng)維護合同正式版
- 外研社小學(xué)一年級下冊英語期中試卷
- 《中西文化比較》(教學(xué)大綱)
- 神華準(zhǔn)能“一步酸溶法”粉煤灰生產(chǎn)氧化鋁焙燒爐的選型研究
評論
0/150
提交評論