微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 关于STC单片机EEPROM的应用总结

关于STC单片机EEPROM的应用总结

时间:12-01 来源:互联网 点击:

if(_IOC_NR(cmd)>

ioarg = &mem_devp->

wait->

if (list_empty(&wait->

spin_unlock_irqrestore(&q->

spin_lock_irqsave(&q->

list_for_each_entry_safe(curr, next, &q->

unsigned flags = curr->

struct mem_dev *dev = filp->

if(p >

地址

IAP_ADDRH=addr>>8;

IAP_TRIG=0X5A;

IAP_TRIG=0XA5;

_nop_();

dat=IAP_DATA;

iapidle();

return dat;

}

/*写一个字节的IAP/ISP/EEPROM空间

输入: 字节地址

要写入的数据

Void iapprogrambyte(uint addr,uchar dat)

{

IAP_CONTR=ENABLE_IAP;//打开IAP功能并设置等待时间

IAP_CMD=CMD_PROGRAM;//设置写命令

IAP_ADDRL=addr;//设置字节地址低8位

IAP_ADDRH=addr>>8;//设置字节地址的高8位

IAP_DATA=dat;//写内容

IAP_TRIG=0X5A;//发送触发命令1

IAP_TRIG=0XA5;//发送触发命令2

_nop_();//等待直到写操作完成

Iapidle();

}

/*扇区擦除

输入:地址

Void iaperasesector(uint addr)

{

IAP_CONTR=ENABLE_IAP;//开IAP功能并设置等待时间

IAP_CMD=CMD_ERASE;//设置擦除命令

IAP_ADDRL=addr;

IAP_ADDRH=addr>>8;

IAP_TRIG=0x5a;

IAP_TRIG=0XA5;

_nop_();

Iapidle();

}

/********写595函数*******************/

void write_595(uchar x)

{

uchar j;

for(j=0;j<8;j++)

{

x=x<1;

SHIFT=0;

_nop_();

_nop_();

_nop_();

DATA=CY;

SHIFT=1;

_nop_();

_nop_();

_nop_();

SHIFT=0;

}

}

/********595输出函数函数*******************/

void out_595(void)

{

STORAGE=0;

_nop_();

_nop_();

STORAGE=1;

_nop_();

_nop_();

STORAGE=0;

}

/*软件延时 */

void delay(uchar t)

{ uchar x;

while(t--)

{

for(x=0;x<250;x++)

{

_nop_();

_nop_();

_nop_();

_nop_();

}

}

}

/******按键检测函数**********************/

void keycheck(void)

{

if(SW==0)//判断开关按键是否按下

{delay(10);//抗干扰

if(SW==0)//确实按下

{kai=~kai;

}

while(!SW)//一直按下

{BEEP=1;}//蜂鸣器响

BEEP=0;//松开按键,蜂鸣器关闭

}

if(INC==0&kai==1&MA<9)//如果处于开的状态并且数字小于9则按下增大键执行

{

delay(10);

if(INC==0&kai&MA<9)

{MA++;}

while(!INC)

{BEEP=1;}

BEEP=0;

}

if(DEC==0&kai&MA>1)

{

delay(10);

if(DEC==0&kai&MA>1)

{MA--;}

while(!DEC)

{BEEP=1;}

BEEP=0;

}

if(kai==1) //如果电源打开了,则将电源开的状态标志置1

{biaozhi=1;}

if(biaozhi==1&kai==0)//判断电源打开后被关闭,目的是只在开关键关闭时,写一次EEPROM,避免不停的擦写EEPROM

{ biaozhi=0;

iaperasesector(0x00);

programbyte(0x00,MA);

// 执行EEPROM写程

}

}

//主函数

Void main(void )

{

BEEP=0; //关闭蜂鸣器

iapreadbyte(0x00);//读出EEPROM的值

MA=dat;

if(MA<1|MA>9)//如果读出的值不在1-9范围内则强制为5.

{MA=5;}

while(1)

{

keycheck();//执行按键扫描程序

write_595(num[MA]);

write_595(num[MA]);

out_595();

}

}

这只是一个简单的读写一个字节的简单测试程序,对于扇区擦除的结果也没有进行验证。

想要验证需要在加一段代码。具体请参照STC的数据手册。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top