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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    参照手册写的,两个按键,两个灯,LED3是测试的,按键1灯1亮,然后存储到EEPROM,重新上电后读取EEPROM,然后显示关机前状态,但是现在情况是不显示,重新上电后灯是全灭的。
    % Z( j1 ~" P/ R: \9 z程序如下:
    # N0 P9 K- B" c5 l3 r% j( q#include <STC12C5A60S2.h>
    / Q! z, L: O4 g/ f- u- J: C1 L#include <intrins.h>
    ( \4 r, [- {. V/ w#define uchar unsigned char/ g0 s( Z7 L( L8 W
    #define uint unsigned int. D' g' i/ F5 Q" N) Z
    sbit LED1 = P2^0;1 n$ K5 y6 C0 K8 m! ]
    sbit LED2 = P2^1;0 L+ T) W1 |$ Y3 X
    sbit LED3=P2^2;* A0 P* q+ P( R& Y3 ?5 U3 L
    sbit K1 = P3^2; //按钮1
    & O) S% k  k3 d) V3 q+ f  Nsbit K2 = P3^3; //按钮2( ]. F# U6 X+ X. z) }& J9 w6 }
    void cc(uint addr);: A4 x0 I! i9 |4 F/ r6 ]& V
    void xcx(uint addr,uchar dat);, o: p7 a; O2 B, S
    uchar dcx(uint addr);
    # n/ h5 n9 o6 @void Q0();
    + a7 A1 x  ~+ _  v" P% t& xuchar V;
    & ?. t& f! B" a9 D- Pvoid delay(uint time)
    4 C, j/ j5 i7 \1 u  e, j{
    " {! ~9 Q" K& {" U        uint i,j;% i4 K* u+ W) }+ y
            for(i=0;i<time;i++)0 `4 y6 d* T2 }
            for(j=0;j<121;j++);! Z( p6 P+ @% F, x4 k! T1 g: Y
    }( F  [* K( |8 r
    void main(void)//主函数
    8 f8 ~, n% v/ R1 b{
      b  W" M/ J! O) _
    . ~- ^: d7 J. b: n' k* h6 v: G

    % `* Z. ^+ @' \9 _0 F* `9 W        V = dcx(0x0000); //开机时读取EEPROM区0000数据,还原关电前LED的亮灭状态
    9 @4 _7 J8 n  z7 P; d4 S$ Q8 {        IF(V == 0x01)
    / q9 ^$ ^( d3 G7 Q* Q+ k  z: W        {3 k1 _' ?) _. i" p: `$ \# Z
                    LED1=0;LED2=1;
    3 [) C9 C: q4 L7 p; D6 `: p+ ~' t                if (V == 0x02)0 x3 A9 z% P& |# o" q$ B# G+ O
                    {5 e% y: [0 y3 Y
                            LED1=1;LED2=0;
    ; b1 J0 Y5 ]& r1 F: A5 D5 q1 E                }
    3 G1 m1 W8 n7 z8 {4 Y        }) X8 T5 v" f$ y8 L+ m* A
            while(1)
      @  m/ m3 V; p$ d                {/ `& [! ~, u2 q/ A
                            if(K1==0); u0 O) R3 ]/ [/ X) D
                                    {2 c& A4 H' F6 F4 ~' N2 a1 a1 a
                                            delay(20);
    ) ~% \$ `7 b) D- s* M& G4 S                                        if(K1==0)
    ) X) f/ p# O8 P: Y7 z& c                                                {) j3 Q4 T1 A* M! O+ Q, M
                                                            LED1=0;1 S4 m7 E7 ^$ T+ x1 H1 \
                                                            LED2=1;8 l7 I" Y* A5 b, B
                                                            cc(0x0000); //擦除扇区9 D5 Y5 B7 }' P
                                                            xcx(0x0000,0x01); //对EEPROM区0000写入0x01" m- `4 f' O! ?) _5 i5 N; m  Q' q
                                                          
    ' z- Z3 v6 e! P) T! j                                                }       $ Z, `/ l8 M3 ~. {: e& d: D# @0 g
                                            }
    + N6 r& n! `' L; `0 h. {                        else if(K2==0)
    . ~$ @" G( F6 G2 _: H                                {
    * `* Y. Z) F: S& R$ l9 I                                        delay(20);
    * ^# v+ B5 Y1 T4 v( O+ l                                        if(K2==0)% h5 T6 X' N. G. \! K
                                            {
    ; x" R6 z! V- Z  A% r. F. X: c                                                LED1=1;
    ; g! ^) T! F  G+ C5 b% E% ?                                                LED2=0;* D( a# e6 _6 ]. E' l' L6 S
                                                    cc(0x0000); //擦除扇区
    / e$ f- S' x, |* w+ O                                                xcx(0x0000,0x02); //对EEPROM区0000写入0x10$ B% g8 {' P7 S" k& m) Y+ ]
                                            }
    % ?3 A/ c) z0 N/ u                                }
    % d. T/ k% l# f) J                }
    : f0 F7 m0 `, x}
    . i& d! S6 D$ C7 H4 r* d' }                       3 U  R$ V: F; K9 {7 k0 s: `
    # G" P! |& D3 ]( x6 k; G

    7 t3 A& M5 [7 f$ f: ~+ \void cc(uint addr)//擦除扇区   入口:addr=某一扇区首地址
    $ t* z( Q6 J5 j6 _4 E( L3 `: a5 I  `{$ S* H$ e3 ]1 j$ @7 S
                      
    / |8 I  {' y3 _IAP_CONTR = 0x83; // 打开IAP功能(IAPEN(IAP_CONTR.7)=1:允许编程改变Flash,设置Flash操作等待时间+ J" V' W; m, e6 K9 v  b
    IAP_CMD = 0x11; //用户可以对"Data Flash/EEPROM?"进行扇区擦除
    0 }: K+ g4 p: C. pIAP_ADDRL = addr; // IAP/IAP操作时的地址寄存器2赴宋?
    ! e/ @$ }  V. d# GIAP_ADDRH = addr>>8; // IAP/IAP操作时的地址寄存器高八位( f1 e3 P5 T1 y0 a4 p3 p
    IAP_TRIG = 0x5A; //在IAPEN(IAP_CONTR.7)=1时,对IAP_TRIG先写入5a
    . o% E( c3 W0 s% q+ xIAP_TRIG = 0xA5; //再写入a5,IAP/IAP命令才会生效  U/ T7 w) {, L' c( x' O
    _nop_();
    # p2 y4 N1 L9 Y9 W$ u_nop_();" _  _; j2 F! ]
    _nop_();
    ' I/ {  [/ d" E* U. P! ?1 E0 CQ0(); //关闭IAP/IAP0 C8 k9 C' N/ W: z6 h+ [
    }! z/ A3 ~( t# i: ]- B' \# A# M! T
    5 H" E6 L& N6 j. ?& S5 {% o7 c5 c

    3 o: F$ b5 J% n2 T0 z  Wvoid xcx(uint addr,uchar dat)//写1字节   入口:addr=扇区单元地址,dat=待写入数据
    2 z( |, x9 O3 I" x. [8 h{, a. J7 {3 V  \
    IAP_CONTR = 0x83;
    ; q& _. K9 a" \$ x2 DIAP_CMD =0x10; // 用户可以对"Data Flash/EEPROM区"进行字节编程: Z4 Y1 T4 C1 N, U
    IAP_ADDRL = addr;
    0 k0 Q+ ~; H7 [0 u; n' @IAP_ADDRH = addr>>8;$ o/ W- L3 J  Q1 [
    IAP_DATA = dat; //数据进IAP_DATA& r( H  |- }5 a/ [' M
    IAP_TRIG = 0x5A;
    " k9 g8 K, k  m" Z# s/ q: iIAP_TRIG = 0xA5;+ [, @: L+ Y4 }4 }
    _nop_();) O; T4 D7 y4 U3 `7 s0 Y. t
    _nop_();# [0 E2 X0 @2 c# f( c0 \
    _nop_();
    - T4 a* l7 Q3 N5 q+ [4 uQ0(); // 关闭IAP/IAP/ I4 R8 h8 H% ^& T
    }* o& a1 U) [+ n' K' N* b; n

    . \2 F! z; E0 H) h2 \( w/ }

    + S- X4 L/ @0 v3 k4 ?# c2 X. S* guchar dcx(uint addr)//读1字节    入口:addr=扇区单元地址   出口:dat=读出的数据$ s8 w$ L  l# f5 B* O' |
    {
    / d7 H. z5 k/ _( i% ~' L2 ]uchar dat;0 L& `* U9 }0 h" S- L& a$ L# x
    IAP_CONTR = 0x83;
    ; J" m4 i) S) z  G) Y! D( j& ^1 D) pIAP_CMD = 0x01; //用户可以对“Data Flash/EEPROM区”进行字节读取2 Y" }8 M& P4 X& p4 |
    IAP_ADDRL = addr;
    $ s, J5 n5 `6 V6 O* D( H! iIAP_ADDRH = addr>>8;% ~5 ]$ C" v( {  X
    IAP_TRIG = 0x5A;
    ! @: ~- j2 h7 s- S+ HIAP_TRIG = 0xA5;' X' H& k# m5 r; b& W! r- E' q  X4 s
    _nop_();$ L: Z! G* _9 y1 z: f! b1 F5 w
    _nop_();
    * ~. M; R1 l3 n, J_nop_();. y' Q- v6 k2 I- z* _3 Q
    dat = IAP_DATA; // 读出数据% A( h( M( U- X* J2 k
    Q0(); // 关闭IAP/IAP
    * f, f$ I; r8 h1 V5 vreturn dat;
    . h1 c* c) p' s: w# `, ~}
    7 Q7 Q: ^' j  ~+ D; P& T' P( Y0 m: R# C0 z. {% l! b  N

    / L% `% \1 V( G) n" pvoid Q0()//关闭IAP/IAP- ~! x* G; n7 P# r: y
    {5 Q  \* h* k# ]4 R1 ~$ y$ O8 d9 m
    IAP_CONTR = 0; // 关闭IAP6 K6 m4 x5 C3 j( O+ Q
    IAP_CMD = 0; // 待机模式,无IAP操作
    $ J: y8 [: c7 D, dIAP_TRIG = 0; // 关闭IAP功能,清除与IAP有关的特殊功能寄存器& Y9 J! s2 e/ I. X
    IAP_ADDRH=0X80;! P( e' D) i# Z6 `
    IAP_ADDRL=0;/ z$ u2 B* V' o  w2 g6 q
    }
    + P+ l0 N- b, B9 w7 T, G
  • 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-10-7 05:47 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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