您当前的位置:五五电子网电子知识单片机-工控设备AVR单片机STC 单片机程序设计例程(IAP,ISP,KEIL工程) 正文
STC 单片机程序设计例程(IAP,ISP,KEIL工程)

STC 单片机程序设计例程(IAP,ISP,KEIL工程)

点击数:7233 次   录入时间:03-04 11:40:29   整理:http://www.55dianzi.com   AVR单片机

STC 单片机开发例程(IAP,ISP,KEIL工程)

部份内容

/****************************************************************
//MCS-51单片机底层EEPROM操作库。
//只在STC89C52单片机上实验


****************************************************************/

//#include "define_stc_flash.h"
#include "../inc/MCS_X51.H"
#include<intrins.h>
bit gint;
/*************************************************
//-----使能IAP----------------
*************************************************/
void flsh_en()
{
gint = EA;
INT_GLOBAL(0); //DISABLE INTERUPT

set_flsh_wait; //set wait time
set_flsh_en; //enable flash operate
}
/**************************************************
//停止IAP
**************************************************/
void flsh_ds()
{
set_flsh_ds;   //disable flash operate
set_flsh_trig(0); //dis trig
INT_GLOBAL(gint); //return global int
}

/*从flash中读出一个字节返回*/
UINT8 flsh_rd_byte(UINT16 addx)
{
set_flsh_addr(addx);
flsh_wr_cmd(CMD_READ);
    set_flsh_trig(TRIG1);
set_flsh_trig(TRIG2);
_nop_;
return(flsh_rd_data);
}
/******************************************
//从一个扇区内读出一串数据。
//传送参数:扇区内地址,读出个数,读出地址
********************************************/
bit flsh_sector_rd(UINT16 addx,UINT8 num,UINT8 *p)
{
UINT8 i;
if(num > USED_SPACE)
return(0);    //超出扇区范围,退出
flsh_en();
for(i = 0;i < num;i++)
{
   *p=flsh_rd_byte(addx + i);
   p++;
}
flsh_ds();   //禁止iap操作
return(1);
}

/***********************************************
//扇区擦除
***********************************************/
void flsh_sector_earse(UINT16 addx)
{
UINT16 sec_addr = 0xfe00;
sec_addr &= addx; //取得扇区首地址

set_flsh_addr(sec_addr);
flsh_en();
flsh_wr_cmd(CMD_SES); //扇区擦除命令
set_flsh_trig(TRIG1);
set_flsh_trig(TRIG2);
_nop_;
flsh_ds();
}
/***********************************************************
// 写一个字节并校验,如果写正确,返回1,否则返回0
***********************************************************/
bit flsh_wr_verify(UINT16 addx,UINT8 dax)
{
set_flsh_addr(addx);
flsh_wr_cmd(CMD_PGM);
flsh_wr_data(dax);    //写数据到iap的数据寄存器。
set_flsh_trig(TRIG1);
set_flsh_trig(TRIG2);
_nop_;
flsh_wr_data(0);      //使iap的数据寄存器改变,以便回读。
flsh_wr_cmd(CMD_READ);
set_flsh_trig(TRIG1);
set_flsh_trig(TRIG2);
_nop_;
if(flsh_rd_data == dax)
   return(1);
else
   return(0);
}
/**************************************************************************
//写一个扇区
//传送16位的目的地址,最好从扇区首地址开始,8位的数据长度,源数据的指针
**************************************************************************/
bit flsh_sector_wr(UINT16 addx,UINT8 num,UINT8 * pdax)
{
UINT8 i;
UINT16 addr;
if(num > USED_SPACE)
   return(0);     //超出扇区范围退出
addr = addx;
flsh_sector_earse(addx); //擦除目的扇区
flsh_en();
for(i=0;i<num;i++)
{
   if(!flsh_wr_verify(addr,*pdax))
   {
    flsh_ds(); //操作出错,返回前禁止flash操作
    return(0);
   }
   addr++;
   pdax++;
}
flsh_ds();   //写完毕禁止FLASH 操作
return(1);
}




本文关键字:工程  单片机程序  AVR单片机单片机-工控设备 - AVR单片机