久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3909|回復: 11
收起左側

stc單片機程序 EEPROM無法寫入0和1

[復制鏈接]
ID:956872 發表于 2021-8-31 19:14 | 顯示全部樓層 |閱讀模式
后面三種狀態都能寫入,掉電后正常讀取,為啥第一種狀態死活寫不進去呢,返回的一直都是FF。我把數據全部加1后測試,上電后默認第一種狀態點亮,也能掉電存儲了,其它幾種狀態都正常。當num從0或1開始就無法正常寫入,第一種狀態上電默認關閉,手動點亮后掉電無法存儲。只有num從2開始才正常。

單片機源程序如下:
#include <STC15F2K60S2.H>  
#include <intrins.h>  
#include "eeprom.h"

sbit K1=P3^2;
sbit K2=P3^3;
sbit l1=P1^4;
sbit l2=P1^5;
sbit l3=P1^6;

static unsigned char num=0;        

void Delay30ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 2;
        j = 67;
        k = 183;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}


void init()//中斷初始化
{
        IT0=1;//外部中斷0 跳變觸發
        EX0=1;//外部中斷0 p32
        EA=1;
}

void init0() interrupt 0//中斷程序 K1
{        
        if(K1==0)
        {
                Delay30ms();
                 if(K1==0)
     num=num+1;
     if(num>4){num=1;}               
          while(!K1);}
}
void lsd0()
{
        while(1)
        {
                if(num!=1){return;}
                 P1=0xfe;
        }
}
void lsd1()
{
        while(1)
        {  l3=0;
                if(num!=2){return;}
                           P1=0xfd;}
        }

void lsd2()
{
        while(1)
        { l2=0;
                if(num!=3){return;}
                    P1=0xfb;}
        }
void lsd3()
{
        while(1)
        {
                P1=0xf7;
                     if(num!=4)
         {return;}
        }

}

void main()
{ char v;
        init();
        v=IapReadByte(IAP_ADDRESS);
        num=v+1;
        while(1)
        {
                 
               
                        switch(num)
                        {
                         case 1:lsd0();
                                       P1=0xfe;
                                      if(IapReadByte(IAP_ADDRESS)!=1)
                                                        {IapEraseSector(IAP_ADDRESS);             // 擦除扇區
               IapProgramByte(IAP_ADDRESS,1);}               
                                      break;
                         case 2:lsd1();
               P1=0xfd;
                                                         if(IapReadByte(IAP_ADDRESS)!=2)
               {IapEraseSector(IAP_ADDRESS);             // 擦除扇區
               IapProgramByte(IAP_ADDRESS,2);}                                       
                                      break;
                         case 3:lsd2();
                                       P1=0xfb;
                                                         if(IapReadByte(IAP_ADDRESS)!=3)
                                       {IapEraseSector(IAP_ADDRESS);             // 擦除扇區
               IapProgramByte(IAP_ADDRESS,3);        }
                                       break;//num++;
                         case 4:lsd3();
                                       P1=0xf7;
                                                         if(IapReadByte(IAP_ADDRESS)!=4)
                                       {IapEraseSector(IAP_ADDRESS);             // 擦除扇區
               IapProgramByte(IAP_ADDRESS,4);}
                                        break;
                                default:break;
                        
                        }
                        
        }         
}

回復

使用道具 舉報

ID:57657 發表于 2021-8-31 23:13 | 顯示全部樓層
請將 eeprom.h 里的內容發上來
回復

使用道具 舉報

ID:57657 發表于 2021-8-31 23:22 | 顯示全部樓層
寫EEPROM 1可以寫成0,0不可寫成1,只有擦除才可以恢復為1(0xFF),一次至少擦1扇區(512字節)。
回復

使用道具 舉報

ID:956872 發表于 2021-9-1 06:44 | 顯示全部樓層
npn 發表于 2021-8-31 23:13
請將 eeprom.h 里的內容發上來

#ifndef __EEPROM_H_
#define __EEPROM_H_

typedef unsigned char BYTE;
typedef unsigned int WORD;
#define     FOSC    11059200UL
#define     BAUD    115200

#define CMD_IDLE    0               //空閑模式
#define CMD_READ    1               //IAP字節讀命令
#define CMD_PROGRAM 2               //IAP字節編程命令
#define CMD_ERASE   3               //IAP扇區擦除命令

//#define ENABLE_IAP 0x80           //if SYSCLK<30MHz
//#define ENABLE_IAP 0x81           //if SYSCLK<24MHz
//#define ENABLE_IAP  0x82            //if SYSCLK<20MHz
#define ENABLE_IAP 0x83           //if SYSCLK<12MHz
//#define ENABLE_IAP 0x84           //if SYSCLK<6MHz
//#define ENABLE_IAP 0x85           //if SYSCLK<3MHz
//#define ENABLE_IAP 0x86           //if SYSCLK<2MHz
//#define ENABLE_IAP 0x87           //if SYSCLK<1MHz

//測試地址
#define IAP_ADDRESS 0x0400


void IapIdle();
BYTE IapReadByte(WORD addr);
void IapProgramByte(WORD addr, BYTE dat);
void IapEraseSector(WORD addr);

#endif
回復

使用道具 舉報

ID:956872 發表于 2021-9-1 06:47 | 顯示全部樓層
npn 發表于 2021-8-31 23:22
寫EEPROM 1可以寫成0,0不可寫成1,只有擦除才可以恢復為1(0xFF),一次至少擦1扇區(512字節)。

