单片机成长之路(51基础篇) - 021 STC89C51系列单片机 内部EEPROM 驱动
最近又看了一下关于stc单片机的知识,感觉在使用中EEPROM是个经常用到的东西,特地学习了一下,给大家分享一下心得,如有不足,多多包涵,废话不多说,一图解千言,先上图:
/*--------------------------------------------------------------分界线-----------------------------------------------------------------------------------*/
main_eepprom.c
1 #include <STC89C5xRC.H> 2 3 #ifdef EEPROM 4 #include "eeprom.h" 5 #endif 6 7 # define LEDALL P1 8 9 void Delay(int n){ 10 unsigned int x; 11 while (n--) { 12 x = 0; 13 while (++x); 14 } 15 } 16 17 void main(){ 18 char i; 19 unsigned char temp,temp0,temp1; 20 while (1){ 21 for(i=0; i<4; i++){ 22 temp0 = STC_EEPROM_assign_Read(0,0); 23 temp1 = STC_EEPROM_assign_Read(0,1); 24 temp = (temp0 %16)+((temp1/16)*16); 25 LEDALL = ~temp; 26 Delay(1); 27 temp = 0x11<<i; 28 temp0 = temp %16; 29 temp1 = (temp / 16)*16; 30 SCT_EEPROM_assign_Write(0,0,temp0); 31 SCT_EEPROM_assign_Write(0,1,temp1); 32 temp = 0; 33 } 34 } 35 }
Eeprom.h
1 /*-------------------------------------------------------------------------- 2 eeprom.h 3 4 --------------------------------------------------------------------------*/ 5 6 #ifndef __EEPROM_H__ 7 #define __EEPROM_H__ 8 #include "intrins.h" 9 10 /*声明与IAP相关的SFR寄存器 */ 11 sfr IAP_DATA = 0xE2; //闪存数据寄存器 12 sfr IAP_ADDRH = 0xE3; //Flash地址为HIGH 13 sfr IAP_ADDRL = 0xE4; //Flash地址为LOW 14 sfr IAP_CMD = 0xE5; //Flash命令寄存器 15 sfr IAP_TRIG = 0xE6; //Flash命令触发器 16 sfr IAP_CONTR = 0xE7; //闪存控制寄存器 17 /*宏定义 ISP/IAP/EEPROM 命令*/ 18 #define EEPROM_CMD_IDLE 0 //支持 19 #define EEPROM_CMD_READ 1 //字节读 20 #define EEPROM_CMD_PROGRAM 2 //字节编程 21 #define EEPROM_CMD_ERASE 3 //扇区擦除 22 /*IAP_CONTR定义ISP / IAP / EEPROM 时钟操作常量*/ 23 #define EEPROM_ENABLE_IAP 0x80 //开启IAP功能 24 //Clock 时钟配置 25 #define Clock_20M_40M 0x00 //if SYSCLK<40MHz 26 #define Clock_10M_20M 0x01 //if SYSCLK<20MHz 27 #define Clock_5M_10M 0x02 //if SYSCLK<10MHz 28 #define Clock_0M_5M 0x03 //if SYSCLK<5MHz 29 30 //EEPROM的起始地址 31 #define EEPROM_BASE_ADDRESS 0x0000 32 //STC89C51系列 33 #define STC89x51_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x01000 //STC89C/LE51 34 #define STC89x52_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x02000 //STC89C/LE52 35 #define STC89x53_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x03000 //STC89C/LE53 36 #define STC89x54_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x04000 //STC89C/LE54 37 #define STC89x58_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x08000 //STC89C/LE58 38 #define STC89x510_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x0A000 //STC89C/LE510 39 #define STC89x512_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x0C000 //STC89C/LE512 40 #define STC89x514_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x0E000 //STC89C/LE514 41 //STC89C51RC/RD+系列 42 #define STC89x51RC_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x01000 //STC89C/LE51RC/RD+ 43 #define STC89x52RC_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x02000 //STC89C/LE52RC/RD+ 44 #define STC89x54RC_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x04000 //STC89C/LE54RC/RD+ 45 #define STC89x58RC_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x08000 //STC89C/LE58RC/RD+ 46 #define STC89x510RC_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x0A000 //STC89C/LE510RC/RD+ 47 #define STC89x512RC_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x0C000 //STC89C/LE512RC/RD+ 48 #define STC89x514RC_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x0E000 //STC89C/LE514RC/RD+ 49 //STC90C51系列 50 #define STC90x51_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x01000 //STC90C/LE51 51 #define STC90x52_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x02000 //STC90C/LE52 52 #define STC90x54_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x04000 //STC90C/LE54 53 #define STC90x58_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x08000 //STC90C/LE58 54 #define STC90x510_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x0A000 //STC90C/LE510 55 #define STC90x512_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x0C000 //STC90C/LE512 56 #define STC90x514_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x0E000 //STC90C/LE514 57 //STC90C51RC/RD+系列 58 #define STC90x51RC_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x01000 //STC90C/LE51RC/RD+ 59 #define STC90x52RC_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x02000 //STC90C/LE52RC/RD+ 60 #define STC90x12RC_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x03000 //STC90C/LE52RC/RD+ 61 #define STC90x54RC_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x04000 //STC90C/LE54RC/RD+ 62 #define STC90x58RC_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x08000 //STC90C/LE58RC/RD+ 63 #define STC90x510RC_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x0A000 //STC90C/LE510RC/RD+ 64 #define STC90x512RC_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x0C000 //STC90C/LE512RC/RD+ 65 #define STC90x514RC_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x0E000 //STC90C/LE514RC/RD+ 66 //STC12xx052AD系列 67 #define STC12xx052AD_EEPROM_Start_ADDRESS EEPROM_BASE_ADDRESS+0x00000 //STC12xx052AD 68 69 70 //EEPROM SIZE 71 #define Sector_size 0x0200 72 //STC89C51系列 73 #define STC89x51_EEPROM_Sector_Number 18 74 #define STC89x52_EEPROM_Sector_Number 10 75 #define STC89x53_EEPROM_Sector_Number 4 76 #define STC89x54_EEPROM_Sector_Number 90 77 #define STC89x58_EEPROM_Sector_Number 58 78 #define STC89x510_EEPROM_Sector_Number 44 79 #define STC89x512_EEPROM_Sector_Number 28 80 #define STC89x514_EEPROM_Sector_Number 12 81 //STC89C51RC/RD+系列 82 #define STC89x51RC_EEPROM_Sector_Number 8 83 #define STC89x52RC_EEPROM_Sector_Number 8 84 #define STC89x54RC_EEPROM_Sector_Number 90 85 #define STC89x58RC_EEPROM_Sector_Number 58 86 #define STC89x510RC_EEPROM_Sector_Number 42 87 #define STC89x512RC_EEPROM_Sector_Number 26 88 #define STC89x514RC_EEPROM_Sector_Number 10 89 //STC90C51系列 90 #define STC90x51_EEPROM_Sector_Number 10 91 #define STC90x52_EEPROM_Sector_Number 10 92 #define STC90x54_EEPROM_Sector_Number 90 93 #define STC90x58_EEPROM_Sector_Number 58 94 #define STC90x510_EEPROM_Sector_Number 42 95 #define STC90x512_EEPROM_Sector_Number 26 96 #define STC90x514_EEPROM_Sector_Number 10 97 //STC89C51RC/RD+系列 98 #define STC90x51RC_EEPROM_Sector_Number 18 99 #define STC90x52RC_EEPROM_Sector_Number 10 100 #define STC90x12RC_EEPROM_Sector_Number 2 101 #define STC90x54RC_EEPROM_Sector_Number 90 102 #define STC90x58RC_EEPROM_Sector_Number 58 103 #define STC90x510RC_EEPROM_Sector_Number 42 104 #define STC90x512RC_EEPROM_Sector_Number 26 105 #define STC90x514RC_EEPROM_Sector_Number 10 106 107 //STC89C51RC/RD+系列 108 #define STC90x51RC_EEPROM_Sector_Number 18 109 #define STC90x52RC_EEPROM_Sector_Number 10 110 #define STC90x12RC_EEPROM_Sector_Number 2 111 #define STC90x54RC_EEPROM_Sector_Number 90 112 #define STC90x58RC_EEPROM_Sector_Number 58 113 #define STC90x510RC_EEPROM_Sector_Number 42 114 #define STC90x512RC_EEPROM_Sector_Number 26 115 #define STC90x514RC_EEPROM_Sector_Number 10 116 117 //STC12xx052AD系列 118 #define STC12xx052AD_EEPROM_Sector_Number 20 119 120 121 //EEPROM end 122 //STC89C51系列 123 #define STC89x51_EEPROM_End_ADDRESS STC89x51_EEPROM_Start_ADDRESS+Sector_size*(STC89x51_EEPROM_Sector_Number)-1 124 #define STC89x52_EEPROM_End_ADDRESS STC89x52_EEPROM_Start_ADDRESS+Sector_size*(STC89x52_EEPROM_Sector_Number)-1 125 #define STC89x53_EEPROM_End_ADDRESS STC89x53_EEPROM_Start_ADDRESS+Sector_size*(STC89x53_EEPROM_Sector_Number)-1 126 #define STC89x54_EEPROM_End_ADDRESS STC89x54_EEPROM_Start_ADDRESS+Sector_size*(STC89x54_EEPROM_Sector_Number)-1 127 #define STC89x58_EEPROM_End_ADDRESS STC89x58_EEPROM_Start_ADDRESS+Sector_size*(STC89x58_EEPROM_Sector_Number)-1 128 #define STC89x510_EEPROM_End_ADDRESS STC89x510_EEPROM_Start_ADDRESS+Sector_size*(STC89x510_EEPROM_Sector_Number)-1 129 #define STC89x512_EEPROM_End_ADDRESS STC89x512_EEPROM_Start_ADDRESS+Sector_size*(STC89x512_EEPROM_Sector_Number)-1 130 #define STC89x514_EEPROM_End_ADDRESS STC89x514_EEPROM_Start_ADDRESS+Sector_size*(STC89x514_EEPROM_Sector_Number)-1 131 //STC89C51RC/RD+系列 132 #define STC89x51RC_EEPROM_End_ADDRESS STC89x51RC_EEPROM_Start_ADDRESS+Sector_size*(STC89x51RC_EEPROM_Sector_Number)-1 133 #define STC89x52RC_EEPROM_End_ADDRESS STC89x52RC_EEPROM_Start_ADDRESS+Sector_size*(STC89x52RC_EEPROM_Sector_Number)-1 134 #define STC89x54RC_EEPROM_End_ADDRESS STC89x54RC_EEPROM_Start_ADDRESS+Sector_size*(STC89x54RC_EEPROM_Sector_Number)-1 135 #define STC89x58RC_EEPROM_End_ADDRESS STC89x58RC_EEPROM_Start_ADDRESS+Sector_size*(STC89x58RC_EEPROM_Sector_Number)-1 136 #define STC89x510RC_EEPROM_End_ADDRESS STC89x510RC_EEPROM_Start_ADDRESS+Sector_size*(STC89x510RC_EEPROM_Sector_Number)-1 137 #define STC89x512RC_EEPROM_End_ADDRESS STC89x512RC_EEPROM_Start_ADDRESS+Sector_size*(STC89x512RC_EEPROM_Sector_Number)-1 138 #define STC89x514RC_EEPROM_End_ADDRESS STC89x514RC_EEPROM_Start_ADDRESS+Sector_size*(STC89x514RC_EEPROM_Sector_Number)-1 139 //STC90C51系列 140 #define STC90x51_EEPROM_End_ADDRESS STC90x51_EEPROM_Start_ADDRESS+Sector_size*(STC90x51_EEPROM_Sector_Number)-1 141 #define STC90x52_EEPROM_End_ADDRESS STC90x52_EEPROM_Start_ADDRESS+Sector_size*(STC90x52_EEPROM_Sector_Number)-1 142 #define STC90x54_EEPROM_End_ADDRESS STC90x54_EEPROM_Start_ADDRESS+Sector_size*(STC90x54_EEPROM_Sector_Number)-1 143 #define STC90x58_EEPROM_End_ADDRESS STC90x58_EEPROM_Start_ADDRESS+Sector_size*(STC90x58_EEPROM_Sector_Number)-1 144 #define STC90x510_EEPROM_End_ADDRESS STC90x510_EEPROM_Start_ADDRESS+Sector_size*(STC90x510_EEPROM_Sector_Number)-1 145 #define STC90x512_EEPROM_End_ADDRESS STC90x512_EEPROM_Start_ADDRESS+Sector_size*(STC90x512_EEPROM_Sector_Number)-1 146 #define STC90x514_EEPROM_End_ADDRESS STC90x514_EEPROM_Start_ADDRESS+Sector_size*(STC90x514_EEPROM_Sector_Number)-1 147 //STC90C51RC/RD+系列 148 #define STC90x51RC_EEPROM_End_ADDRESS STC90x51RC_EEPROM_Start_ADDRESS+Sector_size*(STC90x51RC_EEPROM_Sector_Number)-1 149 #define STC90x52RC_EEPROM_End_ADDRESS STC90x52RC_EEPROM_Start_ADDRESS+Sector_size*(STC90x52RC_EEPROM_Sector_Number)-1 150 #define STC90x12RC_EEPROM_End_ADDRESS STC90x12RC_EEPROM_Start_ADDRESS+Sector_size*(STC90x12RC_EEPROM_Sector_Number)-1 151 #define STC90x54RC_EEPROM_End_ADDRESS STC90x54RC_EEPROM_Start_ADDRESS+Sector_size*(STC90x54RC_EEPROM_Sector_Number)-1 152 #define STC90x58RC_EEPROM_End_ADDRESS STC90x58RC_EEPROM_Start_ADDRESS+Sector_size*(STC90x58RC_EEPROM_Sector_Number)-1 153 #define STC90x510RC_EEPROM_End_ADDRESS STC90x510RC_EEPROM_Start_ADDRESS+Sector_size*(STC90x510RC_EEPROM_Sector_Number)-1 154 #define STC90x512RC_EEPROM_End_ADDRESS STC90x512RC_EEPROM_Start_ADDRESS+Sector_size*(STC90x512RC_EEPROM_Sector_Number)-1 155 #define STC90x514RC_EEPROM_End_ADDRESS STC90x514RC_EEPROM_Start_ADDRESS+Sector_size*(STC90x514RC_EEPROM_Sector_Number)-1 156 //STC12xx052AD系列 157 #define STC12xx052AD_EEPROM_End_ADDRESS STC12xx052AD_EEPROM_Start_ADDRESS+Sector_size*(STC12xx052AD_EEPROM_Sector_Number)-1 158 159 160 161 162 /*-----------set eeprom parameter-----------*/ 163 //STC89C51系列 164 #ifdef STC89x51 165 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 166 #define EEPROM_Start_ADDRESS STC89x51_EEPROM_Start_ADDRESS //eeprom起始地址 167 #define EEPROM_buf_ADDRESS STC89x51_EEPROM_Start_ADDRESS + Sector_size*(STC89x51_EEPROM_Sector_Number -1) //eeprom起始地址 168 #define EEPROM_end_ADDRESS STC89x51_EEPROM_End_ADDRESS //eeprom结束地址 169 #endif 170 #ifdef STC89x52 171 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 172 #define EEPROM_Start_ADDRESS STC89x52_EEPROM_Start_ADDRESS //eeprom起始地址 173 #define EEPROM_buf_ADDRESS STC89x52_EEPROM_Start_ADDRESS + Sector_size*(STC89x52_EEPROM_Sector_Number -1) //eeprom起始地址 174 #define EEPROM_end_ADDRESS STC89x52_EEPROM_End_ADDRESS //eeprom结束地址 175 #endif 176 #ifdef STC89x53 177 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 178 #define EEPROM_Start_ADDRESS STC89x53_EEPROM_Start_ADDRESS //eeprom起始地址 179 #define EEPROM_buf_ADDRESS STC89x53_EEPROM_Start_ADDRESS + Sector_size*(STC89x53_EEPROM_Sector_Number -1) //eeprom起始地址 180 #define EEPROM_end_ADDRESS STC89x53_EEPROM_End_ADDRESS //eeprom结束地址 181 #endif 182 #ifdef STC89x54 183 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 184 #define EEPROM_Start_ADDRESS STC89x54_EEPROM_Start_ADDRESS //eeprom起始地址 185 #define EEPROM_buf_ADDRESS STC89x54_EEPROM_Start_ADDRESS + Sector_size*(STC89x54_EEPROM_Sector_Number -1) //eeprom起始地址 186 #define EEPROM_end_ADDRESS STC89x54_EEPROM_End_ADDRESS //eeprom结束地址 187 #endif 188 #ifdef STC89x58 189 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 190 #define EEPROM_Start_ADDRESS STC89x58_EEPROM_Start_ADDRESS //eeprom起始地址 191 #define EEPROM_buf_ADDRESS STC89x58_EEPROM_Start_ADDRESS + Sector_size*(STC89x58_EEPROM_Sector_Number -1) //eeprom起始地址 192 #define EEPROM_end_ADDRESS STC89x58_EEPROM_End_ADDRESS //eeprom结束地址 193 #endif 194 #ifdef STC89x510 195 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 196 #define EEPROM_Start_ADDRESS STC89x510_EEPROM_Start_ADDRESS //eeprom起始地址 197 #define EEPROM_buf_ADDRESS STC89x510_EEPROM_Start_ADDRESS + Sector_size*(STC89x510_EEPROM_Sector_Number -1) //eeprom起始地址 198 #define EEPROM_end_ADDRESS STC89x510_EEPROM_End_ADDRESS //eeprom结束地址 199 #endif 200 #ifdef STC89x512 201 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 202 #define EEPROM_Start_ADDRESS STC89x512_EEPROM_Start_ADDRESS //eeprom起始地址 203 #define EEPROM_buf_ADDRESS STC89x512_EEPROM_Start_ADDRESS + Sector_size*(STC89x512_EEPROM_Sector_Number -1) //eeprom起始地址 204 #define EEPROM_end_ADDRESS STC89x512_EEPROM_End_ADDRESS //eeprom结束地址 205 #endif 206 #ifdef STC89x514 207 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 208 #define EEPROM_Start_ADDRESS STC89x514_EEPROM_Start_ADDRESS //eeprom起始地址 209 #define EEPROM_buf_ADDRESS STC89x514_EEPROM_Start_ADDRESS + Sector_size*(STC89x514_EEPROM_Sector_Number -1) //eeprom起始地址 210 #define EEPROM_end_ADDRESS STC89x514_EEPROM_End_ADDRESS //eeprom结束地址 211 #endif 212 //STC89C51RC系列 213 #ifdef STC89x51RC 214 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 215 #define EEPROM_Start_ADDRESS STC89x51RC_EEPROM_Start_ADDRESS //eeprom起始地址 216 #define EEPROM_buf_ADDRESS STC89x51RC_EEPROM_Start_ADDRESS + Sector_size*(STC89x51RC_EEPROM_Sector_Number -1) //eeprom起始地址 217 #define EEPROM_end_ADDRESS STC89x51RC_EEPROM_End_ADDRESS //eeprom结束地址 218 #endif 219 #ifdef STC89x52RC 220 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 221 #define EEPROM_Start_ADDRESS STC89x52RC_EEPROM_Start_ADDRESS //eeprom起始地址 222 #define EEPROM_buf_ADDRESS STC89x52RC_EEPROM_Start_ADDRESS + Sector_size*(STC89x52RC_EEPROM_Sector_Number -1) //eeprom起始地址 223 #define EEPROM_end_ADDRESS STC89x52RC_EEPROM_End_ADDRESS //eeprom结束地址 224 #endif 225 #ifdef STC89x54RC 226 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 227 #define EEPROM_Start_ADDRESS STC89x54RC_EEPROM_Start_ADDRESS //eeprom起始地址 228 #define EEPROM_buf_ADDRESS STC89x54RC_EEPROM_Start_ADDRESS + Sector_size*(STC89x54RC_EEPROM_Sector_Number -1) //eeprom起始地址 229 #define EEPROM_end_ADDRESS STC89x54RC_EEPROM_End_ADDRESS //eeprom结束地址 230 #endif 231 #ifdef STC89x58RC 232 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 233 #define EEPROM_Start_ADDRESS STC89x58RC_EEPROM_Start_ADDRESS //eeprom起始地址 234 #define EEPROM_buf_ADDRESS STC89x58RC_EEPROM_Start_ADDRESS + Sector_size*(STC89x58RC_EEPROM_Sector_Number -1) //eeprom起始地址 235 #define EEPROM_end_ADDRESS STC89x58RC_EEPROM_End_ADDRESS //eeprom结束地址 236 #endif 237 #ifdef STC89x510RC 238 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 239 #define EEPROM_Start_ADDRESS STC89x510RC_EEPROM_Start_ADDRESS //eeprom起始地址 240 #define EEPROM_buf_ADDRESS STC89x510RC_EEPROM_Start_ADDRESS + Sector_size*(STC89x510RC_EEPROM_Sector_Number -1) //eeprom起始地址 241 #define EEPROM_end_ADDRESS STC89x510RC_EEPROM_End_ADDRESS //eeprom结束地址 242 #endif 243 #ifdef STC89x512RC 244 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 245 #define EEPROM_Start_ADDRESS STC89x512RC_EEPROM_Start_ADDRESS //eeprom起始地址 246 #define EEPROM_buf_ADDRESS STC89x512RC_EEPROM_Start_ADDRESS + Sector_size*(STC89x512RC_EEPROM_Sector_Number -1) //eeprom起始地址 247 #define EEPROM_end_ADDRESS STC89x512RC_EEPROM_End_ADDRESS //eeprom结束地址 248 #endif 249 #ifdef STC89x514RC 250 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 251 #define EEPROM_Start_ADDRESS STC89x514RC_EEPROM_Start_ADDRESS //eeprom起始地址 252 #define EEPROM_buf_ADDRESS STC89x514RC_EEPROM_Start_ADDRESS + Sector_size*(STC89x514RC_EEPROM_Sector_Number -1) //eeprom起始地址 253 #define EEPROM_end_ADDRESS STC89x514RC_EEPROM_End_ADDRESS //eeprom结束地址 254 #endif 255 //STC90C51系列 256 #ifdef STC90x51 257 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 258 #define EEPROM_Start_ADDRESS STC90x51_EEPROM_Start_ADDRESS //eeprom起始地址 259 #define EEPROM_buf_ADDRESS STC90x51_EEPROM_Start_ADDRESS + Sector_size*(STC90x51_EEPROM_Sector_Number -1) //eeprom起始地址 260 #define EEPROM_end_ADDRESS STC90x51_EEPROM_End_ADDRESS //eeprom结束地址 261 #endif 262 #ifdef STC90x52 263 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 264 #define EEPROM_Start_ADDRESS STC90x52_EEPROM_Start_ADDRESS //eeprom起始地址 265 #define EEPROM_buf_ADDRESS STC90x52_EEPROM_Start_ADDRESS + Sector_size*(STC90x52_EEPROM_Sector_Number -1) //eeprom起始地址 266 #define EEPROM_end_ADDRESS STC90x52_EEPROM_End_ADDRESS //eeprom结束地址 267 #endif 268 #ifdef STC90x54 269 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 270 #define EEPROM_Start_ADDRESS STC90x54_EEPROM_Start_ADDRESS //eeprom起始地址 271 #define EEPROM_buf_ADDRESS STC90x54_EEPROM_Start_ADDRESS + Sector_size*(STC90x54_EEPROM_Sector_Number -1) //eeprom起始地址 272 #define EEPROM_end_ADDRESS STC90x54_EEPROM_End_ADDRESS //eeprom结束地址 273 #endif 274 #ifdef STC90x58 275 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 276 #define EEPROM_Start_ADDRESS STC90x58_EEPROM_Start_ADDRESS //eeprom起始地址 277 #define EEPROM_buf_ADDRESS STC90x58_EEPROM_Start_ADDRESS + Sector_size*(STC90x58_EEPROM_Sector_Number -1) //eeprom起始地址 278 #define EEPROM_end_ADDRESS STC90x58_EEPROM_End_ADDRESS //eeprom结束地址 279 #endif 280 #ifdef STC90x510 281 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 282 #define EEPROM_Start_ADDRESS STC90x510_EEPROM_Start_ADDRESS //eeprom起始地址 283 #define EEPROM_buf_ADDRESS STC90x510_EEPROM_Start_ADDRESS + Sector_size*(STC90x510_EEPROM_Sector_Number -1) //eeprom起始地址 284 #define EEPROM_end_ADDRESS STC90x510_EEPROM_End_ADDRESS //eeprom结束地址 285 #endif 286 #ifdef STC90x512 287 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 288 #define EEPROM_Start_ADDRESS STC90x512_EEPROM_Start_ADDRESS //eeprom起始地址 289 #define EEPROM_buf_ADDRESS STC90x512_EEPROM_Start_ADDRESS + Sector_size*(STC90x512_EEPROM_Sector_Number -1) //eeprom起始地址 290 #define EEPROM_end_ADDRESS STC90x512_EEPROM_End_ADDRESS //eeprom结束地址 291 #endif 292 #ifdef STC90x514 293 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 294 #define EEPROM_Start_ADDRESS STC90x514_EEPROM_Start_ADDRESS //eeprom起始地址 295 #define EEPROM_buf_ADDRESS STC90x514_EEPROM_Start_ADDRESS + Sector_size*(STC90x514_EEPROM_Sector_Number -1) //eeprom起始地址 296 #define EEPROM_end_ADDRESS STC90x514_EEPROM_End_ADDRESS //eeprom结束地址 297 #endif 298 //STC90C51RC系列 299 #ifdef STC90x51RC 300 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 301 #define EEPROM_Start_ADDRESS STC90x51RC_EEPROM_Start_ADDRESS //eeprom起始地址 302 #define EEPROM_buf_ADDRESS STC90x51RC_EEPROM_Start_ADDRESS + Sector_size*(STC90x51RC_EEPROM_Sector_Number -1) //eeprom起始地址 303 #define EEPROM_end_ADDRESS STC90x51RC_EEPROM_End_ADDRESS //eeprom结束地址 304 #endif 305 #ifdef STC90x52RC 306 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 307 #define EEPROM_Start_ADDRESS STC90x52RC_EEPROM_Start_ADDRESS //eeprom起始地址 308 #define EEPROM_buf_ADDRESS STC90x52RC_EEPROM_Start_ADDRESS + Sector_size*(STC90x52RC_EEPROM_Sector_Number -1) //eeprom起始地址 309 #define EEPROM_end_ADDRESS STC90x52RC_EEPROM_End_ADDRESS //eeprom结束地址 310 #endif 311 #ifdef STC90x12RC 312 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 313 #define EEPROM_Start_ADDRESS STC90x12RC_EEPROM_Start_ADDRESS //eeprom起始地址 314 #define EEPROM_buf_ADDRESS STC90x12RC_EEPROM_Start_ADDRESS + Sector_size*(STC90x12RC_EEPROM_Sector_Number -1) //eeprom起始地址 315 #define EEPROM_end_ADDRESS STC90x12RC_EEPROM_End_ADDRESS //eeprom结束地址 316 #endif 317 #ifdef STC90x54RC 318 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 319 #define EEPROM_Start_ADDRESS STC90x54RC_EEPROM_Start_ADDRESS //eeprom起始地址 320 #define EEPROM_buf_ADDRESS STC90x54RC_EEPROM_Start_ADDRESS + Sector_size*(STC89x54RC_EEPROM_Sector_Number -1) //eeprom起始地址 321 #define EEPROM_end_ADDRESS STC90x54RC_EEPROM_End_ADDRESS //eeprom结束地址 322 #endif 323 #ifdef STC90x58RC 324 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 325 #define EEPROM_Start_ADDRESS STC90x58RC_EEPROM_Start_ADDRESS //eeprom起始地址 326 #define EEPROM_buf_ADDRESS STC90x58RC_EEPROM_Start_ADDRESS + Sector_size*(STC89x58RC_EEPROM_Sector_Number -1) //eeprom起始地址 327 #define EEPROM_end_ADDRESS STC90x58RC_EEPROM_End_ADDRESS //eeprom结束地址 328 #endif 329 #ifdef STC90x510RC 330 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 331 #define EEPROM_Start_ADDRESS STC90x510RC_EEPROM_Start_ADDRESS //eeprom起始地址 332 #define EEPROM_buf_ADDRESS STC90x510RC_EEPROM_Start_ADDRESS + Sector_size*(STC89x510RC_EEPROM_Sector_Number -1) //eeprom起始地址 333 #define EEPROM_end_ADDRESS STC90x510RC_EEPROM_End_ADDRESS //eeprom结束地址 334 #endif 335 #ifdef STC90x512RC 336 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 337 #define EEPROM_Start_ADDRESS STC90x512RC_EEPROM_Start_ADDRESS //eeprom起始地址 338 #define EEPROM_buf_ADDRESS STC90x512RC_EEPROM_Start_ADDRESS + Sector_size*(STC89x512RC_EEPROM_Sector_Number -1) //eeprom起始地址 339 #define EEPROM_end_ADDRESS STC90x512RC_EEPROM_End_ADDRESS //eeprom结束地址 340 #endif 341 #ifdef STC90x514RC 342 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 343 #define EEPROM_Start_ADDRESS STC90x514RC_EEPROM_Start_ADDRESS //eeprom起始地址 344 #define EEPROM_buf_ADDRESS STC90x514RC_EEPROM_Start_ADDRESS + Sector_size*(STC90x514RC_EEPROM_Sector_Number -1) //eeprom起始地址 345 #define EEPROM_end_ADDRESS STC90x514RC_EEPROM_End_ADDRESS //eeprom结束地址 346 #endif 347 //STC12xx052AD系列 348 #if defined(STC12xx052AD) || defined(STC12x1052AD) || defined(STC12x2052AD) || defined(STC12x4052AD) || defined(STC12x5052AD) 349 #define ENABLE_EEPROM EEPROM_ENABLE_IAP+Clock_10M_20M //开启IAP,配置时钟 350 #define EEPROM_Start_ADDRESS STC12xx052AD_EEPROM_Start_ADDRESS //eeprom起始地址 351 #define EEPROM_buf_ADDRESS STC12xx052AD_EEPROM_Start_ADDRESS + Sector_size*(STC12xx052AD_EEPROM_Sector_Number -1) //eeprom起始地址 352 #define EEPROM_end_ADDRESS STC12xx052AD_EEPROM_End_ADDRESS //eeprom结束地址 353 #endif 354 355 356 /*----------------函数-----------------*/ 357 /*-----------eeprom------------*/ 358 //Eeprom_Unlock(解锁) 359 void Eeprom_Unlock(void); 360 //Eeprom_Locked(上锁) 361 void Eeprom_Locked(void); 362 //Eeprom_Effective(配置生效) 363 void Eeprom_Effective(void); 364 //EEPROM区域读取一个字节 365 unsigned char EEPROM_Read_Byte(unsigned int addr); 366 //将一个字节编程到EEPROM区域 367 void EEPROM_Write_Byte(unsigned int addr, unsigned char dat); 368 //擦除一个扇区 369 void EEPROM_Erase_sector(unsigned int addr); 370 //读取指定地址数据 371 unsigned char EEPROM_assign_Read(unsigned char Sector,unsigned int position); 372 //写入指定地址数据 373 void EEPROM_assign_Write(unsigned char Sector,unsigned int position,unsigned char value); 374 /************************************************************/ 375 //字节对比 376 bit Compared(unsigned char Evalue,unsigned char value); 377 //stc 读取指定地址数据 378 unsigned char STC_EEPROM_assign_Read(unsigned char Sector,unsigned int position); 379 //stc 写入指定地址数据 380 void SCT_EEPROM_assign_Write(unsigned char Sector,unsigned int position,unsigned char value); 381 382 383 #endif
Eeprom.c
1 #include "eeprom.h" 2 3 /*-----------eeprom------------*/ 4 //------------------------------- 5 //Eeprom_Unlock(解锁) 6 //Input: on 7 //Output:on 8 //------------------------------- 9 void Eeprom_Unlock(void) 10 { 11 IAP_CONTR = ENABLE_EEPROM; //打开IAP功能,并设置等待时间 12 } 13 //------------------------------- 14 //Eeprom_Locked(上锁) 15 //Input: on 16 //Output:on 17 //------------------------------- 18 void Eeprom_Locked(void) 19 { 20 IAP_CONTR = 0; //关闭IAP功能 21 IAP_CMD = 0; //清除命令到待机状态 22 IAP_TRIG = 0; //清除触发寄存器 23 IAP_ADDRH = 0x80; //数据ptr指向非EEPROM区域 24 IAP_ADDRL = 0; //清除IAP地址以防止滥用 25 } 26 //------------------------------- 27 //Eeprom_Effective(配置生效) 28 //Input: on 29 //Output:on 30 //------------------------------- 31 void Eeprom_Effective(void) 32 { 33 IAP_TRIG = 0x46; //发送触发器命令1(0x46) 34 IAP_TRIG = 0xb9; //发送触发器命令2(0xb9) 35 _nop_(); //MCU将保持在此处,直到ISP / IAP / EEPROM操作完成 36 } 37 //------------------------------- 38 //EEPROM区域读取一个字节 39 //Input: addr 16位EEPROM地址 40 //Output:on 41 //------------------------------- 42 unsigned char EEPROM_Read_Byte(unsigned int addr) 43 { 44 unsigned char dat; //数据缓冲区 45 Eeprom_Unlock(); 46 IAP_CMD = EEPROM_CMD_READ; //设置ISP / IAP / EEPROM READ命令 47 IAP_ADDRL = addr; //将ISP / IAP / EEPROM地址低8位设置 48 IAP_ADDRH = addr >> 8; //将ISP / IAP / EEPROM地址高8位设置 49 Eeprom_Effective(); //生效 50 dat = IAP_DATA; //读取ISP / IAP / EEPROM数据 51 Eeprom_Locked(); //关闭ISP / IAP / EEPROM功能 52 return dat; //返回Flash数据 53 } 54 //------------------------------- 55 //将一个字节编程到EEPROM区域 56 //Input: addr 16位EEPROM地址 57 // value 8位数据 58 //Output:on 59 //------------------------------- 60 void EEPROM_Write_Byte(unsigned int addr, unsigned char value) 61 { 62 Eeprom_Unlock(); 63 IAP_CMD = EEPROM_CMD_PROGRAM; //设置EEPROM PROGRAM命令 64 IAP_ADDRL = addr; //将EEPROM地址低8位设置 65 IAP_ADDRH = addr >> 8; //将EEPROM地址高8位设置 66 IAP_DATA = value; //数据写入寄存器 67 Eeprom_Effective(); //生效 68 Eeprom_Locked(); 69 } 70 //------------------------------- 71 //擦除EEPROM一个扇区 72 //Input: addr 16位EEPROM地址 73 //Output:on 74 //------------------------------- 75 void EEPROM_Erase_sector(unsigned int addr) 76 { 77 Eeprom_Unlock(); 78 IAP_CMD = EEPROM_CMD_ERASE; //Set ISP/IAP/EEPROM ERASE command 79 IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low 80 IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high 81 Eeprom_Effective(); //生效 82 Eeprom_Locked(); 83 } 84 //------------------------------- 85 //读取指定地址数据 86 //Input: Sector 扇区编号 87 // position 扇区内相对地址 88 //Output:指定位置的数据 89 //------------------------------- 90 unsigned char EEPROM_assign_Read(unsigned char Sector,unsigned int position){ 91 return EEPROM_Read_Byte(EEPROM_Start_ADDRESS + Sector*Sector_size + position); 92 } 93 //------------------------------- 94 //写入指定地址数据 95 //Input: Sector 扇区编号 96 // position 扇区内相对地址 97 // value 写入指定位置的数据 98 //Output:on 99 //------------------------------- 100 void EEPROM_assign_Write(unsigned char Sector,unsigned int position,unsigned char value){ 101 EEPROM_Write_Byte(EEPROM_Start_ADDRESS + Sector*Sector_size + position,value); //鉴定是否需要擦除 102 } 103 /*--------------------------------------------------------------------*/ 104 //------------------------------- 105 //写入指定地址数据 106 //Input: Evalue EEPROM读取的数据 107 // value 新的数据 108 //Output:0 符合,直接写入 109 // 1要进行数据处理 110 //------------------------------- 111 bit Compared(unsigned char Evalue,unsigned char value){ 112 unsigned char i; 113 unsigned char date = 0; 114 bit Ev; 115 bit V; 116 for(i = 0; i < 8; i++){ 117 Ev = (Evalue & (0x01 << i)); 118 V = (value & (0x01 << i)); 119 if((Ev == 0)&&(V == 1))return 1; 120 } 121 return 0; 122 } 123 //------------------------------- 124 //stc 读取指定地址数据 125 //Input: Sector 扇区编号 126 // position 扇区内相对地址 127 //Output:指定位置的数据 128 //------------------------------- 129 unsigned char STC_EEPROM_assign_Read(unsigned char Sector,unsigned int position){ 130 return EEPROM_assign_Read(Sector,position); 131 } 132 //stc 写入指定地址数据(根据STC单片机特点,对EEPROM写入进行特别的处理) 133 void SCT_EEPROM_assign_Write(unsigned char Sector,unsigned int position,unsigned char value){ 134 int count; 135 if(0 == Compared(STC_EEPROM_assign_Read(Sector,position),value))EEPROM_assign_Write(Sector,position,value); //鉴定是否需要擦除 136 else { 137 EEPROM_Erase_sector(EEPROM_buf_ADDRESS); //清洗EEPROM缓存区 138 for(count = 0; count < Sector_size;count++){ 139 if(position == count)EEPROM_Write_Byte( EEPROM_buf_ADDRESS+position,value); //替换数据 140 else EEPROM_Write_Byte(EEPROM_buf_ADDRESS + count,EEPROM_assign_Read(Sector,count)); //复制数据 141 } 142 EEPROM_Erase_sector(EEPROM_Start_ADDRESS + Sector*Sector_size); //擦除一个扇区(起始地址) 143 for(count = 0; count < Sector_size;count++)EEPROM_assign_Write(Sector,count,EEPROM_Read_Byte(EEPROM_buf_ADDRESS + count)); 144 } 145 }
本代码支持只stc89/90系列自带EEPROM的单片机。