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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    参照手册写的,两个按键,两个灯,LED3是测试的,按键1灯1亮,然后存储到EEPROM,重新上电后读取EEPROM,然后显示关机前状态,但是现在情况是不显示,重新上电后灯是全灭的。! m! H! s+ T0 e1 K
    程序如下:
    : G4 D- g# Q; l- S8 ?5 @#include <STC12C5A60S2.h>
    7 `% ~7 l6 B4 A% X1 L#include <intrins.h>8 B* b. Y0 \  _! o, T
    #define uchar unsigned char& d4 K# }8 f, n  M* A3 @
    #define uint unsigned int5 Y' {+ |" q: L5 h( d! p9 M
    sbit LED1 = P2^0;  M$ F+ }8 F! w# v3 _0 m
    sbit LED2 = P2^1;; W- z5 O/ ^+ W, B. r# ~
    sbit LED3=P2^2;- `% x0 j! {( G- Y
    sbit K1 = P3^2; //按钮1
      V! g, |" U- i* gsbit K2 = P3^3; //按钮2& l3 t/ @% b/ Q# E+ ?; E
    void cc(uint addr);
    1 F7 v& X- d* x' i8 Avoid xcx(uint addr,uchar dat);
    7 P. N3 v. w' b+ J- Suchar dcx(uint addr);" ^' ?8 Z# P. j) H) n4 R. K
    void Q0();% B4 n! j: E) H, r
    uchar V;
    # P5 u! Z8 @4 n! ^$ b, Y& N$ d7 Jvoid delay(uint time)
    9 x! u8 A8 ]$ M& ], M5 W{
    4 }9 n0 r3 w* P0 P7 \9 Z        uint i,j;; a7 o3 }* q3 ]9 b) l8 d
            for(i=0;i<time;i++)
    ' l  ]2 F) U, R: ]7 }2 y# j        for(j=0;j<121;j++);
    8 _. N- ^6 J6 }8 S& D; a- o}
    . m% H" q- C% D( k4 {+ n& W7 Y9 vvoid main(void)//主函数' R* ]4 k1 V7 s$ U9 Q$ }, Q0 [% a3 v
    {1 [) J! {) d" G  d

    8 c/ T% T8 h& V" X+ [2 [

    ; H6 W; K0 J! a3 R- b/ A" t        V = dcx(0x0000); //开机时读取EEPROM区0000数据,还原关电前LED的亮灭状态
    / Z" v6 f* b3 v  r        IF(V == 0x01), y$ Q0 b2 g: k8 R; G7 [
            {
    # U9 W% Q4 u2 g% c0 Y7 c7 p                LED1=0;LED2=1;
    % j% n3 x. g* I0 f5 Y* }5 Z" b                if (V == 0x02)
    6 m5 O) p4 ~4 a8 y- K                {
    ) p+ o5 K" Y$ n' b. Z# o/ X  q7 p                        LED1=1;LED2=0;
    1 n) G( k! v+ A, K                }* x5 m! \# d* ^
            }
      {5 C5 H) d$ @" _        while(1)
    ' _- J0 i+ Z7 ^5 ^. Y                {
    ( G. v7 I( ?# ^- Y: h" a$ s                        if(K1==0)
    ( Z8 b$ b! l4 p! J                                {$ l( q3 G$ c2 H
                                            delay(20);
    7 K+ m* {8 l$ H" r- D: o) P                                        if(K1==0)
    8 G2 n* f+ t4 M, z* ?% h                                                {
    3 @" o9 o/ ]  r% P/ ]7 B                                                        LED1=0;
    2 h1 R& q: t% U- R) x; C2 Q                                                        LED2=1;+ V! C5 O+ k' ?( Q) z
                                                            cc(0x0000); //擦除扇区
    2 h+ l, Z5 P+ c. p, ]                                                        xcx(0x0000,0x01); //对EEPROM区0000写入0x01
    ( K* q; s+ k  l! j/ c; N. G                                                       9 ?% ^& q+ s7 a" [1 F
                                                    }      
      h+ u' f( n; m3 \                                        }
    / j3 w' \- \$ Z, M6 G                        else if(K2==0)* d% `1 R! Z3 t" z2 W
                                    {
    1 M) {, \. T! M$ y2 W                                        delay(20);
    , n; p# x7 {3 g/ _4 P* f                                        if(K2==0)! d$ S/ e8 {! q( k8 J
                                            {
    , i* I' F; X! F; n                                                LED1=1;+ |+ d2 z/ P4 |; y
                                                    LED2=0;
    ) s# x: U/ }1 f( W5 T2 t                                                cc(0x0000); //擦除扇区
    - U) j# \7 J3 ~7 e7 h1 w8 Z5 t6 s                                                xcx(0x0000,0x02); //对EEPROM区0000写入0x10. M3 y0 i  ^5 z) o! m2 ~
                                            }( A/ P  X$ O. f% ]# K* R, z5 v0 Q
                                    }
    * T! J. b- I$ m2 |! v) U" K, K; a                }
    " W' x# x& E) l# G+ o  j}  z# O2 l/ V. B4 e9 i
                           
    2 m* @# |4 z% @; @4 {7 E) c, S  R* R5 a! M( ?8 Q5 F7 k  q0 z
    : G" K3 v* C' ]
    void cc(uint addr)//擦除扇区   入口:addr=某一扇区首地址
    . ^% L/ f, O1 Y, R{- S& g5 ~' ~3 `9 P9 [6 l  i! E  B
                      
    - j' @% l& r+ b1 Y5 ~IAP_CONTR = 0x83; // 打开IAP功能(IAPEN(IAP_CONTR.7)=1:允许编程改变Flash,设置Flash操作等待时间
    ; c9 y2 O8 y1 h* j/ `  zIAP_CMD = 0x11; //用户可以对"Data Flash/EEPROM?"进行扇区擦除( A. b0 ]0 R, f5 S
    IAP_ADDRL = addr; // IAP/IAP操作时的地址寄存器2赴宋?
    . E& e( z# Q. K5 A, W$ w. uIAP_ADDRH = addr>>8; // IAP/IAP操作时的地址寄存器高八位+ g4 n3 d2 W) b( `8 B2 j- R. M8 ?
    IAP_TRIG = 0x5A; //在IAPEN(IAP_CONTR.7)=1时,对IAP_TRIG先写入5a% o+ S. R3 K' @, N' b% P# A) A# T# i
    IAP_TRIG = 0xA5; //再写入a5,IAP/IAP命令才会生效6 K" y$ Q( {& G) M/ d4 X9 f
    _nop_();
    9 B4 O1 N$ }% j3 X& Q_nop_();  ^4 V9 X8 b$ l: k" B3 [! {
    _nop_();
    ; {" {- Y1 l' w/ _& hQ0(); //关闭IAP/IAP- F7 R+ a9 @6 m! m* l6 ]
    }+ _" P! `+ E4 ], t4 e
    ) F# Y6 K* O  }  J
    , f: `) q# b$ I
    void xcx(uint addr,uchar dat)//写1字节   入口:addr=扇区单元地址,dat=待写入数据. d: z. y- @4 O' Z
    {
    1 L  P( n& J" K$ aIAP_CONTR = 0x83;8 P8 L4 s( v/ v+ y4 d' |4 w: M0 C4 ?
    IAP_CMD =0x10; // 用户可以对"Data Flash/EEPROM区"进行字节编程7 `' O: o, |' F0 W# o6 e2 {% U
    IAP_ADDRL = addr;1 q$ g8 E$ L9 S7 u+ F
    IAP_ADDRH = addr>>8;! ^7 K: U7 s1 Z, |
    IAP_DATA = dat; //数据进IAP_DATA
    " u5 \: w( K6 CIAP_TRIG = 0x5A;
    - Z" n" _# I4 [; Q8 kIAP_TRIG = 0xA5;
      u' O' M/ J) w) B' ?_nop_();
    , i  h+ k' S, a8 O- F_nop_();
    1 m) @3 U: t* l_nop_();
    , d% C/ a' |+ M* T' tQ0(); // 关闭IAP/IAP$ B# ~# e# ?. r7 e, b
    }+ h4 X' W: N4 [
    : H$ j/ n* Y" H; u
    8 v3 q7 ]& m9 k3 g4 w' ^
    uchar dcx(uint addr)//读1字节    入口:addr=扇区单元地址   出口:dat=读出的数据9 d, L- Y! B; B$ Q% A; F# ~
    {
    0 H* E: A. T, ^) I$ C( Ouchar dat;' \) j, y0 [) O
    IAP_CONTR = 0x83;* I) l7 O# [. d
    IAP_CMD = 0x01; //用户可以对“Data Flash/EEPROM区”进行字节读取4 e0 S" r3 z" p0 R* ]' g7 N7 E
    IAP_ADDRL = addr;5 G5 I9 d' J0 ^" z
    IAP_ADDRH = addr>>8;% D* j& r* T* [2 G6 ?
    IAP_TRIG = 0x5A;+ r( Z3 u) ?; T9 G* A
    IAP_TRIG = 0xA5;. f1 w% K2 `+ J+ R# q2 Z7 h
    _nop_();
    ! W, k. e9 J" Q0 V6 b9 T5 y_nop_();
    ( g5 t0 G6 G8 ~4 e. ~_nop_();
    7 Q$ B+ s  l. K0 B, l2 j2 Bdat = IAP_DATA; // 读出数据
    3 G: X) b- E: ?2 p7 kQ0(); // 关闭IAP/IAP
    ' R: f8 u/ d" Oreturn dat;
    : X4 _0 x' Z9 e+ J8 E}
    % h, Z# k3 f$ b  I" j  W; W! T; d; G5 q

    ! y( V5 Z7 n& y. Xvoid Q0()//关闭IAP/IAP
      \: q( E2 B$ d, t1 N3 I{  `# Q( E' x5 `6 }
    IAP_CONTR = 0; // 关闭IAP, D+ ]: N) `1 ~: }- O6 d
    IAP_CMD = 0; // 待机模式,无IAP操作
    2 u% s& {: i/ c7 BIAP_TRIG = 0; // 关闭IAP功能,清除与IAP有关的特殊功能寄存器
    5 @& ~: i! m! K1 Q; n" zIAP_ADDRH=0X80;/ u+ C( s, a' v9 G
    IAP_ADDRL=0;
    / d* x9 @' p/ O5 g}7 G2 s- F; m* x! r0 f2 m( h- 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-7-20 06:33 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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