找回密码
 注册
关于网站域名变更的通知
查看: 411|回复: 1
打印 上一主题 下一主题

单片机EEPROM存储灯状态开机后读取显示不正确

[复制链接]
  • TA的每日心情
    开心
    2019-11-21 15:51
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2019-11-22 10:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    参照手册写的,两个按键,两个灯,LED3是测试的,按键1灯1亮,然后存储到EEPROM,重新上电后读取EEPROM,然后显示关机前状态,但是现在情况是不显示,重新上电后灯是全灭的。
    8 y, e$ L( y7 n: G" c8 [5 E程序如下:# Q3 U/ ^0 m0 y
    #include <STC12C5A60S2.h>
    . ^8 s0 B! o2 K2 `# l#include <intrins.h>$ C/ n8 k7 n3 L8 ?( H+ }# I
    #define uchar unsigned char
    ; i: ]3 j  U# L: R' Q#define uint unsigned int3 R8 ^* D; ~6 w
    sbit LED1 = P2^0;
    4 @5 R* H) T+ O4 o; W8 X8 ssbit LED2 = P2^1;5 O# H* j  M9 W( A; w; U$ X/ ~) L
    sbit LED3=P2^2;. w, r6 m' ?% O: Q4 b) X( K4 L& Q
    sbit K1 = P3^2; //按钮1) J5 K: d( m/ G
    sbit K2 = P3^3; //按钮2
    5 d. @$ `- ?; c. q: \3 g# ?, s8 gvoid cc(uint addr);
    9 G  n* I, ?2 e! e  ?$ L9 [void xcx(uint addr,uchar dat);
    # a# i/ g) ]3 Duchar dcx(uint addr);8 [0 [6 ]# ~# d* e- O
    void Q0();* Z2 I# Q9 ~# D" [& l
    uchar V;
    " o: [, G6 G0 z9 Yvoid delay(uint time)
    $ U  V9 `* m+ M+ `$ w0 I% u{
    & w1 d! d  p% U5 [0 {: t        uint i,j;8 y9 B9 P3 o  }
            for(i=0;i<time;i++)
    : Y: V) u" ?6 }/ l" a        for(j=0;j<121;j++);
    # y7 L  d( M4 S% v}
    # g0 G- S+ I) t) F. J& Bvoid main(void)//主函数/ ~# m$ R6 N, Q" V
    {
    ; v6 t4 Y( T6 V; u+ V  Y+ b* e1 a. H/ s- I
    : Y" Q$ K+ G9 w3 v
            V = dcx(0x0000); //开机时读取EEPROM区0000数据,还原关电前LED的亮灭状态
    ! D6 I7 t* q: F' q        IF(V == 0x01)* D8 ]7 a; V+ D: m+ N
            {# Q5 L, f, N  ]; t" L2 q7 T/ J
                    LED1=0;LED2=1;
    - v( W5 L( n% A8 z9 U                if (V == 0x02)1 _! I" K6 d' [$ ~7 N& P
                    {" L" j9 ~7 K+ Z7 A
                            LED1=1;LED2=0;
    % o) v: l) W. H+ H. f7 b% b                }
    * ?- k/ B9 m2 F; m7 l" p        }( h; E+ ~+ H& B& ~
            while(1)
    7 `: @' Q% p# s: f7 v                {2 i; X) ?+ O+ y) F
                            if(K1==0)4 Q* T9 d( T  A$ r  o7 ^0 }0 F, T' e
                                    {" H# [% S; ?+ g+ T+ j: O  c
                                            delay(20);' z$ @7 x5 z; Y4 B
                                            if(K1==0)( n# c* K1 }2 ], }
                                                    {
    6 b% O% f' ^, F- g8 e6 E. `6 c                                                        LED1=0;2 ~$ h% g- o* J9 v: ], N; q* A
                                                            LED2=1;
    / n- X3 \1 Y- L$ r" n7 t                                                        cc(0x0000); //擦除扇区
      s4 }. j# V+ ?# A! N                                                        xcx(0x0000,0x01); //对EEPROM区0000写入0x01
    7 n6 G. u0 M1 X  _                                                      
    6 M" J7 T9 e' u& K# _: l                                                }      
    & p' m7 P0 ~8 a/ P" L( u                                        }
    - |- t% [2 \2 B                        else if(K2==0)
    9 _% ~: h% d# b' I" b( `                                {
    3 B9 t8 j5 ^9 t. {- q                                        delay(20);) P7 _6 v6 N9 y8 _' e' F
                                            if(K2==0)
    ( U9 D- M+ D& q. T+ U; |) w* C; f                                        {1 P" K0 q4 x$ d6 N- v- R# h
                                                    LED1=1;. \8 {" Z8 C9 R+ y" s5 ~# Z
                                                    LED2=0;
    ! s6 k( q; V: a& M! @( s6 N                                                cc(0x0000); //擦除扇区& ^! ]1 ]8 ~% ?+ W/ O' |
                                                    xcx(0x0000,0x02); //对EEPROM区0000写入0x10" K# U( [- F( W) ^
                                            }+ v8 s+ m" \! U
                                    }
    / }* S: |6 v7 B                }
    ) G& D& T' F( z1 F6 p}
    . Y( z; a; t  L- H; g# y                       3 f1 [/ i& q! d1 Q2 B" f3 b
    4 V0 O. G2 |3 r' s0 f6 P) k! }

    9 ^# j3 w1 b, Gvoid cc(uint addr)//擦除扇区   入口:addr=某一扇区首地址
    ' c" G7 S8 y9 h& `{
    * W  h/ V# |4 s/ V  d4 [9 [                  & L* k( O9 P3 R
    IAP_CONTR = 0x83; // 打开IAP功能(IAPEN(IAP_CONTR.7)=1:允许编程改变Flash,设置Flash操作等待时间
    $ F' s& v% j* j& j- d) X4 a1 _IAP_CMD = 0x11; //用户可以对"Data Flash/EEPROM?"进行扇区擦除
    " F6 T6 N1 B0 aIAP_ADDRL = addr; // IAP/IAP操作时的地址寄存器2赴宋?0 T+ A( c. V2 s9 c0 Y% k0 C
    IAP_ADDRH = addr>>8; // IAP/IAP操作时的地址寄存器高八位8 Z- F6 \8 R+ v! H
    IAP_TRIG = 0x5A; //在IAPEN(IAP_CONTR.7)=1时,对IAP_TRIG先写入5a
    3 S: `) ]/ d/ G/ ~. cIAP_TRIG = 0xA5; //再写入a5,IAP/IAP命令才会生效  \) v+ t% w! W& h( O* h
    _nop_();2 J4 O8 c- }0 F4 a* t: f- W! B
    _nop_();
    2 h4 J+ c, O" c& v) K8 J) G_nop_();
    $ {! J  [+ }, E. RQ0(); //关闭IAP/IAP
    0 `5 X. x% e9 ~2 k2 ]7 c}0 S5 j  C+ z5 [# F
    ; D# w& ^" Q$ h  D2 u. y

    % x! c/ G! _& H" _; O7 \' S$ I9 Avoid xcx(uint addr,uchar dat)//写1字节   入口:addr=扇区单元地址,dat=待写入数据6 A; ?9 q+ c2 F
    {
    0 \, i" }* C' ~4 {IAP_CONTR = 0x83;
    2 H' ~$ C0 s: t+ }5 ~IAP_CMD =0x10; // 用户可以对"Data Flash/EEPROM区"进行字节编程
    ; F0 u8 \" Q& vIAP_ADDRL = addr;* B; r. c, k8 x. s
    IAP_ADDRH = addr>>8;
    # a7 Q* B/ z# w& XIAP_DATA = dat; //数据进IAP_DATA9 h7 j4 m0 ^" c2 q
    IAP_TRIG = 0x5A;4 P& ]# A& u4 H1 g3 F
    IAP_TRIG = 0xA5;& H; p: \3 K8 e, C" O! I
    _nop_();
    % j2 H5 `' _0 w- Y1 `5 Q. __nop_();
      a8 f  V* p2 v# D1 j$ {" p: I_nop_();
    4 ]' @+ w" _, C; {; {# Y! bQ0(); // 关闭IAP/IAP
    8 w5 v, F- f4 t7 m* c! W- l}
    - ^2 f; B" H" I  D0 }! C" V. K5 v- v, s$ q( ~' H+ A' n: i

    8 p4 L1 J  e/ {3 X/ ~% @! Nuchar dcx(uint addr)//读1字节    入口:addr=扇区单元地址   出口:dat=读出的数据
    3 O9 E( [, c5 j7 w5 ^( {9 T; z{
    3 m8 j0 h6 f( Buchar dat;- d. I5 U5 |: a/ j" R
    IAP_CONTR = 0x83;! N! F- \# R. P9 h+ n. i3 K5 s
    IAP_CMD = 0x01; //用户可以对“Data Flash/EEPROM区”进行字节读取
    ; ]$ t6 B* e% [0 y% @: NIAP_ADDRL = addr;. c& l: s' }! a  [
    IAP_ADDRH = addr>>8;' r0 n8 W9 i+ n2 |! N
    IAP_TRIG = 0x5A;  P: d( E% F5 s. z- }" T
    IAP_TRIG = 0xA5;; S+ m* s& `! G4 F5 s
    _nop_();2 K7 O: I1 a/ s. j+ e$ h, }
    _nop_();  b; W! g" @0 u0 S6 P* p
    _nop_();
    $ |" V) c- t* g( n( C! {1 mdat = IAP_DATA; // 读出数据
    * m- H. Q6 h6 k' r; sQ0(); // 关闭IAP/IAP
    - W: b  C$ K% ]% Vreturn dat;) z! f+ Y& d9 S: R8 b/ k
    }
    ; m4 ]9 s; x) S8 f, [# C" y$ x; S/ |3 U- A# N! `& t
    3 _6 F& R; X! x. \. Q
    void Q0()//关闭IAP/IAP9 P9 f/ ?5 W# r) T
    {) Z$ i' c* o. F% H/ L, e
    IAP_CONTR = 0; // 关闭IAP5 S1 p( K# b3 S& }7 F4 a
    IAP_CMD = 0; // 待机模式,无IAP操作
    ( f* T0 p" g- p( r- q6 W( kIAP_TRIG = 0; // 关闭IAP功能,清除与IAP有关的特殊功能寄存器* J( F, b* t3 A! P6 g
    IAP_ADDRH=0X80;
    , j) v1 L+ }" K: cIAP_ADDRL=0;
    2 T% s) Y9 X( g: D}
    + d6 P0 C2 m/ B7 U; q- U
  • TA的每日心情

    2019-11-19 15:55
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2019-11-22 15:55 | 只看该作者
    按键程序不当                 if(K1==0)                 {                         delay(20);                         if(K1==0)                         {                                 LED1=0;                                 LED2=1;                                 cc(0x0000); //擦除扇区                                 xcx(0x0000,0x01); //对EEPROM区0000写入0x01                                 while(!K1);//等待松手                         }                         }                 else if(K2==0)                 {                         delay(20);                         if(K2==0)                         {                                 LED1=1;                                 LED2=0;                                 cc(0x0000); //擦除扇区                                 xcx(0x0000,0x02); //对EEPROM区0000写入0x02                                 while(!K2);//等待松手                         }                 }
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-6-22 04:52 , Processed in 0.109375 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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