|
//#include <REGX52.H>
#include <STC8.H>
#include "intrins.h"
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit K1 = P3^2; //按鈕1
sbit K2 = P3^3; //按鈕2
sbit Y=P1^0;
sbit W=P1^1;
//unsigned int t,addr;
unsigned char V,dat,n,m,k;
unsigned char code LED[] = {0xFE,0xFD,0xFC};
//測試工作頻率為11.0592MHz
//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 WT_30M 0x80
#define WT_24M 0x81
#define WT_20M 0x82
#define WT_12M 0x83
#define WT_6M 0x84
#define WT_3M 0x85
#define WT_2M 0x86
#define WT_1M 0x87
void IapIdle()
{
IAP_CONTR = 0; //關閉IAP功能
IAP_CMD = 0; //清除命令寄存器
IAP_TRIG = 0; //清除觸發寄存器
IAP_ADDRH = 0x80; //將地址設置到非IAP區域
IAP_ADDRL = 0;
}
char IapRead(int addr)
{
char dat;
IAP_CONTR = WT_12M; //使能IAP
IAP_CMD = 1; //設置IAP讀命令
IAP_ADDRL = addr; //設置IAP低地址
IAP_ADDRH = addr >> 8; //設置IAP高地址
IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
_nop_();
dat = IAP_DATA; //讀IAP數據
IapIdle(); //關閉IAP功能
return dat;
}
void IapProgram(int addr, char dat)
{
IAP_CONTR = WT_12M; //使能IAP
IAP_CMD = 2; //設置IAP寫命令
IAP_ADDRL = addr; //設置IAP低地址
IAP_ADDRH = addr >> 8; //設置IAP高地址
IAP_DATA = dat; //寫IAP數據
IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
_nop_();
IapIdle(); //關閉IAP功能
}
void IapErase(int addr)
{
IAP_CONTR = WT_12M; //使能IAP
IAP_CMD = 3; //設置IAP擦除命令
IAP_ADDRL = addr; //設置IAP低地址
IAP_ADDRH = addr >> 8; //設置IAP高地址
IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
_nop_(); //
IapIdle(); //關閉IAP功能
}
/*
void main(void)
{
//uchar V;
V = IapRead(0x0016); // 開機讀取EEPROM區2002h數據,還原關電前LED的亮滅狀況
if(V == 2) {LED1=0;LED2=1;}
else if(V == 6){LED1=0;LED2=0;}
while(1)
{
if(!K1)
{
while(!K1);
LED1=0;LED2=1;
IapErase(0x0000); // 擦除第1個扇區(2000h~21FFh)
IapProgram(0x0016,2); // 對EEPROM區2002h寫入2
}
if(!K2)
{
while(!K2);
LED1=0;LED2=0;
IapErase(0x0000); // 擦除第1個扇區(2000h~21FFh)
IapProgram(0x0016,6); // 對EEPROM區2002h寫入6
}
}
}
*/
void main()
{
n=IapRead(0x0016);
EA=1;
EX0=1;
IT0=1;
while(1)
{
if(n==3)
n=0;
P1=LED[n];
IapErase(0x0000);
IapProgram(0x0016,n);
}
}
void i0() interrupt 0
{
n++;
}
上面星號部分可以存,下面的存不了,求解
|
-
11.png
(193.24 KB, 下載次數: 28)
下載附件
2019-2-19 10:45 上傳
|