找回密码
 注册
关于网站域名变更的通知
查看: 410|回复: 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; M! }* t# j# I' J程序如下:
    ) H2 c, m/ _4 _0 x1 o* z1 M/ E% l) k0 a5 h#include <STC12C5A60S2.h>
    % r: d- N% D9 I/ o3 K#include <intrins.h>4 p# U0 g, l# w5 c' k& D
    #define uchar unsigned char' P4 k/ F2 @+ \; F, h/ Y. p+ o' S3 r
    #define uint unsigned int- z1 O6 Y& K" F& d
    sbit LED1 = P2^0;
    " \' s3 L0 X9 Osbit LED2 = P2^1;- j' U. u, q. S3 Q6 M  U
    sbit LED3=P2^2;
    0 z8 e$ u% M8 G% ?8 o/ ?sbit K1 = P3^2; //按钮1
    1 F! y' t$ {9 r( Bsbit K2 = P3^3; //按钮2; n  g6 l  r. M
    void cc(uint addr);
    & ~- T0 E" j, i. Q0 Cvoid xcx(uint addr,uchar dat);
    - V, b. K5 c" Y4 ?7 v. l/ K- uuchar dcx(uint addr);
    2 n& |) a+ |. I! l& @8 Tvoid Q0();0 n/ K6 F9 g' L& }/ [/ S( I, k
    uchar V;
    . e/ r) N% x$ k* g8 T' U- ^void delay(uint time)/ H6 L6 J9 S6 Q6 I  l7 N
    {" {# B/ x+ y% Q  @  F  V$ v
            uint i,j;5 Z! D! V8 O. ]! T% y3 Y6 a
            for(i=0;i<time;i++)3 O; m6 x2 K1 F2 [1 h: D2 H( L
            for(j=0;j<121;j++);
    & n: E1 o8 o/ r. v" ~}3 v' s$ G$ W5 d
    void main(void)//主函数$ V0 l6 ~6 b' W; o& ?& Y+ a' E* k
    {4 R7 I5 y; G9 W  f
    6 m( }# V. S$ ]( |$ N/ K$ W& q8 y

    5 m% ]- P* M- d  h        V = dcx(0x0000); //开机时读取EEPROM区0000数据,还原关电前LED的亮灭状态
    $ k$ b! N( z7 Z$ u8 H0 C+ @1 S4 Z        IF(V == 0x01)
    . r: o+ f: v0 k0 \, I        {
      w: L% ]1 W" D2 I  U  }                LED1=0;LED2=1;
    : n& x2 p; q0 l                if (V == 0x02)- c" y5 ~% ^# L) y, K$ l% _/ f( _) [, L1 E
                    {
    2 l( o0 u" s1 a. G' g) x# x                        LED1=1;LED2=0;
    & u: m" g. a3 W) v                }% t8 R. H7 w! B) V1 I
            }
    + ^( `& p/ c/ R) I" ^; C        while(1)
    0 W" S! Q6 i( w  o7 }8 N                {
    ) Z1 [2 W0 o- X: f: N1 W( m- N                        if(K1==0)
    7 \5 m3 C; ^# r. a# ]9 S+ B1 e8 L                                {0 x- ~. L: O7 h1 ?
                                            delay(20);3 X* j" Y" B5 M" }* m
                                            if(K1==0)9 o! r4 }* y' j$ a. F
                                                    {
      F) c" {( W  T) I                                                        LED1=0;' t0 D4 z( q  U; H$ T; Y7 F
                                                            LED2=1;. W. v2 Q- Z( S. |6 T+ R' Z' {
                                                            cc(0x0000); //擦除扇区! f% Y7 d$ Y( U4 p) q4 h" r# L2 x
                                                            xcx(0x0000,0x01); //对EEPROM区0000写入0x01, T& R4 Q5 H  c' p0 u, j
                                                          
    * R9 ]0 Q, \4 p7 W0 B- v' _& i( S                                                }      
    / \2 Z2 V4 D0 _1 q) I                                        }" p) q5 T. b6 ?( j
                            else if(K2==0)
      |7 `. U+ Y; w4 L7 V5 S                                {
    9 v: ~. G3 }- u! v; j& R                                        delay(20);
    2 d5 f. W) U6 p' }4 x1 [* W                                        if(K2==0)  T0 S5 N$ o* X% {0 K4 s8 Q' l
                                            {
    3 y& t' h; r) Z( D                                                LED1=1;
    3 w5 c9 {* I  d- t2 I1 _                                                LED2=0;
    ! ~$ c) x0 o. y1 v0 ?+ [- v                                                cc(0x0000); //擦除扇区
    . Z* U: k+ e; d  i                                                xcx(0x0000,0x02); //对EEPROM区0000写入0x10
    1 N6 q7 i, ?, f) A2 H" F& i9 u9 D                                        }8 C  |, t9 f. G! s! c$ P
                                    }  {  N2 _1 u7 o( [) O3 K7 _8 D/ b
                    }
    ) L1 {0 x) i2 }4 J7 m+ }& p" x}8 _2 d4 x' B+ ?& M4 g+ o. X
                           9 L: j+ \" m( z$ w6 ?

    4 E+ b& ]% {& V& n( ?
    6 ~7 z# v. c! S6 C& `  g
    void cc(uint addr)//擦除扇区   入口:addr=某一扇区首地址0 z4 i: T. k8 B
    {7 W6 O2 g! E1 }* Q6 L9 w
                      
    7 x$ {9 P7 ]/ U! oIAP_CONTR = 0x83; // 打开IAP功能(IAPEN(IAP_CONTR.7)=1:允许编程改变Flash,设置Flash操作等待时间
    6 }8 J: Z( I) E2 q7 ?) `; x' bIAP_CMD = 0x11; //用户可以对"Data Flash/EEPROM?"进行扇区擦除) `* N3 @* _, V" u' {0 O- q
    IAP_ADDRL = addr; // IAP/IAP操作时的地址寄存器2赴宋?$ n& ^' }/ t: q' a2 C* X! x
    IAP_ADDRH = addr>>8; // IAP/IAP操作时的地址寄存器高八位: D* d' K# e  t  _- _
    IAP_TRIG = 0x5A; //在IAPEN(IAP_CONTR.7)=1时,对IAP_TRIG先写入5a
    2 t+ d, g. M4 s/ NIAP_TRIG = 0xA5; //再写入a5,IAP/IAP命令才会生效& I3 z/ p4 s% X6 B
    _nop_();
    * [( j& D4 ^5 A5 @' h- E" M- r_nop_();
    6 x% [1 `, f  @4 u7 a. c_nop_();
    % U3 m) b6 R. O4 K# B6 ?3 S% g( nQ0(); //关闭IAP/IAP
    % S8 V9 `) _! H}
    6 ]. O4 n' E$ U- D# `/ L: c
    $ r: w; `  ?6 x

    0 F* r& G' a9 cvoid xcx(uint addr,uchar dat)//写1字节   入口:addr=扇区单元地址,dat=待写入数据
    ; W4 h/ r' V( P, B9 t{
    1 D! |5 F0 ~0 T/ ]+ P2 }IAP_CONTR = 0x83;
      L6 j1 G- F, a- g% r& [IAP_CMD =0x10; // 用户可以对"Data Flash/EEPROM区"进行字节编程6 Q: @! Q. ]/ U2 a: \2 {
    IAP_ADDRL = addr;! V. x0 n3 W. |+ s2 g( n
    IAP_ADDRH = addr>>8;2 C* a) C: c  f" k% s  W) f
    IAP_DATA = dat; //数据进IAP_DATA
      a2 R& G* ~, `8 ~9 b$ KIAP_TRIG = 0x5A;
    ! W# l( O" i& w. `IAP_TRIG = 0xA5;
    4 N/ m% C8 ]5 G) J/ b" z5 w) z. ]( Y_nop_();. R, C1 I/ c% J* b5 S; e* h
    _nop_();
    6 j2 u6 ]3 @6 U_nop_();
    % P9 L% {# P- e, Z1 D/ gQ0(); // 关闭IAP/IAP
    6 k& n- y  n5 S}1 _/ h; r# D# t

    / T' t. e' |* T/ Q% Z2 Z

    / a- }+ n$ j$ n, c9 J) Kuchar dcx(uint addr)//读1字节    入口:addr=扇区单元地址   出口:dat=读出的数据& ]" {. {  H* J+ a+ ^9 z7 s
    {
    * k9 L- J8 n, G. z* m& U( }4 Fuchar dat;
    9 K* i1 S9 L# z% J- |& h* GIAP_CONTR = 0x83;
    9 O! O2 Z& X$ u9 }IAP_CMD = 0x01; //用户可以对“Data Flash/EEPROM区”进行字节读取
    $ B9 d+ `8 x" @9 `0 o3 @4 XIAP_ADDRL = addr;
    ) j  u, x. z4 `4 N2 m% i3 J( BIAP_ADDRH = addr>>8;9 s+ Q2 J- C4 @; v
    IAP_TRIG = 0x5A;* B* @5 t7 B5 b
    IAP_TRIG = 0xA5;' ]. |% t5 k* r
    _nop_();
    % b+ o& d3 X) C9 C# P5 t3 z' d_nop_();7 y% W7 `* x# Q- ]% o& j
    _nop_();; F4 h2 ?+ w7 t2 f: {: ~" I
    dat = IAP_DATA; // 读出数据3 @* Z& N3 b; x, ]) H1 e# J
    Q0(); // 关闭IAP/IAP3 G8 x3 K& I1 w2 h& P  `/ [
    return dat;
    1 c5 e& Z- H9 h) @7 q}4 K8 l5 J4 \; r4 z4 C9 ~- r

    : S; f  @: O- t% M" g, f4 a
    4 k6 u; z, W2 Q2 F6 ?
    void Q0()//关闭IAP/IAP
    4 J0 l) h0 a1 i; r. s' k{1 o1 }/ H" h% @8 `& p) j
    IAP_CONTR = 0; // 关闭IAP
    " `6 b! V5 C# s: bIAP_CMD = 0; // 待机模式,无IAP操作
    ) y0 }0 f+ p0 r+ T7 ?/ SIAP_TRIG = 0; // 关闭IAP功能,清除与IAP有关的特殊功能寄存器
    / w4 a: ]! C8 G( F5 \IAP_ADDRH=0X80;
    0 B, f' ]8 V3 {' P5 v. iIAP_ADDRL=0;8 a! b& N. t, t
    }8 A# w/ C" t  ?0 T- F/ o$ j8 V
  • 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 01:05 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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