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
復制代碼
|