找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 45274|回復(fù): 30
收起左側(cè)

51單片機讀寫內(nèi)部EEPROM詳解

  [復(fù)制鏈接]
ID:163705 發(fā)表于 2017-3-29 16:11 | 顯示全部樓層 |閱讀模式
此文檔共包含三個程序。

第一個程序最簡單易懂,看懂了基本就會讀寫51單片機內(nèi)部EEPROM了。

第二個程序和第一個讀寫EEPROM原理差不多,包含有LCD1602操作方法,有寫字符串的方法。

第三個程序在原有基礎(chǔ)上增加了外部中斷功能,細心的人會發(fā)現(xiàn),操作內(nèi)部EEPROM過程會將總中斷關(guān)閉,實際上程序要用到中斷時只需在原有的EEPROM操作后加上開總中斷即可。

驗證第二、第三個程序時需按程序內(nèi)主程序中的操作說明進行燒錄單片機,以驗證是否成功操作單片機內(nèi)部EEPROM。

程序1
  1. /***************************************************************
  2.     作品:EEPROM實驗,開機還原關(guān)電前LED的亮滅狀況
  3.   單片機:STC89C52RC
  4.     晶振:12M
  5. 編譯環(huán)境:Keil uVision4 V9.00
  6. ***************************************************************/     
  7. //#include <STC89C52RC.H>
  8. #include <reg52.h>
  9. #include <intrins.h>
  10. #define uchar unsigned char   
  11. #define uint unsigned int
  12. /****************特殊功能寄存器聲明****************/
  13. sfr ISP_DATA = 0xe2;   
  14. sfr ISP_ADDRH = 0xe3;     
  15. sfr ISP_ADDRL = 0xe4;   
  16. sfr ISP_CMD = 0xe5;   
  17. sfr ISP_TRIG = 0xe6;      
  18. sfr ISP_CONTR = 0xe7;
  19. sbit LED1 = P2^0;
  20. sbit LED2 = P2^1;
  21. sbit K1   = P3^2;                           //按鈕1
  22. sbit K2   = P3^3;                           //按鈕2
  23. void  cc(uint addr);
  24. void  xcx(uint addr,uchar dat);
  25. uchar dcx(uint addr);
  26. void  Q0();
  27. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  28. 函數(shù):主程序
  29. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  30. /*
  31. void main(void)
  32. {
  33.    uchar V;
  34.    V = dcx(0x2002);                          // 開機讀取EEPROM區(qū)2002h數(shù)據(jù),還原關(guān)電前LED的亮滅狀況
  35.    if(V == 2)          {LED1=0;LED2=1;}
  36.    else if(V == 6){LED1=0;LED2=0;}
  37.    while(1)
  38.      {
  39.       if(!K1)
  40.             {
  41.               while(!K1);
  42.               LED1=0;LED2=1;
  43.               cc(0x2000);                  // 擦除第1個扇區(qū)(2000h~21FFh)
  44.               xcx(0x2002,2);          // 對EEPROM區(qū)2002h寫入2
  45.             }
  46.           if(!K2)
  47.             {
  48.               while(!K2);
  49.               LED1=0;LED2=0;
  50.               cc(0x2000);                  // 擦除第1個扇區(qū)(2000h~21FFh)
  51.               xcx(0x2002,6);                          // 對EEPROM區(qū)2002h寫入6
  52.             }
  53.      }
  54. }
  55. */
  56. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  57. 函數(shù):擦除某一扇區(qū)(每個扇區(qū)512字節(jié))
  58. 入口:addr = 某一扇區(qū)首地址                          
  59. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  60. void cc(uint addr)
  61. {      
  62. // 打開 IAP 功能(ISP_CONTR.7)=1:允許編程改變Flash, 設(shè)置Flash操作等待時間
  63. // 0x83(晶振<5M)   0x82(晶振<10M)   0x81(晶振<20M)   0x80(晶振<40M)
  64.     ISP_CONTR = 0x81;  
  65.     ISP_CMD   = 0x03;                  // 用戶可以對"Data Flash/EEPROM區(qū)"進行扇區(qū)擦除
  66.     ISP_ADDRL = addr;         // ISP/IAP操作時的地址寄存器低八位,
  67.     ISP_ADDRH = addr>>8;      // ISP/IAP操作時的地址寄存器高八位。
  68.         EA =0;   
  69.     ISP_TRIG = 0x46;          // 在ISPEN(ISP_CONTR.7)=1時,對ISP_TRIG先寫入46h,
  70.     ISP_TRIG = 0xB9;          // 再寫入B9h,ISP/IAP命令才會生效。
  71.     _nop_();
  72.     Q0();                                          // 關(guān)閉ISP/IAP
  73. }
  74. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  75. 函數(shù):寫一字節(jié)
  76. 入口:addr = 扇區(qū)單元地址 , dat = 待寫入數(shù)據(jù)
  77. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  78. void xcx(uint addr,uchar dat)
  79. {
  80.     ISP_CONTR = 0x81;                  
  81.     ISP_CMD   = 0x02;              // 用戶可以對"Data Flash/EEPROM區(qū)"進行字節(jié)編程
  82.     ISP_ADDRL = addr;        
  83.     ISP_ADDRH = addr>>8;      
  84.     ISP_DATA  = dat;          // 數(shù)據(jù)進ISP_DATA
  85.     EA = 0;
  86.     ISP_TRIG = 0x46;         
  87.     ISP_TRIG = 0xB9;         
  88.     _nop_();
  89.     Q0();                                          // 關(guān)閉ISP/IAP
  90. }
  91. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  92. 函數(shù):讀一字節(jié)
  93. 入口:addr = 扇區(qū)單元地址
  94. 出口:dat  = 讀出的數(shù)據(jù)
  95. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  96. uchar dcx(uint addr)
  97. {   
  98.     uchar dat;
  99.       
  100.         ISP_CONTR = 0x81;                  
  101.     ISP_CMD   = 0x01;         // 用戶可以對"Data Flash/EEPROM區(qū)"進行字節(jié)讀
  102.     ISP_ADDRL = addr;         
  103.     ISP_ADDRH = addr>>8;      
  104.     EA = 0;
  105.     ISP_TRIG = 0x46;         
  106.     ISP_TRIG = 0xB9;         
  107.     _nop_();
  108.     dat = ISP_DATA;                          // 取出數(shù)據(jù)
  109.         Q0();                                          // 關(guān)閉ISP/IAP                  
  110.         return dat;
  111. }
  112. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  113. 函數(shù):關(guān)閉ISP/IAP操作
  114. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  115. void Q0()
  116. {
  117.     ISP_CONTR = 0;            // 關(guān)閉IAP功能
  118.     ISP_CMD   = 0;            // 待機模式,無ISP操作
  119.     ISP_TRIG  = 0;            // 關(guān)閉IAP功能, 清與ISP有關(guān)的特殊功能寄存器
  120. }
  121. /*
  122. STC89C52RC內(nèi)部EEPROM詳細地址表:
  123. 第一扇區(qū)                   第二扇區(qū)                    第三扇區(qū)                    第四扇區(qū)
  124. 起始地址  結(jié)束地址   起始地址   結(jié)束地址   起始地址   結(jié)束地址   起始地址    結(jié)束地址
  125. 2000h      21FFh       2200h       23FFh      2400h       25FFh       2600h        27FFH
  126. 第五扇區(qū)                    第六扇區(qū)                     第七扇區(qū)                    第八扇區(qū)
  127. 起始地址   結(jié)束地址   起始地址   結(jié)束地址    起始地址   結(jié)束地址   起始地址    結(jié)束地址
  128. 2800h       29FFh       2A00h      2BFFh        2C00h      2DFFh      2E00h        2FFFh
  129. */
