⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stc_iap_eeprom.c

📁 stc12c5604 eeprom test
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
  --- STC International Limited ---------------- 
一个完整的EEPROM 测试程序,用宏晶的下载板可以直接测试

STC12C5AxxAD 系列单片机 EEPROM/IAP 功能测试程序演示
STC12C52xxAD 系列单片机 EEPROM/IAP 功能测试程序演示
STC11xx 系列单片机 EEPROM/IAP 功能测试程序演示
STC10xx 系列单片机 EEPROM/IAP 功能测试程序演示
 --- STC International Limited ------------------
 --- 宏晶科技  设计 2009/1/12 V1.0 --------------
 --- Mobile: 13922805190 ------------------------
 --- Fax: 0755-82944243 -------------------------
 --- Tel: 0755-82948412 -------------------------
 --- Web: www.MCU-Memory.com --------------------
本演示程序在STC-ISP Ver 3.0A.PCB 的下载编程工具上测试通过,EEPROM 的数据
在P1 口上显示, 如果要在程序中使用或在文章中引用该程序,请在程序中或文章中
注明使用了宏晶科技的资料及程序
*/
#include <STC_NEW_8051.H>
//#include <reg51.H>
#include <intrins.H>

typedef unsigned char  INT8U;
typedef unsigned int   INT16U;

typedef unsigned char uchar;
typedef unsigned int uint;

//sfr IAP_DATA    = 0xC2;
//sfr IAP_ADDRH   = 0xC3;
//sfr IAP_ADDRL   = 0xC4;
//sfr IAP_CMD     = 0xC5;
//sfr IAP_TRIG    = 0xC6;
//sfr IAP_CONTR   = 0xC7;

//定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数
//#define ENABLE_ISP 0x80 //系统工作时钟<30MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x81 //系统工作时钟<24MHz 时,对IAP_CONTR 寄存器设置此值
#define ENABLE_ISP 0x82 //系统工作时钟<20MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x84 //系统工作时钟<6MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x85 //系统工作时钟<3MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x86 //系统工作时钟<2MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x87 //系统工作时钟<1MHz 时,对IAP_CONTR 寄存器设置此值

#define DEBUG_DATA               0x5A  //本测试程序最终存储在 EEPROM 单元的数值
#define DATA_FLASH_START_ADDRESS 0x00  //STC5Axx 系列 EEPROM 测试起始地址

union union_temp16
{
    INT16U un_temp16;
    INT8U  un_temp8[2];
}my_unTemp16;

uchar dis1[8];
INT8U Byte_Read(INT16U add);              //读一字节,调用前需打开IAP 功能
void Byte_Program(INT16U add, INT8U ch);  //字节编程,调用前需打开IAP 功能
void Sector_Erase(INT16U add);            //擦除扇区
void IAP_Disable();                       //关闭IAP 功能
void Delay();

