1 | ;/*------------------------------------------------------------------*/
|
2 | ;/* --- STC MCU Limited ---------------------------------------------*/
|
3 | ;/* --- STC12C5Axx Series MCU ISP/IAP/EEPROM Demo -------------------*/
|
4 | ;/* --- Web: www.STCMCU.com -----------------------------------------*/
|
5 | ;/* If you want to use the program or the program referenced in the */
|
6 | ;/* article, please specify in which data and procedures from STC */
|
7 | ;/*------------------------------------------------------------------*/
|
8 |
|
9 | ;/*Declare SFR associated with the IAP */
|
10 | IAP_DATA EQU 0C2H ;Flash data register
|
11 | IAP_ADDRH EQU 0C3H ;Flash address HIGH
|
12 | IAP_ADDRL EQU 0C4H ;Flash address LOW
|
13 | IAP_CMD EQU 0C5H ;Flash command register
|
14 | IAP_TRIG EQU 0C6H ;Flash command trigger
|
15 | IAP_CONTR EQU 0C7H ;Flash control register
|
16 |
|
17 | ;/*Define ISP/IAP/EEPROM command*/
|
18 | CMD_IDLE EQU 0 ;Stand-By
|
19 | CMD_READ EQU 1 ;Byte-Read
|
20 | CMD_PROGRAM EQU 2 ;Byte-Program
|
21 | CMD_ERASE EQU 3 ;Sector-Erase
|
22 |
|
23 | ;/*Define ISP/IAP/EEPROM operation const for IAP_CONTR*/
|
24 | ENABLE_IAP EQU 82H ;if SYSCLK<20MHz
|
25 |
|
26 | ;//Start address for STC12C5Axx EEPROM
|
27 | IAP_ADDRESS EQU 0400H
|
28 | ;-----------------------------------------
|
29 | ORG 0000H
|
30 | LJMP MAIN
|
31 | ;-----------------------------------------
|
32 | ORG 0100H
|
33 | MAIN:
|
34 | MOV P1,#0FEH ;1111,1110 System Reset OK
|
35 | LCALL DELAY ;Delay
|
36 | ;-------------------------------
|
37 | MOV DPTR,#IAP_ADDRESS ;Set ISP/IAP/EEPROM address
|
38 | LCALL IAP_ERASE ;Erase current sector
|
39 | ;-------------------------------
|
40 | MOV DPTR,#IAP_ADDRESS ;Set ISP/IAP/EEPROM address
|
41 | MOV R0,#128 ;Set counter (512)
|
42 | MOV R1,#4
|
43 | CHECK1: ;Check whether all sector data is FF
|
44 | LCALL IAP_READ ;Read Flash
|
45 | CJNE A,#0FFH,ERROR ;If error, break
|
46 | INC DPTR ;Inc Flash address
|
47 | DJNZ R0,CHECK1 ;Check next
|
48 | DJNZ R1,CHECK1 ;Check next
|
49 | ;-------------------------------
|
50 | MOV P1,#0FCH ;1111,1100 Erase successful
|
51 | LCALL DELAY ;Delay
|
52 | ;-------------------------------
|
53 | MOV DPTR,#IAP_ADDRESS ;Set ISP/IAP/EEPROM address
|
54 | MOV R0,#128 ;Set counter (512)
|
55 | MOV R1,#4
|
56 | MOV R2,#0 ;Initial test data
|
57 | NEXT: ;Program 512 bytes data into data flash
|
58 | MOV A,R2 ;Ready IAP data
|
59 | LCALL IAP_PROGRAM ;Program flash
|
60 | INC DPTR ;Inc Flash address
|
61 | INC R2 ;Modify test data
|
62 | DJNZ R0,NEXT ;Program next
|
63 | DJNZ R1,NEXT ;Program next
|
64 | ;-------------------------------
|
65 | MOV P1,#0F8H ;1111,1000 Program successful
|
66 | LCALL DELAY ;Delay
|
67 | ;-------------------------------
|
68 | MOV DPTR,#IAP_ADDRESS ;Set ISP/IAP/EEPROM address
|
69 | MOV R0,#0 ;Set counter (512)
|
70 | MOV R1,#2
|
71 | MOV R2,#0
|
72 | CHECK2: ;Verify 512 bytes data
|
73 | LCALL IAP_READ ;Read Flash
|
74 | CJNE A,2,ERROR ;If error, break
|
75 | INC DPTR ;Inc Flash address
|
76 | INC R2 ;Modify verify data
|
77 | DJNZ R0,CHECK2 ;Check next
|
78 | DJNZ R1,CHECK2 ;Check next
|
79 | ;-------------------------------
|
80 | MOV P1,#0F0H ;1111,0000 Verify successful
|
81 | SJMP $
|
82 | ;-------------------------------
|
83 | ERROR:
|
84 | MOV P0,R0
|
85 | MOV P2,R1
|
86 | MOV P3,R2
|
87 | CLR P1.7 ;0xxx,xxxx IAP operation fail
|
88 | SJMP $
|
89 |
|
90 | ;/*----------------------------
|
91 | ;Software delay function
|
92 | ;----------------------------*/
|
93 | DELAY:
|
94 | CLR A
|
95 | MOV R0,A
|
96 | MOV R1,A
|
97 | MOV R2,#20H
|
98 | DELAY1:
|
99 | DJNZ R0,DELAY1
|
100 | DJNZ R1,DELAY1
|
101 | DJNZ R2,DELAY1
|
102 | RET
|
103 |
|
104 | ;/*----------------------------
|
105 | ;Disable ISP/IAP/EEPROM function
|
106 | ;Make MCU in a safe state
|
107 | ;----------------------------*/
|
108 | IAP_IDLE:
|
109 | MOV IAP_CONTR,#0 ;Close IAP function
|
110 | MOV IAP_CMD,#0 ;Clear command to standby
|
111 | MOV IAP_TRIG,#0 ;Clear trigger register
|
112 | MOV IAP_ADDRH,#80H ;Data ptr point to non-EEPROM area
|
113 | MOV IAP_ADDRL,#0 ;Clear IAP address to prevent misuse
|
114 | RET
|
115 |
|
116 | ;/*----------------------------
|
117 | ;Read one byte from ISP/IAP/EEPROM area
|
118 | ;Input: DPTR(ISP/IAP/EEPROM address)
|
119 | ;Output:ACC (Flash data)
|
120 | ;----------------------------*/
|
121 | IAP_READ:
|
122 | MOV IAP_CONTR,#ENABLE_IAP ;Open IAP function, and set wait time
|
123 | MOV IAP_CMD,#CMD_READ ;Set ISP/IAP/EEPROM READ command
|
124 | MOV IAP_ADDRL,DPL ;Set ISP/IAP/EEPROM address low
|
125 | MOV IAP_ADDRH,DPH ;Set ISP/IAP/EEPROM address high
|
126 | MOV IAP_TRIG,#5AH ;Send trigger command1 (0x5a)
|
127 | MOV IAP_TRIG,#0A5H ;Send trigger command2 (0xa5)
|
128 | NOP ;MCU will hold here until ISP/IAP/EEPROM operation complete
|
129 | MOV A,IAP_DATA ;Read ISP/IAP/EEPROM data
|
130 | LCALL IAP_IDLE ;Close ISP/IAP/EEPROM function
|
131 | RET
|
132 |
|
133 | ;/*----------------------------
|
134 | ;Program one byte to ISP/IAP/EEPROM area
|
135 | ;Input: DPAT(ISP/IAP/EEPROM address)
|
136 | ; ACC (ISP/IAP/EEPROM data)
|
137 | ;Output:-
|
138 | ;----------------------------*/
|
139 | IAP_PROGRAM:
|
140 | MOV IAP_CONTR,#ENABLE_IAP ;Open IAP function, and set wait time
|
141 | MOV IAP_CMD,#CMD_PROGRAM ;Set ISP/IAP/EEPROM PROGRAM command
|
142 | MOV IAP_ADDRL,DPL ;Set ISP/IAP/EEPROM address low
|
143 | MOV IAP_ADDRH,DPH ;Set ISP/IAP/EEPROM address high
|
144 | MOV IAP_DATA,A ;Write ISP/IAP/EEPROM data
|
145 | MOV IAP_TRIG,#5AH ;Send trigger command1 (0x5a)
|
146 | MOV IAP_TRIG,#0A5H ;Send trigger command2 (0xa5)
|
147 | NOP ;MCU will hold here until ISP/IAP/EEPROM operation complete
|
148 | LCALL IAP_IDLE ;Close ISP/IAP/EEPROM function
|
149 | RET
|
150 |
|
151 | ;/*----------------------------
|
152 | ;Erase one sector area
|
153 | ;Input: DPTR(ISP/IAP/EEPROM address)
|
154 | ;Output:-
|
155 | ;----------------------------*/
|
156 | IAP_ERASE:
|
157 | MOV IAP_CONTR,#ENABLE_IAP ;Open IAP function, and set wait time
|
158 | MOV IAP_CMD,#CMD_ERASE ;Set ISP/IAP/EEPROM ERASE command
|
159 | MOV IAP_ADDRL,DPL ;Set ISP/IAP/EEPROM address low
|
160 | MOV IAP_ADDRH,DPH ;Set ISP/IAP/EEPROM address high
|
161 | MOV IAP_TRIG,#5AH ;Send trigger command1 (0x5a)
|
162 | MOV IAP_TRIG,#0A5H ;Send trigger command2 (0xa5)
|
163 | NOP ;MCU will hold here until ISP/IAP/EEPROM operation complete
|
164 | LCALL IAP_IDLE ;Close ISP/IAP/EEPROM function
|
165 | RET
|
166 |
|
167 | END
|