復(fù)制代碼

程序2
  1. /***************************************************************
  2.     作品:EEPROM實驗,開機還原關(guān)電前LED的亮滅狀況
  3.   單片機:STC89C52RC
  4.     晶振:12M
  5. 編譯環(huán)境:Keil uVision4 V9.00
  6. ***************************************************************/     
  7. //#include <STC89C52RC.H>
  8. #include <reg52.h>
  9. #include <intrins.h>
  10. #define uchar unsigned char   
  11. #define uint unsigned int
  12. /****************特殊功能寄存器聲明****************/
  13. sfr ISP_DATA = 0xe2;   
  14. sfr ISP_ADDRH = 0xe3;     
  15. sfr ISP_ADDRL = 0xe4;   
  16. sfr ISP_CMD = 0xe5;   
  17. sfr ISP_TRIG = 0xe6;      
  18. sfr ISP_CONTR = 0xe7;
  19. sbit LED1 = P2^0;
  20. sbit LED2 = P2^1;
  21. sbit K1   = P3^2;                           //按鈕1
  22. sbit K2   = P3^3;                           //按鈕2
  23. void  cc(uint addr);
  24. void  xcx(uint addr,uchar dat);
  25. uchar dcx(uint addr);
  26. void  Q0();
  27. #ifndef uchar
  28. #define uchar unsigned char
  29. #endif
  30. #ifndef uint
  31. #define uint unsigned int
  32. #endif
  33. /**********************************
  34. PIN口定義
  35. **********************************/
  36. #define LCD1602_DATAPINS P0
  37. sbit LCD1602_E=P2^7;
  38. sbit LCD1602_RW=P2^5;
  39. sbit LCD1602_RS=P2^6;
  40. /**********************************
  41. 函數(shù)聲明
  42. **********************************/
  43. /*在51單片機12MHZ時鐘下的延時函數(shù)*/
  44. void Lcd1602_Delay1ms(uint c);   //誤差 0us
  45. /*LCD1602寫入8位命令子函數(shù)*/
  46. void LcdWriteCom(uchar com);
  47. /*LCD1602寫入8位數(shù)據(jù)子函數(shù)*/      
  48. void LcdWriteData(uchar dat)        ;
  49. /*LCD1602初始化子程序*/               
  50. void LcdInit();      
  51. /*LCD1602寫入字符串*/
  52. void LCDWrite_String(uchar x, uchar y,uchar z, uchar *s);
  53. /*設(shè)置LCD1602寫入字符串的位置*/
  54. void LCD_set_xy(uchar x, uchar y, uchar z);               
  55. uchar ON_Hour=0x07;          //初始開燈時間  07:00                                                                   1
  56. uchar Warning_TempH=32;         //高溫報警溫度                                                                                   5
  57. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  58. 函數(shù):主程序
  59. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  60. /*
  61. void main(void)
  62. {
  63.    uchar V;
  64.    V = dcx(0x2002);                          // 開機讀取EEPROM區(qū)2002h數(shù)據(jù),還原關(guān)電前LED的亮滅狀況
  65.    if(V == 2)          {LED1=0;LED2=1;}
  66.    else if(V == 6){LED1=0;LED2=0;}
  67.    while(1)
  68.      {
  69.       if(!K1)
  70.             {
  71.               while(!K1);
  72.               LED1=0;LED2=1;
  73.               cc(0x2000);                  // 擦除第1個扇區(qū)(2000h~21FFh)
  74.               xcx(0x2002,2);          // 對EEPROM區(qū)2002h寫入2
  75.             }
  76.           if(!K2)
  77.             {
  78.               while(!K2);
  79.               LED1=0;LED2=0;
  80.               cc(0x2000);                  // 擦除第1個扇區(qū)(2000h~21FFh)
  81.               xcx(0x2002,6);                          // 對EEPROM區(qū)2002h寫入6
  82.             }
  83.      }
  84. }
  85. */
  86. void main(void)
  87. {
  88.    LcdInit();
  89. //不注銷下面三句,燒錄一次
  90. //注銷小面三句,再燒錄一次
  91. //若兩次燒錄后現(xiàn)象一致,則操作內(nèi)部EEPROM成功
  92. /////////////////////////////////////////////////////////////////
  93.    cc(0x2000);                  // 擦除第1個扇區(qū)(2000h~21FFh)
  94.    xcx(0x2000,ON_Hour);          // 對EEPROM區(qū)2002h寫入2
  95.    xcx(0x2001,Warning_TempH);          // 對EEPROM區(qū)2002h寫入2
  96. /////////////////////////////////////////////////////////////////   
  97.    ON_Hour = dcx(0x2000);
  98.    Warning_TempH = dcx(0x2001);
  99.    if((ON_Hour==0x07)||(Warning_TempH==32))
  100.    {
  101.            LcdWriteCom(0x80);
  102.           LCDWrite_String(0, 1, 7, "SUCCESS");
  103.    }
  104.    else
  105.    LCDWrite_String(0, 1, 5, "ERROR");
  106.    while(1);
  107. }
  108. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  109. 函數(shù):擦除某一扇區(qū)(每個扇區(qū)512字節(jié))
  110. 入口:addr = 某一扇區(qū)首地址                          
  111. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  112. void cc(uint addr)
  113. {      
  114. // 打開 IAP 功能(ISP_CONTR.7)=1:允許編程改變Flash, 設(shè)置Flash操作等待時間
  115. // 0x83(晶振<5M)   0x82(晶振<10M)   0x81(晶振<20M)   0x80(晶振<40M)
  116.     ISP_CONTR = 0x81;  
  117.     ISP_CMD   = 0x03;                  // 用戶可以對"Data Flash/EEPROM區(qū)"進行扇區(qū)擦除
  118.     ISP_ADDRL = addr;         // ISP/IAP操作時的地址寄存器低八位,
  119.     ISP_ADDRH = addr>>8;      // ISP/IAP操作時的地址寄存器高八位。
  120.         EA =0;   
  121.     ISP_TRIG = 0x46;          // 在ISPEN(ISP_CONTR.7)=1時,對ISP_TRIG先寫入46h,
  122.     ISP_TRIG = 0xB9;          // 再寫入B9h,ISP/IAP命令才會生效。
  123.     _nop_();
  124.     Q0();                                          // 關(guān)閉ISP/IAP
  125. }
  126. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  127. 函數(shù):寫一字節(jié)
  128. 入口:addr = 扇區(qū)單元地址 , dat = 待寫入數(shù)據(jù)
  129. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  130. void xcx(uint addr,uchar dat)
  131. {
  132.     ISP_CONTR = 0x81;                  
  133.     ISP_CMD   = 0x02;              // 用戶可以對"Data Flash/EEPROM區(qū)"進行字節(jié)編程
  134.     ISP_ADDRL = addr;        
  135.     ISP_ADDRH = addr>>8;      
  136.     ISP_DATA  = dat;          // 數(shù)據(jù)進ISP_DATA
  137.     EA = 0;
  138.     ISP_TRIG = 0x46;         
  139.     ISP_TRIG = 0xB9;         
  140.     _nop_();
  141.     Q0();                                          // 關(guān)閉ISP/IAP
  142. }
  143. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  144. 函數(shù):讀一字節(jié)
  145. 入口:addr = 扇區(qū)單元地址
  146. 出口:dat  = 讀出的數(shù)據(jù)
  147. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  148. uchar dcx(uint addr)
  149. {   
  150.     uchar dat;
  151.       
  152.         ISP_CONTR = 0x81;                  
  153.     ISP_CMD   = 0x01;         // 用戶可以對"Data Flash/EEPROM區(qū)"進行字節(jié)讀
  154.     ISP_ADDRL = addr;         
  155.     ISP_ADDRH = addr>>8;      
  156.     EA = 0;
  157.     ISP_TRIG = 0x46;         
  158.     ISP_TRIG = 0xB9;         
  159.     _nop_();
  160.     dat = ISP_DATA;                          // 取出數(shù)據(jù)
  161.         Q0();                                          // 關(guān)閉ISP/IAP                  
  162.         return dat;
  163. }
  164. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  165. 函數(shù):關(guān)閉ISP/IAP操作
  166. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  167. void Q0()
  168. {
  169.     ISP_CONTR = 0;            // 關(guān)閉IAP功能
  170.     ISP_CMD   = 0;            // 待機模式,無ISP操作
  171.     ISP_TRIG  = 0;            // 關(guān)閉IAP功能, 清與ISP有關(guān)的特殊功能寄存器
  172. }
  173. /*
  174. STC89C52RC內(nèi)部EEPROM詳細地址表:
  175. 第一扇區(qū)                   第二扇區(qū)                    第三扇區(qū)                    第四扇區(qū)
  176. 起始地址  結(jié)束地址   起始地址   結(jié)束地址   起始地址   結(jié)束地址   起始地址    結(jié)束地址
  177. 2000h      21FFh       2200h       23FFh      2400h       25FFh       2600h        27FFH
  178. 第五扇區(qū)                    第六扇區(qū)                     第七扇區(qū)                    第八扇區(qū)
  179. 起始地址   結(jié)束地址   起始地址   結(jié)束地址    起始地址   結(jié)束地址   起始地址    結(jié)束地址
  180. 2800h       29FFh       2A00h      2BFFh        2C00h      2DFFh      2E00h        2FFFh
  181. */
  182. /*******************************************************************************
  183. * 函 數(shù) 名         : Lcd1602_Delay1ms
  184. * 函數(shù)功能                   : 延時函數(shù),延時1ms
  185. * 輸    入         : c
  186. * 輸    出         : 無
  187. * 說    名         : 該函數(shù)是在12MHZ晶振下,12分頻單片機的延時。
  188. *******************************************************************************/
  189. void Lcd1602_Delay1ms(uint c)   //誤差 0us
  190. {
  191.     uchar a,b;
  192.         for (; c>0; c--)
  193.         {
  194.                  for (b=199;b>0;b--)
  195.                  {
  196.                           for(a=1;a>0;a--);
  197.                  }      
  198.         }         
  199. }
  200. /*******************************************************************************
  201. * 函 數(shù) 名         : void LCDWrite_String(uchar x, uchar y, uchar *s)
  202. * 函數(shù)功能                   : 向LCD寫入一個字符串
  203. * 輸    入         : x,y,*s
  204. * 輸    出         : 無
  205. *******************************************************************************/
  206. void LCDWrite_String(uchar x, uchar y, uchar z, uchar *s)        //x 0~15 , y 0,1,2,3
  207. {
  208.         LCD_set_xy(x,y,z);
  209.         while(*s)
  210.         {
  211.                 LcdWriteData(*s);
  212.                 s++;
  213.         }
  214. }
  215. /*******************************************************************************
  216. * 函 數(shù) 名         : void LCD_set_xy(uchar x, uchar y,uchar z)
  217. * 函數(shù)功能                   : 指定向LCD寫入字符串的位置
  218. * 輸    入         : x,y,z                 //x:橫坐標(biāo) y:縱坐標(biāo) z:字符串長度
  219. * 輸    出         : 無
  220. *******************************************************************************/
  221. void LCD_set_xy(uchar x,uchar y,uchar z)
  222. {
  223.         uchar i;
  224.         if(y==0)
  225.         {
  226.                 LcdWriteCom(0x80+x);
  227.                 for(i=0;i<z;i++)
  228.                 {
  229.                         LcdWriteData(' ');
  230.                 }
  231.                 LcdWriteCom(0x80+x);
  232.         }
  233.         if(y==1)
  234.         {
  235.                 LcdWriteCom(0xc0+x);
  236.                 for(i=0;i<z;i++)
  237.                 {
  238.                         LcdWriteData(' ');
  239.                 }
  240.                 LcdWriteCom(0xc0+x);
  241.         }
  242.         if(y==2)
  243.         {
  244.                 LcdWriteCom(0x94+x);
  245.                 for(i=0;i<z;i++)
  246.                 {
  247.                         LcdWriteData(' ');
  248.                 }
  249.                 LcdWriteCom(0x94+x);
  250.         }
  251.         if(y==3)
  252.         {
  253.                 LcdWriteCom(0xd4+x);
  254.                 for(i=0;i<z;i++)
  255.                 {
  256.                         LcdWriteData(' ');
  257.                 }
  258.                 LcdWriteCom(0xd4+x);
  259.         }
  260. }
  261. /*******************************************************************************
  262. * 函 數(shù) 名         : LcdWriteCom
  263. * 函數(shù)功能                   : 向LCD寫入一個字節(jié)的命令
  264. * 輸    入         : com
  265. * 輸    出         : 無
  266. *******************************************************************************/
  267. #ifndef         LCD1602_4PINS         //當(dāng)沒有定義這個LCD1602_4PINS時
  268. void LcdWriteCom(uchar com)          //寫入命令
  269. {
  270.         LCD1602_E = 0;     //使能
  271.         LCD1602_RS = 0;           //選擇發(fā)送命令
  272.         LCD1602_RW = 0;           //選擇寫入
  273.       
  274.         LCD1602_DATAPINS = com;     //放入命令
  275.         Lcd1602_Delay1ms(1);                //等待數(shù)據(jù)穩(wěn)定
  276.         LCD1602_E = 1;                  //寫入時序
  277.         Lcd1602_Delay1ms(5);          //保持時間
  278.         LCD1602_E = 0;
  279. }
  280. #else
  281. void LcdWriteCom(uchar com)          //寫入命令
  282. {
  283.         LCD1602_E = 0;         //使能清零
  284.         LCD1602_RS = 0;         //選擇寫入命令
  285.         LCD1602_RW = 0;         //選擇寫入
  286.         LCD1602_DATAPINS = com;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  287.         Lcd1602_Delay1ms(1);
  288.         LCD1602_E = 1;         //寫入時序
  289.         Lcd1602_Delay1ms(5);
  290.         LCD1602_E = 0;
  291. //        Lcd1602_Delay1ms(1);
  292.         LCD1602_DATAPINS = com << 4; //發(fā)送低四位
  293.         Lcd1602_Delay1ms(1);
  294.         LCD1602_E = 1;         //寫入時序
  295.         Lcd1602_Delay1ms(5);
  296.         LCD1602_E = 0;
  297. }
  298. #endif
  299. /*******************************************************************************
  300. * 函 數(shù) 名         : LcdWriteData
  301. * 函數(shù)功能                   : 向LCD寫入一個字節(jié)的數(shù)據(jù)
  302. * 輸    入         : dat
  303. * 輸    出         : 無
  304. *******************************************************************************/                  
  305. #ifndef         LCD1602_4PINS                  
  306. void LcdWriteData(uchar dat)                        //寫入數(shù)據(jù)
  307. {
  308.         LCD1602_E = 0;        //使能清零
  309.         LCD1602_RS = 1;        //選擇輸入數(shù)據(jù)
  310.         LCD1602_RW = 0;        //選擇寫入
  311.         LCD1602_DATAPINS = dat; //寫入數(shù)據(jù)
  312.         Lcd1602_Delay1ms(1);
  313.         LCD1602_E = 1;   //寫入時序
  314.         Lcd1602_Delay1ms(5);   //保持時間
  315.         LCD1602_E = 0;
  316. }
  317. #else
  318. void LcdWriteData(uchar dat)                        //寫入數(shù)據(jù)
  319. {
  320.         LCD1602_E = 0;          //使能清零
  321.         LCD1602_RS = 1;          //選擇寫入數(shù)據(jù)
  322.         LCD1602_RW = 0;          //選擇寫入
  323.         LCD1602_DATAPINS = dat;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  324.         Lcd1602_Delay1ms(1);
  325.         LCD1602_E = 1;          //寫入時序
  326.         Lcd1602_Delay1ms(5);
  327.         LCD1602_E = 0;
  328.         LCD1602_DATAPINS = dat << 4; //寫入低四位
  329.         Lcd1602_Delay1ms(1);
  330.         LCD1602_E = 1;          //寫入時序
  331.         Lcd1602_Delay1ms(5);
  332.         LCD1602_E = 0;
  333. }
  334. #endif
  335. /*******************************************************************************
  336. * 函 數(shù) 名       : LcdInit()
  337. * 函數(shù)功能                 : 初始化LCD屏
  338. * 輸    入       : 無
  339. * 輸    出       : 無
  340. *******************************************************************************/                  
  341. #ifndef                LCD1602_4PINS
  342. void LcdInit()                                                  //LCD初始化子程序
  343. {
  344.         LcdWriteCom(0x38);  //開顯示
  345.         LcdWriteCom(0x0c);  //開顯示不顯示光標(biāo)
  346.         LcdWriteCom(0x06);  //寫一個指針加1
  347.         LcdWriteCom(0x01);  //清屏
  348.         LcdWriteCom(0x80);  //設(shè)置數(shù)據(jù)指針起點
  349. }
  350. #else
  351. void LcdInit()                                                  //LCD初始化子程序
  352. {
  353.         LcdWriteCom(0x32);         //將8位總線轉(zhuǎn)為4位總線
  354.         LcdWriteCom(0x28);         //在四位線下的初始化
  355.         LcdWriteCom(0x0c);  //開顯示不顯示光標(biāo)
  356.         LcdWriteCom(0x06);  //寫一個指針加1
  357.         LcdWriteCom(0x01);  //清屏
  358.         LcdWriteCom(0x80);  //設(shè)置數(shù)據(jù)指針起點
  359. }
  360. #endif