//void hzdisp(int addr0,uchar num,int rows,int cols);
void zfdisp(int addr0,uchar num,int rows,int cols);
void zfxs(int addrx,int addry,int zfcode);
//void hzxs(int addrx,int addry,int hzcode);
void sjzh(int disdata,uchar dec);
void sjxs(int rows,int cols);
void writelcd(uchar ddh,bit flag,bit pos);
void waitlcd();
void senddat(uchar dat);
void openlcd();
void shutlcd();
void clear();
void initlcd();
void mydelay(int stime);
uchar code EETAB[]={
/*--  文字:    --*/
/*--  System11;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  0  --*/
/*--  System11;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xF0,0xF8,0x08,0x08,0xF8,0xF0,0x00,0x00,0x0F,0x1F,0x10,0x10,0x1F,0x0F,0x00,

/*--  文字:  1  --*/
/*--  System11;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x10,0x10,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,

/*--  文字:  2  --*/
/*--  System11;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x30,0x38,0x08,0x88,0xF8,0x70,0x00,0x00,0x1C,0x1E,0x13,0x11,0x10,0x10,0x00,

/*--  文字:  3  --*/
/*--  System11;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x10,0x18,0x88,0x88,0xF8,0x70,0x00,0x00,0x08,0x18,0x10,0x10,0x1F,0x0F,0x00,

/*--  文字:  4  --*/
/*--  System11;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x80,0xE0,0x70,0xF8,0xF8,0x00,0x00,0x06,0x07,0x05,0x04,0x1F,0x1F,0x00,

/*--  文字:  5  --*/
/*--  System11;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xF8,0xF8,0x88,0x88,0x88,0x08,0x00,0x00,0x09,0x19,0x10,0x10,0x1F,0x0F,0x00,

/*--  文字:  6  --*/
/*--  System11;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xF0,0xF8,0x88,0x88,0x98,0x10,0x00,0x00,0x0F,0x1F,0x10,0x10,0x1F,0x0F,0x00,

/*--  文字:  7  --*/
/*--  System11;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x08,0x08,0x88,0xE8,0x78,0x18,0x00,0x00,0x00,0x1C,0x1F,0x03,0x00,0x00,0x00,

/*--  文字:  8  --*/
/*--  System11;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x70,0xF8,0x88,0x88,0xF8,0x70,0x00,0x00,0x0F,0x1F,0x10,0x10,0x1F,0x0F,0x00,

/*--  文字:  9  --*/
/*--  System11;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xF0,0xF8,0x08,0x08,0xF8,0xF0,0x00,0x00,0x08,0x19,0x11,0x11,0x1F,0x0F,0x00,

/*--  文字:  .  --*/
/*--  System11;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x00,0x00,0x00,0x00,

/*--  文字:  -  --*/
/*--  System11;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

uchar code zfcode[]={0,1,2,3,4,5,6,7,8,9,10,11};
bit stflag,swflag,cdflag,ttflag,wtflag,ceflag,recheckflag,keyflag,spec;
bit disp_flag;

uchar FCODE[8],dispflag,countflag,us0,us1;
uchar data1,data2,comm,lcdsta,login;
uchar dis1[8],tmpP2;

xdata int aveab,oldab,errcode,over_n,cdcount,swcount,stcount,wtcount;
xdata int cdcount1,cecount,delay1,delay2,delay3,delay6,eecount,eepoint;
xdata int k20,dtpr,dtpr1,rows,cols,dcode,dcount,codecount;

long sumab,delay4,delay5,adtmp;
uchar eetmp;
uint adcount;

sbit ADIN=P1^0;
sbit KK1=P1^1;
sbit KK2=P1^2;
sbit KK3=P1^3;
sbit SW1=P1^4;
sbit SW2=P1^5;
sbit CD=P1^6;
sbit MWR=P1^7;

sbit SDAT=P2^0;
sbit SCLK=P2^1;
sbit CS1=P2^2;
sbit CS2=P2^3;
sbit AL1=P2^4;
sbit AL2=P2^5;
sbit AL3=P2^6;
sbit AL4=P2^7;

sbit K1=P3^2;
sbit K2=P3^3;
sbit K3=P3^4;
sbit MEN=P3^5;

void main (void)
{
 	int i,j,a;
   INT16U eeprom_address;
    INT8U  read_eeprom;

	P3M0=0xFF;P3M1=0x0;
	P2M0=0xff;P2M1=0x0;
	IAP_CONTR=0x88;
	mydelay(10);
	ADC_CONTR|=0x80;
	mydelay(50);
	P1M0=0xC0;P1M1=0x3F;
	TMOD=1;
	TL0=0xE0;
	TH0=0xB1;
	ADC_RES=0;
	ADC_RESL=0;
	ADC_CONTR=0xE0;
	mydelay(50);
	AUXR|=0x10;
	EADC=1;
	EA=1;
	ET0=1;
	TR0=1;

	disp_flag=1;
	for(i=0;i<10000;i++) i=i;
	initlcd();
	mydelay(10);
 /*   eeprom_address = DATA_FLASH_START_ADDRESS;  //将测试起始地址送eeprom_address
        Sector_Erase(eeprom_address);           //擦除整个扇区
	for(i=0;i<512;i++)
	{
        Byte_Program(eeprom_address+i, i%256);//将 DEBUG_DATA 写入 EEPROM
	}
	Delay();
	    eeprom_address = 0x200;  //将测试起始地址送eeprom_address
        Sector_Erase(eeprom_address);           //擦除整个扇区
	for(i=0;i<512;i++)
	{
        Byte_Program(eeprom_address+i, i%128);//将 DEBUG_DATA 写入 EEPROM
	}
	Delay();
*/	while(1)
	{
		IAP_CONTR=0x88;
		mydelay(10);
	eeprom_address=0;	
  	for(i=0;i<512;i++)
	{
    	read_eeprom = Byte_Read(eeprom_address+i);    //读EEPROM的值,存到read_eeprom
		aveab=read_eeprom;
		sjzh(aveab,0);
		sjxs(0,0);	
		Delay();
		read_eeprom=Byte_Read(0x200+i);
		aveab=read_eeprom;
		sjzh(aveab,0);
		sjxs(3,0);
		Delay();	
	}
//		zfxs(0,0,4);
//		mydelay(15000);	
	}
  zfxs(0,0,0);//P1 = 0xF0;                            //演示程序开始,让 P1[3:0] 控制的灯亮
    Delay();                              //延时
    zfxs(0,6,0);//P1 = 0x0F;                            //演示程序开始,让 P1[7:4] 控制的灯亮
    Delay()    ;                          //延时

    //将EEPROM 测试起始地址单元的内容读出
    eeprom_address = DATA_FLASH_START_ADDRESS;  //将测试起始地址送eeprom_address
    read_eeprom = Byte_Read(eeprom_address);    //读EEPROM的值,存到read_eeprom

    if (DEBUG_DATA == read_eeprom)
    {   //数据是对的,亮  P1.7 控制的灯,然后在 P1 口上将 EEPROM 的数据显示出来
        zfxs(0,6,1);//P1 = ~0x80;
        Delay()    ;                            //延时
        zfxs(0,0,1);//P1 = ~read_eeprom;
    }
    else
    {   //数据是错的,亮 P1.3 控制的灯,然后在 P1 口上将 EEPROM 的数据显示出来
        //再将该EEPROM所在的扇区整个擦除,将正确的数据写入后,亮 P1.5 控制的灯
        zfxs(0,6,2);//P1 = ~0x08;
        Delay()    ;                            //延时
        zfxs(0,0,2);//P1 = ~read_eeprom;
        Delay()    ;                            //延时

        Sector_Erase(eeprom_address);           //擦除整个扇区
        Byte_Program(eeprom_address, DEBUG_DATA);//将 DEBUG_DATA 写入 EEPROM

        zfxs(0,6,3);//P1 = ~0x20;                 //熄灭 P1.3 控制的灯,亮 P1.5 控制的灯
    }

    while (1);                      //CPU 在此无限循环执行此句*/
}
void timer0(void) interrupt 1 using 0
{
//	if(disp_flag==0)
		ADC_CONTR |= 0x08;
	TL0=0xE0;
	TH0=0xB1;
}
void adc_int (void) interrupt 5 using 2
{
//	int i,j;
	int adtmp,sumab,adcount;
	uchar adh,adl;
	ADC_CONTR&=0xE7;
	adh=ADC_RES;
	adl=ADC_RESL;
	adtmp=adh*4+adl&0x03;
	sumab+=adtmp;
//	eewrite(eeaddr0+adcount,adcount);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -