STC12C5A60S2微控制器的內建EEPROM的使用
EEPROM可以用來儲存一些需要在掉電以後不丟失的資料,STC12C5A60S2微控制器內部有1k byte的EEPROM,2個扇區,在程式設計的時候注意,對於一個扇區的資料都要一起寫進去,即使不改也要重新寫。
測試的程式碼:
#include <STC12C5A.H>
#include"intrins.h"
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define ADC_POWER 0x80
#define ADC_FLAG 0x10
#define ADC_START 0x08
#define CMD_IDLE 0 //IAP等待
#define CMD_READ 1 //讀flash
#define CMD_PROGRAM 2 //寫入
#define CMD_ERASE 3 //擦除
#define IAP_EN 0x83
#define iap_ADDRESS 0x0000 //地址
char td[10]= {'a','b','c','d','e','f','g','h','j','k'};
void delay(int k) //延時函式
{
int i,j;
for(i=0; i<184; i++)
for(j=0; j<k; j++);
}
//使硬體或軟體操作停止
void iap_IDLE()
{
IAP_CONTR=0; //禁止IAP讀寫擦除
IAP_CMD=0; //等待
IAP_TRIG=0; //命令未觸發
IAP_ADDRH=0x80; //高位資料地址
IAP_ADDRL=0; //低位
}
//從資料裡面讀取資料
uchar iap_READ(uint addr)
{ uchar datas;
IAP_CONTR=IAP_EN; //控制允許位
IAP_CMD=CMD_READ; //寫入讀命令
IAP_ADDRL=addr; //自定義地址
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5a; //命令有效
IAP_TRIG=0xa5;
_nop_();
datas=IAP_DATA;
iap_IDLE();
return datas; //返回讀出的資料
}
//寫一個位元ISP寫到某個地方
void iap_PROGRAM(uint addr,uchar datas)
{
IAP_CONTR=IAP_EN;
IAP_CMD=CMD_PROGRAM;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_DATA=datas;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
_nop_();
iap_IDLE();
}
//擦掉某個區域
void iap_ERASE(uint addr)
{
IAP_CONTR=IAP_EN;
IAP_CMD=CMD_ERASE;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
_nop_();
iap_IDLE();
}
void uart_init(void) //串列埠的初始化
{
TMOD=0x20;//即0010 0000,定時器/計數器1,工作方式2
TH1=0xfd;//設定波特率為9600
TL1=0xfd;
TR1=1;//啟動定時器/計數器1
SCON=0x50; //0101 0000.串列埠工作方式1,允許序列控制
PCON=0x00;//設定SMOD=0
IE=0x90; //CPU允許中斷,序列允許中斷
TI=1;//直接使用printf必須加入此句才能實現傳送
}
main()
{
int i;
iap_ERASE(iap_ADDRESS); //擦除扇區
for(i=0;i<10;i++)
{
iap_PROGRAM(iap_ADDRESS+i,td[i]);//向這個區間512位元組裡面寫東西
}
uart_init(); //串列埠初始化
while(1)
{
for(i=0;i<10;i++)
{
printf("iap_READ[%d]=%c \n",i,iap_READ(iap_ADDRESS+i)); //在串列埠上輸出
delay(1000);
}
}
}
---------------------
作者:liaomi520
來源:CSDN
原文:https://blog.csdn.net/liaomi520/article/details/52211508
版權宣告:本文為博主原創文章,轉載請附上博文連結!