復(fù)制代碼

程序3
  1. /***************************************************************
  2.     作品:EEPROM實驗,開機還原關(guān)電前LED的亮滅狀況
  3.   單片機:STC89C52RC
  4.     晶振:12M
  5. 編譯環(huán)境:Keil uVision4 V9.00
  6. ***************************************************************/     
  7. //#include <STC89C52RC.H>
  8. #include <reg52.h>
  9. #include <intrins.h>
  10. #define uchar unsigned char   
  11. #define uint unsigned int
  12. /****************特殊功能寄存器聲明****************/
  13. sfr ISP_DATA = 0xe2;   
  14. sfr ISP_ADDRH = 0xe3;     
  15. sfr ISP_ADDRL = 0xe4;   
  16. sfr ISP_CMD = 0xe5;   
  17. sfr ISP_TRIG = 0xe6;      
  18. sfr ISP_CONTR = 0xe7;
  19. sbit LED1 = P2^0;
  20. sbit LED2 = P2^1;
  21. sbit K1   = P3^2;                           //按鈕1
  22. sbit K2   = P3^3;                           //按鈕2
  23. void  cc(uint addr);
  24. void  xcx(uint addr,uchar dat);
  25. uchar dcx(uint addr);
  26. void  Q0();
  27. #ifndef uchar
  28. #define uchar unsigned char
  29. #endif
  30. #ifndef uint
  31. #define uint unsigned int
  32. #endif
  33. /**********************************
  34. PIN口定義
  35. **********************************/
  36. #define LCD1602_DATAPINS P0
  37. sbit LCD1602_E=P2^7;
  38. sbit LCD1602_RW=P2^5;
  39. sbit LCD1602_RS=P2^6;
  40. /**********************************
  41. 函數(shù)聲明
  42. **********************************/
  43. /*在51單片機12MHZ時鐘下的延時函數(shù)*/
  44. void Lcd1602_Delay1ms(uint c);   //誤差 0us
  45. /*LCD1602寫入8位命令子函數(shù)*/
  46. void LcdWriteCom(uchar com);
  47. /*LCD1602寫入8位數(shù)據(jù)子函數(shù)*/      
  48. void LcdWriteData(uchar dat)        ;
  49. /*LCD1602初始化子程序*/               
  50. void LcdInit();      
  51. /*LCD1602寫入字符串*/
  52. void LCDWrite_String(uchar x, uchar y,uchar z, uchar *s);
  53. /*設(shè)置LCD1602寫入字符串的位置*/
  54. void LCD_set_xy(uchar x, uchar y, uchar z);               
  55. void IntConfiguration();
  56. /*
  57. uchar ON_Hour=0x07;          //初始開燈時間  07:00                                                                   1
  58. uchar Warning_TempH=32;         //高溫報警溫度                                                                                   5
  59. */
  60. uchar ON_Hour;          //初始開燈時間  07:00                                                                   1
  61. uchar Warning_TempH;         //高溫報警溫度      
  62. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  63. 函數(shù):主程序
  64. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  65. void main(void)
  66. {
  67.    LcdInit();
  68.    IntConfiguration();
  69. /////////////////////////////////////////////////////////////////
  70. /*
  71.    cc(0x2000);                  // 擦除第1個扇區(qū)(2000h~21FFh)
  72.    xcx(0x2000,ON_Hour);          // 對EEPROM區(qū)2002h寫入2
  73.    xcx(0x2001,Warning_TempH);          // 對EEPROM區(qū)2002h寫入2
  74. */
  75. /////////////////////////////////////////////////////////////////   
  76.    while(1)
  77.    {
  78.    ON_Hour = dcx(0x2000);
  79.    Warning_TempH = dcx(0x2001);
  80.    if((ON_Hour==0x07)||(Warning_TempH==32))
  81.    {
  82.            LcdWriteCom(0x80);
  83.           LCDWrite_String(0, 1, 7, "SUCCESS");
  84.    }
  85.    else
  86.    LcdWriteCom(0x80);
  87.    LCDWrite_String(0, 1, 5, "ERROR");
  88.    }
  89.    /*
  90.    uchar V;
  91.    V = dcx(0x2002);                          // 開機讀取EEPROM區(qū)2002h數(shù)據(jù),還原關(guān)電前LED的亮滅狀況
  92.    if(V == 2)          {LED1=0;LED2=1;}
  93.    else if(V == 6){LED1=0;LED2=0;}
  94.    while(1)
  95.      {
  96.       if(!K1)
  97.             {
  98.               while(!K1);
  99.               LED1=0;LED2=1;
  100.               cc(0x2000);                  // 擦除第1個扇區(qū)(2000h~21FFh)
  101.               xcx(0x2002,2);          // 對EEPROM區(qū)2002h寫入2
  102.             }
  103.           if(!K2)
  104.             {
  105.               while(!K2);
  106.               LED1=0;LED2=0;
  107.               cc(0x2000);                  // 擦除第1個扇區(qū)(2000h~21FFh)
  108.               xcx(0x2002,6);                          // 對EEPROM區(qū)2002h寫入6
  109.             }
  110.      }
  111.          */
  112. }
  113. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  114. 函數(shù):擦除某一扇區(qū)(每個扇區(qū)512字節(jié))
  115. 入口:addr = 某一扇區(qū)首地址                          
  116. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  117. void cc(uint addr)
  118. {      
  119. // 打開 IAP 功能(ISP_CONTR.7)=1:允許編程改變Flash, 設(shè)置Flash操作等待時間
  120. // 0x83(晶振<5M)   0x82(晶振<10M)   0x81(晶振<20M)   0x80(晶振<40M)
  121.     ISP_CONTR = 0x81;  
  122.     ISP_CMD   = 0x03;                  // 用戶可以對"Data Flash/EEPROM區(qū)"進行扇區(qū)擦除
  123.     ISP_ADDRL = addr;         // ISP/IAP操作時的地址寄存器低八位,
  124.     ISP_ADDRH = addr>>8;      // ISP/IAP操作時的地址寄存器高八位。
  125.         EA =0;   
  126.     ISP_TRIG = 0x46;          // 在ISPEN(ISP_CONTR.7)=1時,對ISP_TRIG先寫入46h,
  127.     ISP_TRIG = 0xB9;          // 再寫入B9h,ISP/IAP命令才會生效。
  128.     _nop_();
  129.     Q0();                                          // 關(guān)閉ISP/IAP
  130. }
  131. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  132. 函數(shù):寫一字節(jié)
  133. 入口:addr = 扇區(qū)單元地址 , dat = 待寫入數(shù)據(jù)
  134. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  135. void xcx(uint addr,uchar dat)
  136. {
  137.     ISP_CONTR = 0x81;                  
  138.     ISP_CMD   = 0x02;              // 用戶可以對"Data Flash/EEPROM區(qū)"進行字節(jié)編程
  139.     ISP_ADDRL = addr;        
  140.     ISP_ADDRH = addr>>8;      
  141.     ISP_DATA  = dat;          // 數(shù)據(jù)進ISP_DATA
  142.     EA = 0;
  143.     ISP_TRIG = 0x46;         
  144.     ISP_TRIG = 0xB9;         
  145.     _nop_();
  146.     Q0();                                          // 關(guān)閉ISP/IAP
  147. }
  148. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  149. 函數(shù):讀一字節(jié)
  150. 入口:addr = 扇區(qū)單元地址
  151. 出口:dat  = 讀出的數(shù)據(jù)
  152. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  153. uchar dcx(uint addr)
  154. {   
  155.     uchar dat;
  156.       
  157.         ISP_CONTR = 0x81;                  
  158.     ISP_CMD   = 0x01;         // 用戶可以對"Data Flash/EEPROM區(qū)"進行字節(jié)讀
  159.     ISP_ADDRL = addr;         
  160.     ISP_ADDRH = addr>>8;      
  161.     EA = 0;
  162.     ISP_TRIG = 0x46;         
  163.     ISP_TRIG = 0xB9;         
  164.     _nop_();
  165.     dat = ISP_DATA;                          // 取出數(shù)據(jù)
  166.         Q0();                                          // 關(guān)閉ISP/IAP                  
  167.         return dat;
  168. }
  169. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  170. 函數(shù):關(guān)閉ISP/IAP操作
  171. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  172. void Q0()
  173. {
  174.     ISP_CONTR = 0;            // 關(guān)閉IAP功能
  175.     ISP_CMD   = 0;            // 待機模式,無ISP操作
  176.     ISP_TRIG  = 0;            // 關(guān)閉IAP功能, 清與ISP有關(guān)的特殊功能寄存器
  177.         EA=1;
  178. }
  179. /*
  180. STC89C52RC內(nèi)部EEPROM詳細地址表:
  181. 第一扇區(qū)                   第二扇區(qū)                    第三扇區(qū)                    第四扇區(qū)
  182. 起始地址  結(jié)束地址   起始地址   結(jié)束地址   起始地址   結(jié)束地址   起始地址    結(jié)束地址
  183. 2000h      21FFh       2200h       23FFh      2400h       25FFh       2600h        27FFH
  184. 第五扇區(qū)                    第六扇區(qū)                     第七扇區(qū)                    第八扇區(qū)
  185. 起始地址   結(jié)束地址   起始地址   結(jié)束地址    起始地址   結(jié)束地址   起始地址    結(jié)束地址
  186. 2800h       29FFh       2A00h      2BFFh        2C00h      2DFFh      2E00h        2FFFh
  187. */
  188. /*******************************************************************************
  189. * 函 數(shù) 名         : Lcd1602_Delay1ms
  190. * 函數(shù)功能                   : 延時函數(shù),延時1ms
  191. * 輸    入         : c
  192. * 輸    出         : 無
  193. * 說    名         : 該函數(shù)是在12MHZ晶振下,12分頻單片機的延時。
  194. *******************************************************************************/
  195. void Lcd1602_Delay1ms(uint c)   //誤差 0us
  196. {
  197.     uchar a,b;
  198.         for (; c>0; c--)
  199.         {
  200.                  for (b=199;b>0;b--)
  201.                  {
  202.                           for(a=1;a>0;a--);
  203.                  }      
  204.         }         
  205. }
  206. /*******************************************************************************
  207. * 函 數(shù) 名         : void LCDWrite_String(uchar x, uchar y, uchar *s)
  208. * 函數(shù)功能                   : 向LCD寫入一個字符串
  209. * 輸    入         : x,y,*s
  210. * 輸    出         : 無
  211. *******************************************************************************/
  212. void LCDWrite_String(uchar x, uchar y, uchar z, uchar *s)        //x 0~15 , y 0,1,2,3
  213. {
  214.         LCD_set_xy(x,y,z);
  215.         while(*s)
  216.         {
  217.                 LcdWriteData(*s);
  218.                 s++;
  219.         }
  220. }
  221. /*******************************************************************************
  222. * 函 數(shù) 名         : void LCD_set_xy(uchar x, uchar y,uchar z)
  223. * 函數(shù)功能                   : 指定向LCD寫入字符串的位置
  224. * 輸    入         : x,y,z                 //x:橫坐標(biāo) y:縱坐標(biāo) z:字符串長度
  225. * 輸    出         : 無
  226. *******************************************************************************/
  227. void LCD_set_xy(uchar x,uchar y,uchar z)
  228. {
  229.         uchar i;
  230.         if(y==0)
  231.         {
  232.                 LcdWriteCom(0x80+x);
  233.                 for(i=0;i<z;i++)
  234.                 {
  235.                         LcdWriteData(' ');
  236.                 }
  237.                 LcdWriteCom(0x80+x);
  238.         }
  239.         if(y==1)
  240.         {
  241.                 LcdWriteCom(0xc0+x);
  242.                 for(i=0;i<z;i++)
  243.                 {
  244.                         LcdWriteData(' ');
  245.                 }
  246.                 LcdWriteCom(0xc0+x);
  247.         }
  248.         if(y==2)
  249.         {
  250.                 LcdWriteCom(0x94+x);
  251.                 for(i=0;i<z;i++)
  252.                 {
  253.                         LcdWriteData(' ');
  254.                 }
  255.                 LcdWriteCom(0x94+x);
  256.         }
  257.         if(y==3)
  258.         {
  259.                 LcdWriteCom(0xd4+x);
  260.                 for(i=0;i<z;i++)
  261.                 {
  262.                         LcdWriteData(' ');
  263.                 }
  264.                 LcdWriteCom(0xd4+x);
  265.         }
  266. }
  267. /*******************************************************************************
  268. * 函 數(shù) 名         : LcdWriteCom
  269. * 函數(shù)功能                   : 向LCD寫入一個字節(jié)的命令
  270. * 輸    入         : com
  271. * 輸    出         : 無
  272. *******************************************************************************/
  273. #ifndef         LCD1602_4PINS         //當(dāng)沒有定義這個LCD1602_4PINS時
  274. void LcdWriteCom(uchar com)          //寫入命令
  275. {
  276.         LCD1602_E = 0;     //使能
  277.         LCD1602_RS = 0;           //選擇發(fā)送命令
  278.         LCD1602_RW = 0;           //選擇寫入
  279.       
  280.         LCD1602_DATAPINS = com;     //放入命令
  281.         Lcd1602_Delay1ms(1);                //等待數(shù)據(jù)穩(wěn)定
  282.         LCD1602_E = 1;                  //寫入時序
  283.         Lcd1602_Delay1ms(5);          //保持時間
  284.         LCD1602_E = 0;
  285. }
  286. #else
  287. void LcdWriteCom(uchar com)          //寫入命令
  288. {
  289.         LCD1602_E = 0;         //使能清零
  290.         LCD1602_RS = 0;         //選擇寫入命令
  291.         LCD1602_RW = 0;         //選擇寫入
  292.         LCD1602_DATAPINS = com;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  293.         Lcd1602_Delay1ms(1);
  294.         LCD1602_E = 1;         //寫入時序
  295.         Lcd1602_Delay1ms(5);
  296.         LCD1602_E = 0;
  297. //        Lcd1602_Delay1ms(1);
  298.         LCD1602_DATAPINS = com << 4; //發(fā)送低四位
  299.         Lcd1602_Delay1ms(1);
  300.         LCD1602_E = 1;         //寫入時序
  301.         Lcd1602_Delay1ms(5);
  302.         LCD1602_E = 0;
  303. }
  304. #endif
  305. /*******************************************************************************
  306. * 函 數(shù) 名         : LcdWriteData
  307. * 函數(shù)功能                   : 向LCD寫入一個字節(jié)的數(shù)據(jù)
  308. * 輸    入         : dat
  309. * 輸    出         : 無
  310. *******************************************************************************/                  
  311. #ifndef         LCD1602_4PINS                  
  312. void LcdWriteData(uchar dat)                        //寫入數(shù)據(jù)
  313. {
  314.         LCD1602_E = 0;        //使能清零
  315.         LCD1602_RS = 1;        //選擇輸入數(shù)據(jù)
  316.         LCD1602_RW = 0;        //選擇寫入
  317.         LCD1602_DATAPINS = dat; //寫入數(shù)據(jù)
  318.         Lcd1602_Delay1ms(1);
  319.         LCD1602_E = 1;   //寫入時序
  320.         Lcd1602_Delay1ms(5);   //保持時間
  321.         LCD1602_E = 0;
  322. }
  323. #else
  324. void LcdWriteData(uchar dat)                        //寫入數(shù)據(jù)
  325. {
  326.         LCD1602_E = 0;          //使能清零
  327.         LCD1602_RS = 1;          //選擇寫入數(shù)據(jù)
  328.         LCD1602_RW = 0;          //選擇寫入
  329.         LCD1602_DATAPINS = dat;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  330.         Lcd1602_Delay1ms(1);
  331.         LCD1602_E = 1;          //寫入時序
  332.         Lcd1602_Delay1ms(5);
  333.         LCD1602_E = 0;
  334.         LCD1602_DATAPINS = dat << 4; //寫入低四位
  335.         Lcd1602_Delay1ms(1);
  336.         LCD1602_E = 1;          //寫入時序
  337.         Lcd1602_Delay1ms(5);
  338.         LCD1602_E = 0;
  339. }
  340. #endif
  341. /*******************************************************************************
  342. * 函 數(shù) 名       : LcdInit()
  343. * 函數(shù)功能                 : 初始化LCD屏
  344. * 輸    入       : 無
  345. * 輸    出       : 無
  346. *******************************************************************************/                  
  347. #ifndef                LCD1602_4PINS
  348. void LcdInit()                                                  //LCD初始化子程序
  349. {
  350.         LcdWriteCom(0x38);  //開顯示
  351.         LcdWriteCom(0x0c);  //開顯示不顯示光標(biāo)
  352.         LcdWriteCom(0x06);  //寫一個指針加1
  353.         LcdWriteCom(0x01);  //清屏
  354.         LcdWriteCom(0x80);  //設(shè)置數(shù)據(jù)指針起點
  355. }
  356. #else
  357. void LcdInit()                                                  //LCD初始化子程序
  358. {
  359.         LcdWriteCom(0x32);         //將8位總線轉(zhuǎn)為4位總線
  360.         LcdWriteCom(0x28);         //在四位線下的初始化
  361.         LcdWriteCom(0x0c);  //開顯示不顯示光標(biāo)
  362.         LcdWriteCom(0x06);  //寫一個指針加1
  363.         LcdWriteCom(0x01);  //清屏
  364.         LcdWriteCom(0x80);  //設(shè)置數(shù)據(jù)指針起點
  365. }
  366. #endif
  367. void IntConfiguration()
  368. {
  369.         //設(shè)置INT0
  370.         IT0=1;//跳變沿出發(fā)方式(下降沿)
  371.         EX0=1;//打開INT0的中斷允許。
  372.         //設(shè)置INT1
  373.         IT1=1;//跳變沿出發(fā)方式(下降沿)
  374.         EX1=1;//打開INT0的中斷允許。
  375.         EA=1;//打開總中斷      
  376. }
  377. void Int0() interrupt 1                 
  378. {
  379.    cc(0x2000);                  // 擦除第1個扇區(qū)(2000h~21FFh)
  380.    xcx(0x2000,0x07);          // 對EEPROM區(qū)2002h寫入2
  381.    xcx(0x2001,32);
  382.    LcdInit();
  383. }
  384. void Int1() interrupt 2                 
  385. {
  386.    cc(0x2000);                  // 擦除第1個扇區(qū)(2000h~21FFh)
  387.    xcx(0x2000,0x08);          // 對EEPROM區(qū)2002h寫入2
  388.    xcx(0x2001,33);
  389.    LcdInit();
  390. }
