论坛看到一个朋友上传了这个的代码,但是他的里面有些串口不相关的部分,我这个EEPROM只有最简单的一个按键,一个LED,
题外话,一个C里面多个H文件时,先用到的H,在C文件里先包含,
单片机源程序如下:
//说明
// 定义了一个BIT 位 y,上电读取y值 ,附给LED,
// 按键切换LED状态,
// 断电,重新上电,如果成功,LED则会还原断电前状态
#include<STC15W.H>
#include <intrins.h>
#include<STC15EEPROM.H>
#include<KEY_02.H>
sbit led=P2^2;
void main()
{
y=DU_eeprom(0x0400); //上电,读一次数值
while(1)
{
led=y; //把读到的数附给led
Key_Scan2();
}
}
#ifndef __STC15EEPROM_H__
#define __STC15EEPROM_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 ENABLE_IAP 0x82
#define CMD_IDLE 0
#define CMD_READ 1
#define CMD_PROGRAM 2
#define CMD_ERASE 3
typedef unsigned char BYTE;
typedef unsigned int WORD;
//Byte IapReadByte(WORD addr);
//#define IAP_ADDRESS 0x0400
//BYTE IapReadByte(WORD addr);
// 关闭 IAP
void iapidle()
{
IAP_CONTR=0;
IAP_CMD=0;
IAP_TRIG=0X80;
IAP_ADDRL=0;
}
// 读一个字节
BYTE DU_eeprom(WORD addr)
{
BYTE dat;
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_READ;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5a;
IAP_TRIG=0XA5;
_nop_();
dat=IAP_DATA;
iapidle();
return dat;
}
// 写一个字节
void XIE_eeprom(WORD addr,BYTE dat)
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_PROGRAM;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_DATA=dat;
IAP_TRIG=0X5a;
IAP_TRIG=0XA5;
_nop_();
iapidle();
}
// 扇区擦除
void CA_eeprom(WORD addr)
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_ERASE;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0X5a;
IAP_TRIG=0XA5;
_nop_();
iapidle();
}
#endif
#ifndef __KEY_02_H__
#define ___KEY_02_H__
#define u8 unsigned char
sbit KEY_02=P3^4;
bit y;
void Key_Scan2() ///////////////////////////////////按键1
{
static u8 j2=0,k2=0;
if(KEY_02==0)
{
if(j2==0)
{
if(KEY_02==0&&k2++>=20)
{
j2=1;
y=~y;
CA_eeprom(0x0400); //先擦
XIE_eeprom(0x0400,y); //再写
}
}
}
else //按键释放
{
j2=0;
k2=0;
}
}
#endif
以上的Keil代码工程下载:
3 单独测试EEPROM -把其他的H文件删了.rar
(23.6 KB, 下载次数: 92)
|