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

📄 stc_iap_eeprom.c

📁 stc12c5604 eeprom test
💻 C
📖 第 1 页 / 共 2 页
字号:
	if(++adcount==25)
	{
		aveab=sumab/25;
		sumab=0;
		adcount=0;
//		disp_flag=1;
	}	
}
//读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
INT8U Byte_Read(INT16U add)
{
    IAP_DATA = 0x00;
    IAP_CONTR = ENABLE_ISP;         //打开IAP 功能, 设置Flash 操作等待时间
    IAP_CMD = 0x01;                 //IAP/ISP/EEPROM 字节读命令

    my_unTemp16.un_temp16 = add;
    IAP_ADDRH = my_unTemp16.un_temp8[0];    //设置目标单元地址的高8 位地址
    IAP_ADDRL = my_unTemp16.un_temp8[1];    //设置目标单元地址的低8 位地址

    //EA = 0;
    IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被触发起动
    _nop_();
    //EA = 1;
    IAP_Disable();  //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
                    //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
    return (IAP_DATA);
}

//字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
void Byte_Program(INT16U add, INT8U ch)
{
    IAP_CONTR = ENABLE_ISP;         //打开 IAP 功能, 设置Flash 操作等待时间
    IAP_CMD = 0x02;                 //IAP/ISP/EEPROM 字节编程命令

    my_unTemp16.un_temp16 = add;
    IAP_ADDRH = my_unTemp16.un_temp8[0];    //设置目标单元地址的高8 位地址
    IAP_ADDRL = my_unTemp16.un_temp8[1];    //设置目标单元地址的低8 位地址

    IAP_DATA = ch;                  //要编程的数据先送进IAP_DATA 寄存器
    //EA = 0;
    IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被触发起动
    _nop_();
    //EA = 1;
    IAP_Disable();  //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
                    //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}

//擦除扇区, 入口:DPTR = 扇区地址
void Sector_Erase(INT16U add)
{
    IAP_CONTR = ENABLE_ISP;         //打开IAP 功能, 设置Flash 操作等待时间
    IAP_CMD = 0x03;                 //IAP/ISP/EEPROM 扇区擦除命令

    my_unTemp16.un_temp16 = add;
    IAP_ADDRH = my_unTemp16.un_temp8[0];    //设置目标单元地址的高8 位地址
    IAP_ADDRL = my_unTemp16.un_temp8[1];    //设置目标单元地址的低8 位地址

    //EA = 0;
    IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被触发起动
    _nop_();
    //EA = 1;
    IAP_Disable();  //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
                    //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}

void IAP_Disable()
{
    //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
    //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
    IAP_CONTR = 0;      //关闭IAP 功能
    IAP_CMD   = 0;      //清命令寄存器,使命令寄存器无命令,此句可不用
    IAP_TRIG  = 0;      //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
    IAP_ADDRH = 0;
    IAP_ADDRL = 0;
}

void Delay()
{
    INT8U i;
    INT16U d=5000;
    while (d--)
    {
        i=255;
        while (i--);
    }
}

void sjzh(int disdata,uchar dec)//data coded
{
	int m;
	uchar i,k,n;
	for(i=0;i<8;i++)
	{
		dis1[i]=0;
	}
	if(disdata<0) {disdata=-disdata;dis1[0]=0x0c;}
	k=1;
	n=0;
	for(i=0;i<5;i++)
	{
		switch(i)
		{
			case 0:
				m=10000;
				break; 
			case 1:
				m=1000;
				break; 
			case 2:
				m=100;
				break; 
			case 3:
				m=10;
				break; 
			case 4:
				m=1;
				break; 
		}
		dis1[k]=disdata/m+1;
		if(dis1[k]==1 && n==0) dis1[k]=0;
		disdata=disdata%m;
		k++;
		if(dec==4-i && dec!=0) 
		{
			dis1[k]=0x0b;
			if(dis1[k-1]==0) dis1[k-1]=0x1;
			k++;
			n=1;
		}
	}
  /*
	dis1[1]=disdata/10000+16;
	if(dis1[1]==16 && dec<3) dis1[1]=0;
	disdata=disdata%10000;
	dis1[2]=disdata/1000+16;
	if(dis1[2]==16 && dis1[1]==0 && dec<2) dis1[2]=0;
	disdata=disdata%1000;
	dis1[3]=disdata/100+16;
	if(dis1[3]==16 && dis1[2]==0) dis1[3]=0;
	disdata=disdata%100;
	dis1[4]=disdata/10+16;
	dis1[5]=disdata%10+16;
*/
}
						
//void writelcd(uchar disdata,bit flag)
//{
//		int i;
//		CD=flag;
//		P2=disdata;
//		MWR=0;
//		CS=0;
//		for(i=0;i<10;i++) i=i;
//		CS=1;
//		MWR=1;
//}
void writelcd(uchar disdata,bit flag,bit pos)
{
	if(pos==0) 
		CS1=1;
	else
		CS2=1;
	MWR=0;
	CD=flag;
//	P2=disdata;
	senddat(disdata);
	MEN=1;
	_nop_();
	_nop_();
	MEN=0;
	if(pos==0) 
		CS1=0;
	else
		CS2=0;
	MWR=1;
}


void zfdisp(int ddx,uchar ggl,int rows,int cols)  //ddx--code addr ggl--number
{
	int i;
	//addr=rows*0x100+cols+0x400; //width=0x10 first addr=0x400
	for(i=0;i<ggl;i++)
		zfxs(rows,cols+i,zfcode[ddx+i]);
}
void zfxs(int addrx,int addry,int zfcode)
{
	int dptr,i,ddx;
	bit pos;
	dptr=zfcode*0x10;
	if(addry<8) 
	{
		ddx=addry*0x8;
		pos=0;
	}
	else
	{
		ddx=(addry-8)*0x8;
		pos=1;
	}
	writelcd(addrx+0xb8,0,pos);
	writelcd(0x40+ddx,0,pos);
	for(i=0;i<0x8;i++)
		writelcd(EETAB[dptr+i],1,pos);
	writelcd(addrx+0xb8+1,0,pos);
	writelcd(0x40+ddx,0,pos);
	for(i=0;i<0x8;i++)
		writelcd(EETAB[dptr+i+8],1,pos);
}	
void sjxs(int rows,int cols)
{
	int i;
	for(i=0;i<8;i++)
		zfxs(rows,cols+i,dis1[i]);
}

void initlcd()
{
	writelcd(0x3e,0,0);
	writelcd(0x3e,0,1);
	writelcd(0xc0,0,0);
	writelcd(0xc0,0,1);
	clear();
	writelcd(0x3f,0,0);
	writelcd(0x3f,0,1);
}
void openlcd()
{
	writelcd(0x3f,0,0);
	writelcd(0x3f,0,1);
}
void shutlcd()
{
	writelcd(0x3e,0,0);
	writelcd(0x3e,0,1);
}
void clear()
{
	int i,j;
	for(i=0;i<8;i++)
	{
		writelcd(0xb8+i,0,0);
		writelcd(0xb8+i,0,1);
		writelcd(0x40,0,0);
		writelcd(0x40,0,1);
		for(j=0;j<64;j++)
		{
			writelcd(0,1,0);
			writelcd(0,1,1);
		}
	}
}
void mydelay(int stime)
{
	int i;
	for(i=0;i<stime;i++)
		i=i;
}

void senddat(uchar dat)
{
	int i;
	for(i=0;i<8;i++)
	{
		if(dat&0x1<<(7-i))
			SDAT=1;
		else
			SDAT=0;
		_nop_();
		_nop_();
		SCLK=0;
		mydelay(5);
		SCLK=1;
		mydelay(5);
	}
}


⌨️ 快捷键说明

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