标题:
STC12CXX单片机片内EEPROM开机次数显示
[打印本页]
作者:
腾飞的龙
时间:
2016-7-28 09:59
标题:
STC12CXX单片机片内EEPROM开机次数显示
STC12C5A60S2单片机片内EEPROM应用
/*************************************************
功能:用STC12C5A60S2内部EEPROM记开机次数
数码管显示
根据慧静电子改写
单片机:STC12C5A60S2
晶 振:11.0592M
作者 :苏义江
时间:2015-7-22
*****************************************************/
#include<reg52.h>
#include"stc12ceeprom.h"
//STC5Axx 系列 EEPROM 测试起始地址
#define DATA_flash_START_address 0x0000
sbit wei=P2^7;
sbit duan=P2^6;
uchar t,a=0,gewei,shiwei,bai;
//uchar code table[]="0123456789";
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,
0xa1,0x86,0x8e,0x89};//0到H共阳段码
void delay(uint x)
{
uint z,j;
for(z=x;z>0;z--)
for(j=800;j>0;j--);
}
void main()
{
delay(10);
// sector_Erase(0x0000);//擦除扇区
a=Byte_read(0x0000);//读一个字节 从起始地址开始读
a++;//计数变量自加1
if(a>=999)//加到999
a=0;
sector_Erase(0x0000);//擦除扇区
Byte_write(0x0000,a);//字节编程
gewei=a%10;
shiwei=a%100/10;
bai=a/100;
while(1)
{
wei=1;
P0=0xfe;
wei=0;
P0=0xFF;
duan=1;
P0=table[bai];
duan=0;
P0=0xFF;
delay(10);
wei=1;
P0=0xfd;
wei=0;
P0=0xFF;
duan=1;
P0=table[shiwei];
duan=0;
P0=0xFF;
delay(10);
wei=1;
P0=0xfb;
wei=0;
P0=0xFF;
duan=1;
P0=table[gewei];
duan=0;
P0=0xFF;
delay(10);
}
}
复制代码
STC12CXX EEPROM.H文件
#ifndef __STC12CEEPROM_H__
#define __STC12CEEPROM_H__
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//用于STC12C2052
//sfr IAP_DATA =0XE2;
//sfr IAP_ADDRH =0XE3;
//sfr IAP_ADDRL =0XE4;
//sfr IAP_CMD =0XE5;
//sfr IAP_TRIG =0XE6;
//sfr IAP_CONTR =0XE7;
//#define WD1 0X46
//#define WD2 0XB9
//用于STC12C5A60S2
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 WD1 0X5A
#define WD2 0XA5
//定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数
//#define ENABLE_ISP 0X80//晶振小于30M
//#define ENABLE_ISP 0X81//晶振小于24M
#define ENABLE_ISP 0X82//晶振小于20M
//#define ENABLE_ISP 0X83//晶振小于12M
//#define ENABLE_ISP 0X84//晶振小于6M
//#define ENABLE_ISP 0X85//晶振小于3M
uchar Byte_read(uint add);//读一字节 调用前打开IAP
void Byte_write(uint add,uchar ch);//字节编程调用前打开IAP
void sector_Erase(uint add);//擦除扇区
void IAP_Disable();//关闭IAP
uchar Byte_read(uint add)//读一字节 调用前打开IAP
{
IAP_DATA=0X00;
////打开 IAP 功能, 设置Flash 操作等待时间
IAP_CONTR=ENABLE_ISP;
IAP_CMD =0X01;
IAP_ADDRH=add/256;
IAP_ADDRL =add%256;
IAP_TRIG =WD1;//先送 5Ah,再送A5h 到ISP/IAP 触发寄存器
IAP_TRIG =WD2;//送完A5h 后,ISP/IAP 命令立即被触发起动
_nop_();_nop_();
IAP_Disable();//关闭IAP
return (IAP_DATA);
}
//字节编程调用前打开IAP 写
void Byte_write(uint add,uchar ch)
{
IAP_CONTR =ENABLE_ISP;
IAP_CMD =0X02;//IAP/ISP/EEPROM 字节编程命令
IAP_ADDRH=add/256;//设置目标单元地址的高8 位地址
IAP_ADDRL =add%256;//设置目标单元地址的低8 位地址
IAP_DATA=ch;//要编程的数据先送进IAP_DATA 寄存器
IAP_TRIG =WD1;
IAP_TRIG =WD2;
_nop_();_nop_();
IAP_Disable();
}
//擦除扇区
void sector_Erase(uint add)
{
IAP_CONTR =ENABLE_ISP;
IAP_CMD =0X03;//IAP/ISP/EEPROM 扇区擦除命令
IAP_ADDRH=add/256;
IAP_ADDRL =add%256;
IAP_TRIG =WD1;
IAP_TRIG =WD2;
_nop_();_nop_();
IAP_Disable();
}
void IAP_Disable()
{
IAP_CONTR =0;
IAP_CMD =0;
IAP_TRIG =0;
IAP_ADDRH=0;
IAP_ADDRL =0;
}
#endif
复制代码
作者:
mobicity
时间:
2019-12-30 20:53
学习,学习,感谢
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1