復(fù)制代碼
163702u7rzlq1j88ibczbl.png
全部資料下載地址:
51單片機讀寫內(nèi)部EEPROM詳解.rar (101.88 KB, 下載次數(shù): 364)


評分

參與人數(shù) 3黑幣 +13 收起 理由
小白來報到 + 5 很給力!
phoebejeva + 5 贊一個!
sy333 + 3 贊一個!

查看全部評分

相關(guān)帖子

回復(fù)

使用道具 舉報

ID:19123 發(fā)表于 2017-3-31 09:42 | 顯示全部樓層
好好學(xué)習(xí),天天向上
回復(fù)

使用道具 舉報

ID:135253 發(fā)表于 2017-7-22 07:57 | 顯示全部樓層
樓主好樣的,多謝,學(xué)習(xí)一下
回復(fù)

使用道具 舉報

ID:151834 發(fā)表于 2017-7-29 15:25 | 顯示全部樓層
剛剛學(xué)到這里,學(xué)習(xí)了.
回復(fù)

使用道具 舉報

ID:37147 發(fā)表于 2017-11-21 15:12 | 顯示全部樓層
結(jié)合我看的資料,你的程序易懂。!
回復(fù)

使用道具 舉報

ID:247307 發(fā)表于 2018-4-19 22:08 | 顯示全部樓層
感謝樓主
回復(fù)

