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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    参照手册写的,两个按键,两个灯,LED3是测试的,按键1灯1亮,然后存储到EEPROM,重新上电后读取EEPROM,然后显示关机前状态,但是现在情况是不显示,重新上电后灯是全灭的。; H. a" s4 w' d& G- c
    程序如下:% E& ^0 P1 X% S* {/ U- \
    #include <STC12C5A60S2.h>
    2 ?, @) r) U0 N! [1 a* R#include <intrins.h>
    6 H  C- h1 Y) \- J#define uchar unsigned char
    : E: j0 D: l0 P' Y& l  L- p#define uint unsigned int
    3 p) r7 x& o9 ~1 J, ~; {sbit LED1 = P2^0;
    & V. R/ l, b9 i, L* _% L) Msbit LED2 = P2^1;
    ( T2 J4 e+ v1 J( Dsbit LED3=P2^2;
    : F6 G/ G6 _, ?) Csbit K1 = P3^2; //按钮1' v; O1 C6 R6 r/ v
    sbit K2 = P3^3; //按钮2! |: F& }! i1 J+ J3 H' }9 }
    void cc(uint addr);# E0 Z- L- _0 ^1 e6 ^, y. N
    void xcx(uint addr,uchar dat);
    : m# l% G+ y; e; B3 V9 i" Huchar dcx(uint addr);2 |  F6 _9 n& ^* M" c! H  D* X  U
    void Q0();9 Z# e. Q2 ]8 u6 t" F; N
    uchar V;
    / F" w; C8 d+ e0 ]% G; rvoid delay(uint time)
    8 G5 g/ @' X. r# \3 ]{
    5 B* Z9 `3 k% W        uint i,j;
      u8 l/ d8 R8 m        for(i=0;i<time;i++); U% j- d' L- ~* J4 }
            for(j=0;j<121;j++);
    ' n2 n- N1 l7 Z# @2 g( ^; A}' a9 h  c, Y6 s4 r, }  K8 w- ]$ Y
    void main(void)//主函数, y" e, U6 u4 n2 }: a3 `0 H
    {
    & o/ n& A) z3 D6 R% o7 q' p$ x2 N& a5 D( n" [  C
    ' z+ U2 r8 ], U/ O
            V = dcx(0x0000); //开机时读取EEPROM区0000数据,还原关电前LED的亮灭状态' Z, ]3 Q3 m1 @* z; k1 R
            IF(V == 0x01)6 Y7 U, s) o3 D! O2 S# p6 ?2 c( m
            {* r) D0 E& m( W8 G, ]" t2 |
                    LED1=0;LED2=1;' ^' B( b! `2 S1 j
                    if (V == 0x02)
    ' G- M$ R% z" ]& {- C1 W$ u* d& R) `2 I                {  Z+ t. u% a# p- @+ |
                            LED1=1;LED2=0;
    ; \1 o) M2 u) I' s# `; b! z2 h  O                }
    ' R0 H4 ~+ d: L/ t$ t5 }        }
    3 L+ E8 n/ j5 o3 ?! o  U0 k7 Z        while(1)1 O. q! X6 q/ U8 L4 E
                    {1 f) w& V( e$ L4 r/ v
                            if(K1==0)& m- X* d, J! S! ~1 y
                                    {, J! Z5 C0 Y! G/ |- w
                                            delay(20);: p/ ~" {) [' W' E; a7 d$ b
                                            if(K1==0)
    $ J5 I1 m9 z4 Q- z3 n7 h, t                                                {
    ! q# s6 P' W5 F                                                        LED1=0;
    : J9 v/ ?" y3 `$ `6 a3 ^                                                        LED2=1;
    * F% T) Q; [) f) t/ b1 ?% ]& S                                                        cc(0x0000); //擦除扇区
    5 z" d3 E' f  i" H' Q' r                                                        xcx(0x0000,0x01); //对EEPROM区0000写入0x01" }$ n% y$ i3 _
                                                           : Q5 n# z2 Q8 X( \$ B2 A* a
                                                    }       " j. |& Q# R- ~1 K  c! k
                                            }
    9 I, X0 x0 [  P, }# H( i1 U# X0 e                        else if(K2==0)
    7 M* @- P  }% X1 y3 @# {6 @9 S+ ]; [7 G                                {
    6 G) \( B: V+ h- O* D                                        delay(20);
    / L) g' Q2 P0 n! `                                        if(K2==0)
    ' X& I- S- P4 ~2 T& C  x& ~                                        {  P  v0 q# Z' X* b- j9 G3 B; L. [
                                                    LED1=1;
    + \0 Y+ o/ x( C7 E# V; |' q: W1 E                                                LED2=0;
    6 ]) |1 E$ G) l3 l. K. }# u9 Z                                                cc(0x0000); //擦除扇区
    2 U! B5 H  E) m$ a, a* w                                                xcx(0x0000,0x02); //对EEPROM区0000写入0x105 s2 z8 b0 a9 K7 J
                                            }
    5 B5 X' D/ G% i" r                                }
    - M! C1 j+ S! E2 X7 c5 x: n) A                }- `* D7 N* Y% y, P7 W& J. g
    }- T, B' V/ [; [' ^4 [6 C6 W
                           2 c. B% h6 A; V+ ?
    # C5 d" m) a$ ?

    ' k' s1 J- T: I' kvoid cc(uint addr)//擦除扇区   入口:addr=某一扇区首地址
    6 u* d0 E2 R1 w# G. `, k{- s9 j, T" r1 S; ^: }9 Y2 \% z
                      
    1 ]* |5 G) \; M( A( ^: a+ uIAP_CONTR = 0x83; // 打开IAP功能(IAPEN(IAP_CONTR.7)=1:允许编程改变Flash,设置Flash操作等待时间
    . G4 V. g) {/ b8 A8 k3 aIAP_CMD = 0x11; //用户可以对"Data Flash/EEPROM?"进行扇区擦除
    # M/ T+ I* f% c! v# CIAP_ADDRL = addr; // IAP/IAP操作时的地址寄存器2赴宋?& V$ s+ `  [8 `9 B6 s
    IAP_ADDRH = addr>>8; // IAP/IAP操作时的地址寄存器高八位* }& W# h1 \$ }% k6 O' L
    IAP_TRIG = 0x5A; //在IAPEN(IAP_CONTR.7)=1时,对IAP_TRIG先写入5a
    . O. M8 {1 {, v& A! R9 wIAP_TRIG = 0xA5; //再写入a5,IAP/IAP命令才会生效
    7 I1 [: p  G; ^" \( i- G_nop_();4 [$ c: Q4 C0 [/ l* N
    _nop_();% U* a# h0 _' e) b; b" |
    _nop_();3 T5 d4 O: I3 V$ q8 w3 a
    Q0(); //关闭IAP/IAP
    , L, A, g% f; L. j}8 i2 z2 S, M2 H" s

    . }8 |3 r% E8 @) b9 w

    # Z! W1 m9 L: P+ evoid xcx(uint addr,uchar dat)//写1字节   入口:addr=扇区单元地址,dat=待写入数据
    6 y) o  H* k! w* y3 m! m/ N* ]{1 v# _) \3 j7 U( E5 q# V7 W
    IAP_CONTR = 0x83;
    ! u7 ?% N' s' s* J. z2 N5 vIAP_CMD =0x10; // 用户可以对"Data Flash/EEPROM区"进行字节编程
    & C+ M# k7 ^( y  h# X/ k7 z- E4 _IAP_ADDRL = addr;
    & j3 N7 n: l, p* `, |3 v2 NIAP_ADDRH = addr>>8;
    ) D6 W: @2 f) Q6 N9 VIAP_DATA = dat; //数据进IAP_DATA) \" v% P5 l' ~% E, P0 X
    IAP_TRIG = 0x5A;' v; S9 m0 v5 e  [3 ^/ z
    IAP_TRIG = 0xA5;
    ; b4 E& D4 M# |, U. b9 n_nop_();
    : q7 w, @+ t* L" S_nop_();( g9 v3 l; I% i& W: C
    _nop_();
    / z: f6 m4 `7 ]" c1 fQ0(); // 关闭IAP/IAP
    * ]7 B8 n6 j3 f, A: A; x) e( L# j}
    7 m4 J7 _" \7 z- C2 q
    8 Y+ ^: R) K8 ]4 {  L

    ( O0 `; P1 E9 F& [4 z% puchar dcx(uint addr)//读1字节    入口:addr=扇区单元地址   出口:dat=读出的数据0 p+ j5 ^: }7 b- a
    {
    4 [3 e4 T5 k, n3 o1 e1 u! Yuchar dat;* `/ i- B$ o3 t$ @2 h  k
    IAP_CONTR = 0x83;
    # Q" _( T& X9 `% K: I: E2 FIAP_CMD = 0x01; //用户可以对“Data Flash/EEPROM区”进行字节读取1 O% Y" r3 [! Z" K8 q
    IAP_ADDRL = addr;
    , `2 z" {: N; ^! B$ Y2 WIAP_ADDRH = addr>>8;
    - g5 r/ J: [$ S" s; KIAP_TRIG = 0x5A;# C8 |1 J' O. d
    IAP_TRIG = 0xA5;+ B& {$ O* H4 R6 a. G1 P. k
    _nop_();
    0 i$ z6 p2 s" g# K_nop_();
    : ~, ]* i3 g% A% V' x$ m_nop_();
    4 ^& J, Y9 S! K# I7 z2 cdat = IAP_DATA; // 读出数据) Q1 w" _+ H6 t& O- V
    Q0(); // 关闭IAP/IAP) N! {8 Q7 F$ c, _( U
    return dat;
    $ U1 E) s+ @: T0 f3 \) R}
    , J. `- v8 y$ T# H: R' [
    5 K5 U  z9 \( M: M
    $ p: a% |& s, E8 k9 A# S) R
    void Q0()//关闭IAP/IAP
    ( D; i( U& g% i6 i{
    6 i( n, ~0 J% j- C6 w/ R- _IAP_CONTR = 0; // 关闭IAP
    4 y6 Q5 I, w5 ?. ?. eIAP_CMD = 0; // 待机模式,无IAP操作
    0 P0 _( N( H% KIAP_TRIG = 0; // 关闭IAP功能,清除与IAP有关的特殊功能寄存器
    0 s/ w4 J4 D6 z; H0 [IAP_ADDRH=0X80;
    ! l8 Y' `" y' F+ bIAP_ADDRL=0;7 Q% q# S! c5 c, z2 k
    }
    ' l" V- X6 e" V. b1 Q: V  C, S
  • 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-11-6 02:01 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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