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
复制代码
|