使用道具 舉報

ID:376438 發(fā)表于 2018-8-15 14:09 | 顯示全部樓層
謝謝了!,學(xué)習(xí)一下
回復(fù)

使用道具 舉報

ID:479915 發(fā)表于 2019-3-20 23:40 | 顯示全部樓層
好好學(xué)習(xí)
回復(fù)

使用道具 舉報

ID:308951 發(fā)表于 2019-3-21 08:31 | 顯示全部樓層
代碼很好,內(nèi)容十分詳細,已經(jīng)借鑒
回復(fù)

使用道具 舉報

ID:495323 發(fā)表于 2019-3-22 19:06 | 顯示全部樓層
有點復(fù)雜,51芯片手冊上面有
回復(fù)

使用道具 舉報

ID:382454 發(fā)表于 2019-4-9 10:59 | 顯示全部樓層
謝謝,我還是看看手冊,剛學(xué)寫EEPROM。頭好暈啊。
回復(fù)

使用道具 舉報

ID:496304 發(fā)表于 2019-4-28 11:09 | 顯示全部樓層
學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報

ID:517794 發(fā)表于 2019-4-28 15:20 | 顯示全部樓層
正需要呢 ,謝謝 !
回復(fù)

使用道具 舉報

ID:339320 發(fā)表于 2019-5-16 14:59 | 顯示全部樓層
好東西。謝謝分享。
回復(fù)

