STC12C5A60S2_EEPROM

综述

没啥好说的,之前都没用过。

EEPROM涉及的寄存器

IAP_DATA_IAP_ADDRH_IAP_ADDRL

IAP_CMD

IAP_CONTR

IAP_TRIG

例子

eeprom.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include "eeprom.h"

void forSafety()
{
IAP_CONTR = 0;
IAP_CMD = 0;
IAP_TRIG = 0;
IAP_ADDRH = 0x80;
IAP_ADDRL = 0;

}

void eraseSector (unsigned char addr)
{

IAP_CONTR = ENABLE_IAP; //open IAP function and wait time
IAP_CMD = CMD_ERASE; //ERASE command
IAP_ADDRL = addr;
IAP_ADDRH = addr>>8;
IAP_TRIG = 0x5a; //start IAP
IAP_TRIG = 0xa5;

_nop_(); //mcu will wait here until EEPROM finish

forSafety();
}

void programByte(unsigned char addr,unsigned char dat)
{
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_PROGRAM; //Program command
IAP_ADDRL = addr;
IAP_ADDRH = addr>>8;
IAP_DATA = dat;
IAP_TRIG = 0x5a; //start IAP
IAP_TRIG = 0xa5;

_nop_(); //mcu will wait here until EEPROM finish

forSafety();
}
unsigned char readByte (unsigned char addr)
{

unsigned char dat;
IAP_CONTR = ENABLE_IAP; //open IAP function and wait time
IAP_CMD = CMD_READ; //read command
IAP_ADDRL = addr;
IAP_ADDRH = addr>>8;
IAP_TRIG = 0x5a; //start IAP
IAP_TRIG = 0xa5;

_nop_(); //mcu will wait here until EEPROM finish
dat = IAP_DATA;
forSafety();
return dat;
}

eeprom.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#ifndef __EEPROM_H
#define __EEPROM_H

#include <reg52.h>
#include <intrins.h>

sfr IAP_DATA = 0xc2;
sfr IAP_ADDRH = 0xc3;
sfr IAP_ADDRL = 0xc4;
sfr IAP_CMD = 0xc5;
sfr IAP_TRIG = 0xc6;
sfr IAP_CONTR = 0xc7;


#define CMD_IDLE 0
#define CMD_READ 1
#define CMD_PROGRAM 2
#define CMD_ERASE 3

#define ENABLE_IAP 0x83

#define IAP_ADDRESS 0x0000

void forSafety();
void eraseSector (unsigned char addr);
void programByte(unsigned char addr,unsigned char dat);
unsigned char readByte (unsigned char addr);
#endif


main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include "main.h"


void delay10ms(void)
{
unsigned char a,b;
for(b=202;b>0;b--)
for(a=147;a>0;a--);
}

void Init_UART()
{
SCON = 0x5a;
TMOD = 0x20;
AUXR = 0x40;
TH1 = TL1 = 0xfd; // 115200MHZ
TR1 = 1;
}

void send_UART(unsigned char dat)
{
while(!TI);
TI = 0;
SBUF = dat;

}


void main()
{
int i ;
Init_UART();
LED2 = 1;
LED1 = 0;
eraseSector(IAP_ADDRESS);

for(i = 0;i<512;i++)
{
if(readByte(IAP_ADDRESS+i)!=0xff)
{
LED2 = 0;
LED1 = 1;
}
}
delay10ms();

for(i = 0;i<512;i++)
{
programByte(IAP_ADDRESS+i,(unsigned char)i);
}
delay10ms();

for(i = 0;i<512;i++)
{
send_UART(readByte(IAP_ADDRESS+i));
}



while(1);
}

main.h

1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef __MAIN_H
#define __MAIN_H

#include <reg52.h>
#include "eeprom.h"

sbit LED1 = P3^0;
sbit LED2 = P3^1;
sfr AUXR = 0x8e;

#endif