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