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