TA的每日心情 | 开心 2019-11-21 15:51 |
|---|
签到天数: 1 天 [LV.1]初来乍到
|
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 |
|