diff --git a/MCU/MCU_REAL _FINAL/MCU_1.uvopt b/MCU/MCU_REAL _FINAL/MCU_1.uvopt index 2dd09f6..b06f386 100644 --- a/MCU/MCU_REAL _FINAL/MCU_1.uvopt +++ b/MCU/MCU_REAL _FINAL/MCU_1.uvopt @@ -281,6 +281,18 @@ 0 0 + + 1 + 7 + 1 + 0 + 0 + 0 + .\eeprom.c + eeprom.c + 0 + 0 + @@ -291,7 +303,7 @@ 0 2 - 7 + 8 5 0 0 @@ -303,7 +315,7 @@ 2 - 8 + 9 5 0 0 @@ -315,7 +327,7 @@ 2 - 9 + 10 5 0 0 @@ -327,7 +339,7 @@ 2 - 10 + 11 5 0 0 @@ -339,7 +351,7 @@ 2 - 11 + 12 5 0 0 @@ -351,7 +363,7 @@ 2 - 12 + 13 5 0 0 @@ -363,7 +375,7 @@ 2 - 13 + 14 5 0 0 @@ -375,7 +387,7 @@ 2 - 14 + 15 5 0 0 @@ -385,6 +397,18 @@ 0 0 + + 2 + 16 + 5 + 0 + 0 + 0 + .\eeprom.h + eeprom.h + 0 + 0 + diff --git a/MCU/MCU_REAL _FINAL/MCU_1.uvproj b/MCU/MCU_REAL _FINAL/MCU_1.uvproj index 6e0a1ba..504d171 100644 --- a/MCU/MCU_REAL _FINAL/MCU_1.uvproj +++ b/MCU/MCU_REAL _FINAL/MCU_1.uvproj @@ -406,6 +406,11 @@ 1 .\block.c + + eeprom.c + 1 + .\eeprom.c + @@ -451,6 +456,11 @@ 5 ..\MCU_5 _Wave_Generate\delay.h + + eeprom.h + 5 + .\eeprom.h + diff --git a/MCU/MCU_REAL _FINAL/eeprom.c b/MCU/MCU_REAL _FINAL/eeprom.c new file mode 100644 index 0000000..4063b32 --- /dev/null +++ b/MCU/MCU_REAL _FINAL/eeprom.c @@ -0,0 +1,88 @@ +/*------------------------------------------------------------------*/ +/* --- STC MCU Limited ---------------------------------------------*/ +/* --- STC89-90xx Series MCU ISP/IAP/EEPROM Demo -------------------*/ +/* --- Mobile: (86)13922805190 -------------------------------------*/ +/* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/ +/* --- Tel: 86-0513-55012928,55012929,55012966----------------------*/ +/* --- Web: www.STCMCU.com -----------------------------------------*/ +/* --- Web: www.GXWMCU.com -----------------------------------------*/ +/* If you want to use the program or the program referenced in the */ +/* article, please specify in which data and procedures from STC */ +/*------------------------------------------------------------------*/ + +#include "reg51.h" +#include "intrins.h" +#include "eeprom.h" + + +/*---------------------------- +Disable ISP/IAP/EEPROM function +Make MCU in a safe state +----------------------------*/ +void IapIdle() +{ + IAP_CONTR = 0; //Close IAP function + IAP_CMD = 0; //Clear command to standby + IAP_TRIG = 0; //Clear trigger register + IAP_ADDRH = 0x80; //Data ptr point to non-EEPROM area + IAP_ADDRL = 0; //Clear IAP address to prevent misuse +} + +/*---------------------------- +Read one byte from ISP/IAP/EEPROM area +Input: addr (ISP/IAP/EEPROM address) +Output:Flash data +----------------------------*/ +BYTE IapReadByte(WORD addr) +{ + BYTE dat; //Data buffer + + IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time + IAP_CMD = CMD_READ; //Set ISP/IAP/EEPROM READ command + IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low + IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high + IAP_TRIG = 0x46; //Send trigger command1 (0x46) + IAP_TRIG = 0xb9; //Send trigger command2 (0xb9) + _nop_(); //MCU will hold here until ISP/IAP/EEPROM operation complete + dat = IAP_DATA; //Read ISP/IAP/EEPROM data + IapIdle(); //Close ISP/IAP/EEPROM function + + return dat; //Return Flash data +} + +/*---------------------------- +Program one byte to ISP/IAP/EEPROM area +Input: addr (ISP/IAP/EEPROM address) + dat (ISP/IAP/EEPROM data) +Output:- +----------------------------*/ +void IapProgramByte(WORD addr, BYTE dat) +{ + IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time + IAP_CMD = CMD_PROGRAM; //Set ISP/IAP/EEPROM PROGRAM command + IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low + IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high + IAP_DATA = dat; //Write ISP/IAP/EEPROM data + IAP_TRIG = 0x46; //Send trigger command1 (0x46) + IAP_TRIG = 0xb9; //Send trigger command2 (0xb9) + _nop_(); //MCU will hold here until ISP/IAP/EEPROM operation complete + IapIdle(); +} + +/*---------------------------- +Erase one sector area +Input: addr (ISP/IAP/EEPROM address) +Output:- +----------------------------*/ +void IapEraseSector(WORD addr) +{ + IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time + IAP_CMD = CMD_ERASE; //Set ISP/IAP/EEPROM ERASE command + IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low + IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high + IAP_TRIG = 0x46; //Send trigger command1 (0x46) + IAP_TRIG = 0xb9; //Send trigger command2 (0xb9) + _nop_(); //MCU will hold here until ISP/IAP/EEPROM operation complete + IapIdle(); +} + diff --git a/MCU/MCU_REAL _FINAL/eeprom.h b/MCU/MCU_REAL _FINAL/eeprom.h new file mode 100644 index 0000000..c2cd2d9 --- /dev/null +++ b/MCU/MCU_REAL _FINAL/eeprom.h @@ -0,0 +1,36 @@ +#ifndef _EEPROM_H_ +#define _EEPROM_H_ + +/*Declare SFR associated with the IAP */ +sfr IAP_DATA = 0xE2; //Flash寄存器 +sfr IAP_ADDRH = 0xE3; //Flash 高地址 +sfr IAP_ADDRL = 0xE4; //Flash 低地址 +sfr IAP_CMD = 0xE5; //Flash 命令寄存器 +sfr IAP_TRIG = 0xE6; //Flash 控制触发器 +sfr IAP_CONTR = 0xE7; //Flash 控制寄存器 + +/*Define ISP/IAP/EEPROM command*/ +#define CMD_IDLE 0 //空闲 +#define CMD_READ 1 //读 +#define CMD_PROGRAM 2 //写 +#define CMD_ERASE 3 //擦除 + +/*Define ISP/IAP/EEPROM operation const for IAP_CONTR*/ +//#define ENABLE_IAP 0x80 //if SYSCLK<40MHz +#define ENABLE_IAP 0x81 //if SYSCLK<20MHz +//#define ENABLE_IAP x82 //if SYSCLK<10MHz +//#define ENABLE_IAP 0x83 //if SYSCLK<5MHz + +//Start address for STC89C58xx EEPROM +#define IAP_ADDRESS 0x08000 + +typedef unsigned char BYTE; +typedef unsigned int WORD; + +void Delay(BYTE n); +void IapIdle(); +BYTE IapReadByte(WORD addr); +void IapProgramByte(WORD addr, BYTE dat); +void IapEraseSector(WORD addr); + +#endif \ No newline at end of file diff --git a/MCU/MCU_REAL _FINAL/main.c b/MCU/MCU_REAL _FINAL/main.c index 376947a..1cdd56a 100644 --- a/MCU/MCU_REAL _FINAL/main.c +++ b/MCU/MCU_REAL _FINAL/main.c @@ -6,26 +6,10 @@ unsigned char TH, TL; extern Menu *NOW; //菜单指针 extern enum OPR opr; //按键状态 -unsigned char freshScreenTriger = 0; void int0() interrupt 0 //外部中断:检测左右旋钮 { -// IE0 = 0; //消抖 -// delay(20); -// IE0 = 0; -// -// if(PIN_3 == 0) -// { -// delay(10); -// if(PIN_3 == 0) -// opr = left; -// } -// else if(PIN_3 == 1) -// { -// delay(10); -// if(PIN_3 == 1) -// opr = right; -// } + unsigned char LS, CS, flag = 0; LS = PIN_3; while(!PIN_1) @@ -81,7 +65,7 @@ int main() displayInit(); //屏幕初始化 clear(); menuInit(); //菜单及其他初始化 - + while(1) {