找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4243|回复: 2
打印 上一主题 下一主题
收起左侧

怎么操作STC89C51的内部EEPROM呀

[复制链接]
跳转到指定楼层
楼主
ID:218601 发表于 2017-7-10 20:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2017-7-10 21:34 | 只看该作者
#include <intrins.h>
#include <reg52.h>      //52系列单片机头文件
#define uchar unsigned char
#define uint unsigned int
#define RdCommand 0x01 //定义ISP的操作命令
#define PrgCommand 0x02
#define EraseCommand 0x03
#define Error 1
#define Ok 0
#define WaitTime 0x01 //定义CPU的等待时间
sfr ISP_DATA=0xe2;  //寄存器申明
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_CMD=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;
sbit dula=P2^6;  //申明U1锁存器的锁存端
sbit wela=P2^7;  //申明U2锁存器的锁存端
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar num;
void delayms(uint xms)   
{
uint i,j;
for(i=xms;i>0;i--)        //i=xms即延时约xms毫秒
  for(j=110;j>0;j--);
}
void display(uchar shi,uchar ge)  //显示子函数
{
    dula=1;
P0=table[shi];    //送十位段选数据
dula=0;
P0=0xff;  //送位选数据前关闭所有显示,防止打开位选锁存时
wela=1;  //原来段选数据通过位选锁存器造成混乱
P0=0xfe;  //送位选数据
wela=0;
delayms(5); //延时
dula=1;
P0=table[ge];  //送个位段选数据
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(5);
}
/* ================ 打开 ISP,IAP 功能 ================= */
void ISP_IAP_enable(void)
{
EA = 0;       /* 关中断   */
ISP_CONTR = ISP_CONTR & 0x18;       /* 0001,1000 */
ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时 */
ISP_CONTR = ISP_CONTR | 0x80;       /* ISPEN=1  */
}
/* =============== 关闭 ISP,IAP 功能 ================== */
void ISP_IAP_disable(void)
{
ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
ISP_TRIG = 0x00;
EA   =   1;   /* 开中断 */
}
/* ================ 公用的触发代码 ==================== */
void ISPgoon(void)
{
ISP_IAP_enable();   /* 打开 ISP,IAP 功能 */
ISP_TRIG = 0x46;  /* 触发ISP_IAP命令字节1 */
ISP_TRIG = 0xb9;  /* 触发ISP_IAP命令字节2 */
_nop_();
}
/* ==================== 字节读 ======================== */
unsigned char byte_read(unsigned int byte_addr)
{
ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址赋值 */
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
ISP_CMD   = ISP_CMD & 0xf8;   /* 清除低3位  */
ISP_CMD   = ISP_CMD | RdCommand; /* 写入读命令 */
ISPgoon();       /* 触发执行  */
ISP_IAP_disable();    /* 关闭ISP,IAP功能 */
return (ISP_DATA);    /* 返回读到的数据 */
}
/* ================== 扇区擦除 ======================== */
void SectorErase(unsigned int sector_addr)
{
unsigned int iSectorAddr;
iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */
ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xf8;   /* 清空低3位  */
ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3  */
ISPgoon();       /* 触发执行  */
ISP_IAP_disable();    /* 关闭ISP,IAP功能 */
}
/* ==================== 字节写 ======================== */
void byte_write(unsigned int byte_addr, unsigned char original_data)
{
ISP_ADDRH = (unsigned char)(byte_addr >> 8);  /* 取地址  */
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
ISP_CMD  = ISP_CMD & 0xf8;    /* 清低3位 */
ISP_CMD  = ISP_CMD | PrgCommand;  /* 写命令2 */
ISP_DATA = original_data;   /* 写入数据准备 */
ISPgoon();       /* 触发执行  */
ISP_IAP_disable();     /* 关闭IAP功能 */
}
void main()
{
uchar a,b,num1;
TMOD=0x01; //设置定时器0为工作方式1(0000 0001)
TH0=(65536-50000)/256;     
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
num1=byte_read(0x2000);//程序开始时读取EEPROM中数据
if(num1>=60) //防止首次上电时读取出错
  num1=0;
while(1)
{
  if(num>=20)
  {
   num=0;
   num1++;
   SectorErase(0x2000);//擦除扇区
   byte_write(0x2000,num1);//重新写入数据
   if(num1==60)
   {
    num1=0;
   }
   a=num1/10;
   b=num1%10;
  }
  display(a,b);
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
}
回复

使用道具 举报

板凳
ID:164602 发表于 2017-7-11 08:29 | 只看该作者
  1. STC90/89系列内部EEPROM测试程序(旧C语言版)
  2. /* ---  STC International Limited ---------------- */
  3. /* ---  宏晶科技 姚永平  设计 2004/9/11   V1.0 --- */
  4. /* ---  宏晶科技 姚永平  设计 2004/12/4   V2.0 --- */
  5. /* ---  RD+/RC系列   Flash IAP/ISP Operation ----- */
  6. /* ---  STC89C54RD+, STC89C58RD+,              --- */
  7. /* ---  STC89LE54RD+,STC89LE58RD+,              -- */
  8. /* ---  STC89C51RC,  STC89C52RC,             ----- */
  9. /* ---  STC89LE51RC, STC89LE52RC,             ---- */
  10. /* ---  Mobile: 13922805190 ---------------------- */
  11. /* ---  Fax: 0755-82944243 ----------------------- */
  12. /* ---  Tel: 0755-82908285 ----------------------- */
  13. /* ---  感谢网友2004/12/3的指正,送样品以示感谢 --- */
  14. #include <reg52.h>
  15. #include <intrins.h>        /* use _nop_() function */
  16. //sfr16 DPTR = 0x82;

  17. /*        新增特殊功能寄存器定义        */
  18. sfr         ISP_DATA        =   0xe2;
  19. sfr     ISP_ADDRH        =   0xe3;  
  20. sfr         ISP_ADDRL        =   0xe4;
  21. sfr         ISP_CMD        =   0xe5;
  22. sfr         ISP_TRIG        =   0xe6;   
  23. sfr         ISP_CONTR    =   0xe7;


  24. /* 定义命令 */
  25. #define READ_AP_and_Data_Memory_Command                                0x01        /*  字节读数据存储区   */
  26. #define PROGRAM_AP_and_Data_Memory_Command          0x02        /*  字节编程数据存储区 */
  27. #define SECTOR_ERASE_AP_and_Data_Memory_Command     0x03        /*  扇区擦除数据存储区 */

  28. typedef     unsigned char        INT8U;                /* 8 bit 无符号整型  */
  29. typedef     unsigned int    INT16U;     /* 16 bit 无符号整型 */
  30. #define                DELAY_CONST         60000

  31. /* 定义常量 */
  32. #define ERROR   0
  33. #define OK      1

  34. sbit        Begin_LED       =                P1^0;
  35. sbit        ERROR_LED       =       P1^3;
  36. sbit        OK_LED                        =       P1^7;

  37. /* 定义Flash 操作等待时间 */
  38. #define        MCU_CLOCK_40MHz
  39. //#define         MCU_CLOCK_20MHz
  40. //#define        MCU_CLOCK_10MHz
  41. //#define        MCU_CLOCK_5MHz
  42. #ifdef MCU_CLOCK_40MHz
  43.         #define WAIT_TIME        0x00
  44. #endif
  45. #ifdef MCU_CLOCK_20MHz
  46.         #define WAIT_TIME        0x01
  47. #endif
  48. #ifdef MCU_CLOCK_10MHz
  49.         #define WAIT_TIME        0x02
  50. #endif
  51. #ifdef MCU_CLOCK_5MHz
  52.         #define WAIT_TIME        0x03
  53. #endif

  54. /* 调试控制项 */
  55. //#define         DEBUG_STC89C_LE58RD+

  56. #define         DEBUG_STC89C_LE52RC

  57. //#define USED_BYTE_QTY_IN_ONE_SECTOR                1
  58. //#define USED_BYTE_QTY_IN_ONE_SECTOR                2
  59. //#define USED_BYTE_QTY_IN_ONE_SECTOR                4
  60. //#define USED_BYTE_QTY_IN_ONE_SECTOR                8
  61. //#define USED_BYTE_QTY_IN_ONE_SECTOR                16
  62. //#define USED_BYTE_QTY_IN_ONE_SECTOR                32
  63. //#define USED_BYTE_QTY_IN_ONE_SECTOR                64
  64. #define USED_BYTE_QTY_IN_ONE_SECTOR                128
  65. //#define USED_BYTE_QTY_IN_ONE_SECTOR                256
  66. //#define USED_BYTE_QTY_IN_ONE_SECTOR                512

  67. INT8U xdata protect_buffer[USED_BYTE_QTY_IN_ONE_SECTOR];

  68. #ifdef DEBUG_STC89C_LE58RD+                        //STC89C58RD+,  89LE58RD+
  69.         #define DEBUG_AP_Memory_Begin_Sector_addr                0x0000
  70.         #define DEBUG_AP_Memory_End_Sector_addr         0x7e00
  71.         #define DEBUG_AP_Memory_End_Byte_addr           0x7fff

  72.         #define DEBUG_Data_Memory_Begin_Sector_addr     0x8000
  73. #endif
  74. #ifdef DEBUG_STC89C_LE52RC                        //STC89C52RC,        89LE52RC
  75.         #define DEBUG_AP_Memory_Begin_Sector_addr                0x0000
  76.         #define DEBUG_AP_Memory_End_Sector_addr                        0x1e00
  77.         #define DEBUG_AP_Memory_End_Byte_addr                        0x1fff

  78.         #define DEBUG_Data_Memory_Begin_Sector_addr                0x2000
  79. #endif


  80. /* 打开 ISP,IAP 功能 */
  81. void ISP_IAP_enable(void)
  82. {
  83.         EA        =        0;        /* 关中断 */
  84.         ISP_CONTR        =        ISP_CONTR & 0x18;       /* 0001,1000 */
  85.         ISP_CONTR        =        ISP_CONTR | WAIT_TIME;
  86.         ISP_CONTR        =        ISP_CONTR | 0x80;       /* 1000,0000 */
  87. }

  88. /* 关闭 ISP,IAP 功能 */
  89. void ISP_IAP_disable(void)
  90. {
  91.         ISP_CONTR        =        ISP_CONTR & 0x7f;        /* 0111,1111 */
  92.         ISP_TRIG        =        0x00;
  93.         EA                        =   1;                        /* 开中断 */
  94. }

  95. /* 字节读 */
  96. INT8U byte_read(INT16U byte_addr)
  97. {
  98.         ISP_ADDRH        =        (INT8U)(byte_addr >> 8);
  99.         ISP_ADDRL        =        (INT8U)(byte_addr & 0x00ff);

  100.         ISP_CMD                =        ISP_CMD        &        0xf8;        /* 1111,1000 */
  101.         ISP_CMD                =        ISP_CMD        |        READ_AP_and_Data_Memory_Command;        /* 0000,0001 */

  102.         ISP_IAP_enable();

  103.         ISP_TRIG        =        0x46;
  104.         ISP_TRIG        =        0xb9;
  105.         _nop_();

  106.         ISP_IAP_disable();
  107.         return (ISP_DATA);
  108. }

  109. /* 扇区擦除 */
  110. INT8U sector_erase(INT16U sector_addr)
  111. {
  112.         INT16U get_sector_addr        =        0;
  113.         get_sector_addr                        =        (sector_addr & 0xfe00); /* 1111,1110,0000,0000; 取扇区地址 */
  114.         ISP_ADDRH                        =        (INT8U)(get_sector_addr >> 8);
  115.         ISP_ADDRL                        =        0x00;

  116.         ISP_CMD        =        ISP_CMD        &        0xf8;        /* 1111,1000 */
  117.         ISP_CMD        =        ISP_CMD        |        SECTOR_ERASE_AP_and_Data_Memory_Command;        /* 0000,0011 */

  118.         ISP_IAP_enable();
  119.         ISP_TRIG        =        0x46;        /* 触发ISP_IAP命令 */
  120.         ISP_TRIG        =        0xb9;        /* 触发ISP_IAP命令 */
  121.          _nop_();

  122.         ISP_IAP_disable();
  123.         return OK;
  124. }

  125. /* 字节编程 */
  126. INT8U byte_program(INT16U byte_addr, INT8U original_data)
  127. {
  128.         ISP_ADDRH        =        (INT8U)(byte_addr >> 8);
  129.         ISP_ADDRL        =        (INT8U)(byte_addr & 0x00ff);

  130.         ISP_CMD                =        ISP_CMD        &        0xf8;        /* 1111,1000 */
  131.         ISP_CMD                =        ISP_CMD        |        PROGRAM_AP_and_Data_Memory_Command;                /* 0000,0010 */
  132.         ISP_DATA        =        original_data;

  133.         ISP_IAP_enable();
  134.         ISP_TRIG        =        0x46;        /* 触发ISP_IAP命令 */
  135.         ISP_TRIG        =        0xb9;        /* 触发ISP_IAP命令 */
  136.         _nop_();

  137.         ISP_IAP_disable();
  138.         return        OK;
  139. }

  140. /* 字节编程并校验 */
  141. INT8U byte_program_and_verify(INT16U byte_addr, INT8U original_data)
  142. {
  143.         ISP_ADDRH        =        (INT8U)(byte_addr >> 8);
  144.         ISP_ADDRL        =        (INT8U)(byte_addr & 0x00ff);

  145.         ISP_CMD                =        ISP_CMD        &        0xf8;        /* 1111,1000 */
  146.         ISP_CMD                =        ISP_CMD        |        PROGRAM_AP_and_Data_Memory_Command;        /* 0000,0010 */
  147.         ISP_DATA        =        original_data;

  148.         ISP_IAP_enable();

  149.         ISP_TRIG        =        0x46;
  150.         ISP_TRIG        =        0xb9;
  151.         _nop_();

  152.         ISP_DATA        =        0x00;

  153.         ISP_CMD                =        ISP_CMD        &        0xf8;        /* 1111,1000 */
  154.         ISP_CMD                =        ISP_CMD        |        READ_AP_and_Data_Memory_Command;        /* 0000,0001 */

  155.         ISP_TRIG        =        0x46;        /* 触发ISP_IAP命令 */
  156.         ISP_TRIG        =        0xb9;        /* 触发ISP_IAP命令 */
  157.         _nop_();

  158.         ISP_IAP_disable();

  159.         if(ISP_DATA        ==        original_data)
  160.                 return        OK;
  161.         else
  162.                 return        ERROR;
  163. }

  164. /* 写数据进 数据Flash存储器, 只在同一个扇区内写,不保留原有数据        */
  165. /* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源        */
  166. INT8U sequential_write_flash_in_one_sector(INT16U begin_addr, INT16U counter, INT8U array[])
  167. {
  168.         INT16U        i        =        0;
  169.         INT16U        in_sector_begin_addr        =        0;
  170.         INT16U        sector_addr        =        0;

  171.         /* 判是否是有效范围,此函数不允许跨扇区操作 */
  172.         if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
  173.                 return        ERROR;
  174.         in_sector_begin_addr =        begin_addr & 0x01ff;         /* 0000,0001,1111,1111 */
  175.         if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
  176.                 return ERROR;

  177.     /* 擦除 要修改/写入 的扇区 */
  178.         sector_addr        =        (begin_addr & 0xfe00);        /* 1111,1110,0000,0000; 取扇区地址 */
  179.         ISP_ADDRH        =        (INT8U)(sector_addr >> 8);
  180.         ISP_ADDRL        =        0x00;
  181.         ISP_CMD                =        ISP_CMD        &        0xf8;                /* 1111,1000 */
  182.         ISP_CMD                =        ISP_CMD        |        SECTOR_ERASE_AP_and_Data_Memory_Command;        /* 0000,0011 */

  183.         ISP_IAP_enable();
  184.         ISP_TRIG        =        0x46;        /* 触发ISP_IAP命令 */
  185.         ISP_TRIG        =        0xb9;        /* 触发ISP_IAP命令 */
  186.         _nop_();

  187.         for(i = 0; i< counter; i++)
  188.         {
  189.                 /* 写一个字节 */
  190.                 ISP_ADDRH        =        (INT8U)(begin_addr >> 8);
  191.                 ISP_ADDRL        =        (INT8U)(begin_addr & 0x00ff);
  192.                 ISP_DATA        =        array[i];
  193.                 ISP_CMD                =        ISP_CMD        &        0xf8;        /* 1111,1000 */
  194.                 ISP_CMD                =        ISP_CMD        |        PROGRAM_AP_and_Data_Memory_Command;                /* 0000,0010 */

  195.                 ISP_TRIG        =        0x46;        /* 触发ISP_IAP命令 */
  196.                 ISP_TRIG        =        0xb9;        /* 触发ISP_IAP命令 */
  197.                 _nop_();

  198.                 /* 读回来 */
  199.                 ISP_DATA        =        0x00;

  200.                 ISP_CMD                =        ISP_CMD        &        0xf8;        /* 1111,1000 */
  201.                 ISP_CMD     =        ISP_CMD        |        READ_AP_and_Data_Memory_Command;        /* 0000,0001 */

  202.                 ISP_TRIG        =        0x46;        /* 触发ISP_IAP命令 */
  203.                 ISP_TRIG        =        0xb9;        /* 触发ISP_IAP命令 */
  204.                 _nop_();

  205.                 /*  比较对错 */
  206.                 if(ISP_DATA != array[i])
  207.                 {
  208.                         ISP_IAP_disable();
  209.                         return ERROR;
  210.                 }
  211.         begin_addr++;
  212.         }
  213.         ISP_IAP_disable();
  214.         return        OK;
  215. }

  216. /* 写数据进数据Flash存储器(EEPROM), 只在同一个扇区内写,保留同一扇区中不需修改的数据        */
  217. /* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源                */
  218. INT8U write_flash_with_protect_in_one_sector(INT16U begin_addr, INT16U counter, INT8U array[])
  219. {
  220.         INT16U        i        =        0;
  221.         INT16U        in_sector_begin_addr        =        0;
  222.         INT16U        sector_addr        =        0;
  223.         INT16U        byte_addr        =        0;

  224.         /* 判是否是有效范围,此函数不允许跨扇区操作 */
  225.         if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
  226.                 return ERROR;
  227.         in_sector_begin_addr =        begin_addr & 0x01ff;         /* 0000,0001,1111,1111 */
  228.         /* 假定从扇区的第0个字节开始,到USED_BYTE_QTY_IN_ONE_SECTOR-1个字节结束,后面部分不用,程序易编写        */
  229.         if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
  230.                 return ERROR;

  231.         /* 将该扇区数据 0 - (USED_BYTE_QTY_IN_ONE_SECTOR-1) 字节数据读入缓冲区保护 */
  232.         sector_addr                =        (begin_addr & 0xfe00);         /* 1111,1110,0000,0000; 取扇区地址                */
  233.         byte_addr                =   sector_addr;                        /* 扇区地址为扇区首字节地址                                 */

  234.         ISP_IAP_enable();
  235.         for(i = 0; i < USED_BYTE_QTY_IN_ONE_SECTOR; i++)
  236.         {
  237.                 ISP_ADDRH        =        (INT8U)(byte_addr >> 8);
  238.                 ISP_ADDRL        =        (INT8U)(byte_addr & 0x00ff);

  239.                 ISP_CMD                =        ISP_CMD        &        0xf8;        /* 1111,1000 */
  240.                 ISP_CMD                =        ISP_CMD        |        READ_AP_and_Data_Memory_Command;        /* 0000,0001 */

  241.                 ISP_TRIG        =        0x46;
  242.                 ISP_TRIG        =        0xb9;
  243.                 _nop_();

  244.                 protect_buffer[i]        =        ISP_DATA;
  245.                 byte_addr++;
  246.         }

  247.         /* 将要写入的数据写入保护缓冲区的相应区域,其余部分保留 */
  248.         for(i = 0; i < counter; i++)
  249.         {
  250.                 protect_buffer[in_sector_begin_addr] = array[i];
  251.                 in_sector_begin_addr++;
  252.         }

  253.         /* 擦除 要修改/写入 的扇区 */
  254.         ISP_ADDRH        =        (INT8U)(sector_addr >> 8);
  255.         ISP_ADDRL        =        0x00;
  256.         ISP_CMD                =        ISP_CMD        &        0xf8;        /* 1111,1000 */
  257.         ISP_CMD                =        ISP_CMD        |        SECTOR_ERASE_AP_and_Data_Memory_Command;        /* 0000,0011 */

  258.         ISP_TRIG        =        0x46;        /* 触发ISP_IAP命令 */
  259.         ISP_TRIG        =        0xb9;        /* 触发ISP_IAP命令 */
  260.         _nop_();

  261.         /* 将保护缓冲区的数据写入 Data Flash, EEPROM */
  262.         byte_addr        =   sector_addr;                        /* 扇区地址为扇区首字节地址        */
  263.         for(i = 0; i< USED_BYTE_QTY_IN_ONE_SECTOR; i++)
  264.         {
  265.                 /* 写一个字节 */
  266.                 ISP_ADDRH        =        (INT8U)(byte_addr >> 8);
  267.                 ISP_ADDRL        =        (INT8U)(byte_addr & 0x00ff);
  268.                 ISP_DATA        =        protect_buffer[i];
  269.                 ISP_CMD                =        ISP_CMD        &        0xf8;        /* 1111,1000 */
  270.                 ISP_CMD                =        ISP_CMD        |        PROGRAM_AP_and_Data_Memory_Command;                /* 0000,0010 */

  271.                 ISP_TRIG        =        0x46;        /* 触发ISP_IAP命令 */
  272.                 ISP_TRIG        =        0xb9;        /* 触发ISP_IAP命令 */
  273.                 _nop_();

  274.                 /* 读回来 */
  275.                 ISP_DATA        =        0x00;

  276.                 ISP_CMD                =        ISP_CMD        &        0xf8;        /* 1111,1000 */
  277.                 ISP_CMD                =        ISP_CMD        |        READ_AP_and_Data_Memory_Command;        /* 0000,0001 */

  278.                 ISP_TRIG        =        0x46;        /* 触发ISP_IAP命令 */
  279.                 ISP_TRIG        =        0xb9;        /* 触发ISP_IAP命令 */
  280.                 _nop_();

  281.                 /*  比较对错 */
  282.                 if(ISP_DATA != protect_buffer[i])
  283.                 {
  284.                         ISP_IAP_disable();
  285.                         return ERROR;
  286.         }
  287.         byte_addr++;
  288.         }
  289.         ISP_IAP_disable();
  290.         return OK;
  291. }

  292. /* 测试常量数组 */
  293. INT8U code Test_array_total[512]        =
  294. {
  295.         0x00,        0x01,        0x02,        0x03,        0x04,        0x05,        0x06,        0x07,
  296.         0x08,        0x09,        0x0a,        0x0b,        0x0c,        0x0d,        0x0e,        0x0f,
  297.         0x10,        0x11,        0x12,        0x13,        0x14,        0x15,        0x16,        0x17,
  298.         0x18,        0x19,        0x1a,        0x1b,        0x1c,        0x1d,        0x1e,        0x1f,
  299.         0x20,        0x21,        0x22,        0x23,        0x24,        0x25,        0x26,        0x27,
  300.         0x28,        0x29,        0x2a,        0x2b,        0x2c,        0x2d,        0x2e,        0x2f,
  301.         0x30,        0x31,        0x32,        0x33,        0x34,        0x35,        0x36,        0x37,
  302.         0x38,        0x39,        0x3a,        0x3b,        0x3c,        0x3d,        0x3e,        0x3f,
  303.         0x40,        0x41,        0x42,        0x43,        0x44,        0x45,        0x46,        0x47,
  304.         0x48,        0x49,        0x4a,        0x4b,        0x4c,        0x4d,        0x4e,        0x4f,
  305.         0x50,        0x51,        0x52,        0x53,        0x54,        0x55,        0x56,        0x57,
  306.         0x58,        0x59,        0x5a,        0x5b,        0x5c,        0x5d,        0x5e,        0x5f,
  307.         0x60,        0x61,        0x62,        0x63,        0x64,        0x65,        0x66,        0x67,
  308.         0x68,        0x69,        0x6a,        0x6b,        0x6c,        0x6d,        0x6e,        0x6f,
  309.         0x70,        0x71,        0x72,        0x73,        0x74,        0x75,        0x76,        0x77,
  310.         0x78,        0x79,        0x7a,        0x7b,        0x7c,        0x7d,        0x7e,        0x7f,
  311.         0x80,        0x81,        0x82,        0x83,        0x84,        0x85,        0x86,        0x87,
  312.         0x88,        0x89,        0x8a,        0x8b,        0x8c,        0x8d,        0x8e,        0x8f,
  313.         0x90,        0x91,        0x92,        0x93,        0x94,        0x95,        0x96,        0x97,
  314.         0x98,        0x99,        0x9a,        0x9b,        0x9c,        0x9d,        0x9e,        0x9f,
  315.         0xa0,        0xa1,        0xa2,        0xa3,        0xa4,        0xa5,        0xa6,        0xa7,
  316.         0xa8,        0xa9,        0xaa,        0xab,        0xac,        0xad,        0xae,        0xaf,
  317.         0xb0,        0xb1,        0xb2,        0xb3,        0xb4,        0xb5,        0xb6,        0xb7,
  318.         0xb8,        0xb9,        0xba,        0xbb,        0xbc,        0xbd,        0xbe,        0xbf,
  319.         0xc0,        0xc1,        0xc2,        0xc3,        0xc4,        0xc5,        0xc6,        0xc7,
  320.         0xc8,        0xc9,        0xca,        0xcb,        0xcc,        0xcd,        0xce,        0xcf,
  321.         0xd0,        0xd1,        0xd2,        0xd3,        0xd4,        0xd5,        0xd6,        0xd7,
  322.         0xd8,        0xd9,        0xda,        0xdb,        0xdc,        0xdd,        0xde,        0xdf,
  323.         0xe0,        0xe1,        0xe2,        0xe3,        0xe4,        0xe5,        0xe6,        0xe7,
  324.         0xe8,        0xe9,        0xea,        0xeb,        0xec,        0xed,        0xee,        0xef,
  325.         0xf0,        0xf1,        0xf2,        0xf3,        0xf4,        0xf5,        0xf6,        0xf7,
  326.         0xf8,        0xf9,        0xfa,        0xfb,        0xfc,        0xfd,        0xfe,        0xff,
  327.         0xff,        0xfe,        0xfd,        0xfc,        0xfb,        0xfa,        0xf9,        0xf8,
  328.         0xf7,        0xf6,        0xf5,        0xf4,        0xf3,        0xf2,        0xf1,        0xf0,
  329.         0xef,        0xee,        0xed,        0xec,        0xeb,        0xea,        0xe9,        0xe8,
  330.         0xe7,        0xe6,        0xe5,        0xe4,        0xe3,        0xe2,        0xe1,        0xe0,
  331.         0xdf,        0xde,        0xdd,        0xdc,        0xdb,        0xda,        0xd9,        0xd8,
  332.         0xd7,        0xd6,        0xd5,        0xd4,        0xd3,        0xd2,        0xd1,        0xd0,
  333.         0xcf,        0xce,        0xcd,        0xcc,        0xcb,        0xca,        0xc9,        0xc8,
  334.         0xc7,        0xc6,        0xc5,        0xc4,        0xc3,        0xc2,        0xc1,        0xc0,
  335.         0xbf,        0xbe,        0xbd,        0xbc,        0xbb,        0xba,        0xb9,        0xb8,
  336.         0xb7,        0xb6,        0xb5,        0xb4,        0xb3,        0xb2,        0xb1,        0xb0,
  337.         0xaf,        0xae,        0xad,        0xac,        0xab,        0xaa,        0xa9,        0xa8,
  338.         0xa7,        0xa6,        0xa5,        0xa4,        0xa3,        0xa2,        0xa1,        0xa0,
  339.         0x9f,        0x9e,        0x9d,        0x9c,        0x9b,        0x9a,        0x99,        0x98,
  340.         0x97,        0x96,        0x95,        0x94,        0x93,        0x92,        0x91,        0x90,
  341.         0x8f,        0x8e,        0x8d,        0x8c,        0x8b,        0x8a,        0x89,        0x88,
  342.         0x87,        0x86,        0x85,        0x84,        0x83,        0x82,        0x81,        0x80,
  343.         0x7f,        0x7e,        0x7d,        0x7c,        0x7b,        0x7a,        0x79,        0x78,
  344.         0x77,        0x76,        0x75,        0x74,        0x73,        0x72,        0x71,        0x70,
  345.         0x6f,        0x6e,        0x6d,        0x6c,        0x6b,        0x6a,        0x69,        0x68,
  346.         0x67,        0x66,        0x65,        0x64,        0x63,        0x62,        0x61,        0x60,
  347.         0x5f,        0x5e,        0x5d,        0x5c,        0x5b,        0x5a,        0x59,        0x58,
  348.         0x57,        0x56,        0x55,        0x54,        0x53,        0x52,        0x51,        0x50,
  349.         0x4f,        0x4e,        0x4d,        0x4c,        0x4b,        0x4a,        0x49,        0x48,
  350.         0x47,        0x46,        0x45,        0x44,        0x43,        0x42,        0x41,        0x40,
  351.         0x3f,        0x3e,        0x3d,        0x3c,        0x3b,        0x3a,        0x39,        0x38,
  352.         0x33,        0x36,        0x35,        0x34,        0x33,        0x32,        0x31,        0x30,
  353.         0x2f,        0x2e,        0x2d,        0x2c,        0x2b,        0x2a,        0x29,        0x28,
  354.         0x27,        0x26,        0x25,        0x24,        0x23,        0x22,        0x21,        0x20,
  355.         0x1f,        0x1e,        0x1d,        0x1c,        0x1b,        0x1a,        0x19,        0x18,
  356.         0x17,        0x16,        0x15,        0x14,        0x13,        0x12,        0x11,        0x10,
  357.         0x0f,        0x0e,        0x0d,        0x0c,        0x0b,        0x0a,        0x09,        0x08,
  358.         0x07,        0x06,        0x05,        0x04,        0x03,        0x02,        0x01,        0x00
  359. };

  360. void display_Begin_LED(void)
  361. {
  362.         Begin_LED        =        0;  /* Begin_LED on */
  363. }
  364. void off_Begin_LED(void)
  365. {
  366.         Begin_LED        =        1;  /* Begin_LED off */
  367. }
  368. void display_OK_LED(void)
  369. {
  370.         OK_LED                =        0;  /* OK_LED on */
  371. }
  372. void off_OK_LED(void)
  373. {
  374.         OK_LED                =        1;  /* OK_LED off */
  375. }

  376. void display_ERROR_LED(void)
  377. {
  378.         ERROR_LED        =        0;  /* ERROR_LED on */
  379. }
  380. void off_ERROR_LED(void)
  381. {
  382.         ERROR_LED        =        1;  /* ERROR_LED off */
  383. }

  384. void delay(INT16U counter)
  385. {
  386.         INT16U        temp        =        0;
  387.         for(temp = counter; temp>0; temp--)
  388.         {
  389.                 _nop_();
  390.                 _nop_();
  391.                 _nop_();
  392.         }
  393. }

  394. void main()
  395. {
  396. //sbit        Begin_LED        =        P1^0;
  397. //sbit        ERROR_LED        =        P1^3;
  398. //sbit        OK_LED        =        P1^7;

  399.         display_Begin_LED();
  400.         delay(DELAY_CONST);

  401.         sector_erase(DEBUG_Data_Memory_Begin_Sector_addr);
  402.         if(byte_program_and_verify(DEBUG_Data_Memory_Begin_Sector_addr,0x55) == OK)
  403.                 display_OK_LED();
  404.         else
  405.                 display_ERROR_LED();

  406. /*
  407.         if(sequential_write_flash_in_one_sector(DEBUG_Data_Memory_Begin_Sector_addr, USED_BYTE_QTY_IN_ONE_SECTOR, Test_array_total))
  408.                 display_OK_LED();
  409.         else
  410.                 display_ERROR_LED();
  411. */
  412. /*
  413.         if(write_flash_with_protect_in_one_sector(DEBUG_Data_Memory_Begin_Sector_addr+0x3, USED_BYTE_QTY_IN_ONE_SECTOR-0x30, Test_array_total))
  414.                 display_OK_LED();
  415.         else
  416.                 display_ERROR_LED();
  417. */
  418.         while(1);
  419. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表