使用道具 舉報

ID:543352 發(fā)表于 2019-5-20 23:15 來自手機 | 顯示全部樓層
好東西,收藏了
回復(fù)

使用道具 舉報

ID:403027 發(fā)表于 2019-5-21 17:06 | 顯示全部樓層
很給力!!!!!
回復(fù)

使用道具 舉報

ID:538501 發(fā)表于 2019-6-5 14:42 | 顯示全部樓層
謝謝樓主,學(xué)習(xí)了
回復(fù)

使用道具 舉報

ID:379335 發(fā)表于 2019-6-27 19:32 | 顯示全部樓層
感謝樓主發(fā)布 學(xué)習(xí)了
回復(fù)

使用道具 舉報

ID:313854 發(fā)表于 2019-6-28 15:06 | 顯示全部樓層
謝謝分享,好資料
回復(fù)

使用道具 舉報

ID:578706 發(fā)表于 2019-8-24 14:34 | 顯示全部樓層
可以可以
回復(fù)

使用道具 舉報

ID:628823 發(fā)表于 2019-11-1 11:27 | 顯示全部樓層
資料不錯,謝謝!
回復(fù)

使用道具 舉報

ID:434663 發(fā)表于 2019-11-13 22:51 | 顯示全部樓層
我必須對你提出表揚和感謝,程序簡單易懂,注釋詳細!
謝謝你的無私奉獻!
回復(fù)