那就是說只有擦除后恢復默認1,不能自己寫1是嗎,那就只能從2開始寫了?
回復

使用道具 舉報

ID:213173 發表于 2021-9-1 06:49 | 顯示全部樓層
  1. #include <STC15F2K60S2.H>  
  2. #include <intrins.h>  
  3. #include "eeprom.h"

  4. sbit K1=P3^2;
  5. sbit K2=P3^3;
  6. sbit l1=P1^4;
  7. sbit l2=P1^5;
  8. sbit l3=P1^6;

  9. static unsigned char num=0;        

  10. void Delay30ms()                //@11.0592MHz
  11. {
  12.         unsigned char i, j, k;
  13.         _nop_();
  14.         _nop_();
  15.         i = 2;
  16.         j = 67;
  17.         k = 183;
  18.         do
  19.         {
  20.                 do
  21.                 {
  22.                         while (--k);
  23.                 } while (--j);
  24.         } while (--i);
  25. }


  26. void init()//中斷初始化
  27. {
  28.         IT0=1;//外部中斷0 跳變觸發
  29.         EX0=1;//外部中斷0 p32
  30.         EA=1;
  31. }

  32. void init0() interrupt 0//中斷程序 K1
  33. {        
  34.         if(K1==0)
  35.         {
  36.                 Delay30ms();
  37.                 if(K1==0)
  38.                         num=num+1;
  39.                 if(num>4){num=1;}
  40.                 while(!K1);
  41.         }
  42. }

  43. void main()
  44. {
  45.         char v;
  46.         init();
  47.         num=IapReadByte(IAP_ADDRESS);//判斷數據在設定范圍
  48.         if(num>4||num<0)
  49.                 num=0;
  50.         v=num;        //數據保存在臨時變量v
  51.         P1=~num;//LED低電平顯示
  52.         while(1)
  53.         {
  54.                 if(num!=v)//判斷num有變化
  55.                 {
  56.                         IapEraseSector(IAP_ADDRESS);    // 擦除扇區
  57.                         IapProgramByte(IAP_ADDRESS,num);// 寫數據
  58.                         v=num;//數據保存在臨時變量v
  59.                         P1=~num;//LED低電平顯示
  60.                 }
  61.         }         
  62. }

復制代碼
回復

使用道具 舉報

ID:57657 發表于 2021-9-1 07:46 | 顯示全部樓層
PEB188 發表于 2021-9-1 06:47
那就是說只有擦除后恢復默認1,不能自己寫1是嗎,那就只能從2開始寫了?

1是二進制的1,懂?
回復

使用道具 舉報

ID:879348 發表于 2021-9-1 08:18 | 顯示全部樓層
先搞清楚基本概念
回復

使用道具 舉報

ID:130230 發表于 2021-9-1 11:23 | 顯示全部樓層
stc的不是eeprom是flash,擦除后才能重新寫。你這多半是擦除函數寫的有問題。
回復

使用道具 舉報

ID:956872 發表于 2021-9-2 17:25 | 顯示全部樓層
npn 發表于 2021-9-1 07:46
1是二進制的1,懂?

搞不懂,實際測試反正寫0和1都有問題,只有從2開始寫才能達到我想要的效果
回復

使用道具 舉報

ID:624769 發表于 2021-9-2 19:40 | 顯示全部樓層
PEB188 發表于 2021-9-2 17:25
搞不懂,實際測試反正寫0和1都有問題,只有從2開始寫才能達到我想要的效果

我看你關于這類問題,開了好幾個帖子了。
建議:
你先別搞的這么復雜,寫個最簡單的串口發數據,讓Eeprom寫,然后,讓Eeprom讀出來給你串口發回來。STC的下載器里有例程,你先確保能正確讀寫了,再搞其他的。
回復

使用道具 舉報

ID:956872 發表于 2021-9-2 21:16 | 顯示全部樓層
188610329 發表于 2021-9-2 19:40
我看你關于這類問題,開了好幾個帖子了。
建議:
你先別搞的這么復雜,寫個最簡單的串口發數據,讓Eepr ...

現在不自己去輸入,直接寫入變量名,變量從1到100的,到是沒啥問題了,正常擦寫讀取了。也有可能之前讀取數值的地方改來改去改的有問題
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩成人精品 | 国产资源网 | 狠狠操狠狠干 | 欧美在线视频二区 | 在线日韩欧美 | 国产亚洲精品久久19p | 国产精品视频一 | 欧美aaa一级片 | 欧美精品成人一区二区三区四区 | 欧美九九九| 久久久www成人免费精品 | 亚洲精品日日夜夜 | 国产在线高清 | 九九久久精品 | 羞羞的视频在线观看 | 国产免费让你躁在线视频 | 北条麻妃av一区二区三区 | 日韩成人精品一区 | 亚洲天堂男人的天堂 | heyzo在线| 久在线精品视频 | 成人欧美一区二区 | 视频一区二区三区四区五区 | 精品美女久久久 | 国产精品久久久久久高潮 | 国产99视频精品免费播放照片 | 99re视频| 欧美一级久久 | 国产精品久久久久久久久久妞妞 | 国产精品一区二区精品 | 特黄毛片 | 91视频大全| 精品中文字幕一区二区三区 | 色婷婷激情综合 | 欧美精品乱码99久久影院 | 色姑娘综合网 | 中文字幕免费视频 | 最新中文字幕第一页视频 | 亚洲国产激情 | 国产精品视频在线免费观看 | 国产精品网页 |