論壇看到一個朋友上傳了這個的代碼,但是他的里面有些串口不相關的部分,我這個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)
2022-2-19 10:23 上傳
點擊文件名下載附件
|