使用道具 舉報

ID:636592 發(fā)表于 2019-11-18 11:55 | 顯示全部樓層
學(xué)習(xí)了~
回復(fù)

使用道具 舉報

ID:387697 發(fā)表于 2020-3-16 17:37 | 顯示全部樓層
給力!
回復(fù)

使用道具 舉報

ID:721764 發(fā)表于 2020-4-16 17:21 | 顯示全部樓層
墻都不服,就服你
回復(fù)

使用道具 舉報

ID:402026 發(fā)表于 2020-4-19 22:26 | 顯示全部樓層
這個程序比較符合初學(xué)者,注解很仔細,很細心,真的很不錯,感謝你。
回復(fù)

使用道具 舉報

ID:718783 發(fā)表于 2020-4-21 13:04 | 顯示全部樓層
謝謝樓主,真心不錯
回復(fù)

使用道具 舉報

ID:502124 發(fā)表于 2022-12-12 10:13 | 顯示全部樓層
回復(fù)

使用道具 舉報

ID:1011444 發(fā)表于 2023-5-18 00:01 | 顯示全部樓層
點贊一個,三個例子說的詳細,學(xué)習(xí)了。
回復(fù)

使用道具 舉報

ID:641483 發(fā)表于 2023-5-22 11:56 | 顯示全部樓層
收藏了 謝謝樓主 寫的很詳細 感覺自己能看懂         很給力!
回復(fù)

使用道具 舉報

ID:891089 發(fā)表于 2023-6-25 14:25 來自手機 | 顯示全部樓層
謝謝好兄弟,問題解決了
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表