TA的每日心情 | 开心 2019-11-21 15:51 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
参照手册写的,两个按键,两个灯,LED3是测试的,按键1灯1亮,然后存储到EEPROM,重新上电后读取EEPROM,然后显示关机前状态,但是现在情况是不显示,重新上电后灯是全灭的。
8 y, e$ L( y7 n: G" c8 [5 E程序如下:# Q3 U/ ^0 m0 y
#include <STC12C5A60S2.h>
. ^8 s0 B! o2 K2 `# l#include <intrins.h>$ C/ n8 k7 n3 L8 ?( H+ }# I
#define uchar unsigned char
; i: ]3 j U# L: R' Q#define uint unsigned int3 R8 ^* D; ~6 w
sbit LED1 = P2^0;
4 @5 R* H) T+ O4 o; W8 X8 ssbit LED2 = P2^1;5 O# H* j M9 W( A; w; U$ X/ ~) L
sbit LED3=P2^2;. w, r6 m' ?% O: Q4 b) X( K4 L& Q
sbit K1 = P3^2; //按钮1) J5 K: d( m/ G
sbit K2 = P3^3; //按钮2
5 d. @$ `- ?; c. q: \3 g# ?, s8 gvoid cc(uint addr);
9 G n* I, ?2 e! e ?$ L9 [void xcx(uint addr,uchar dat);
# a# i/ g) ]3 Duchar dcx(uint addr);8 [0 [6 ]# ~# d* e- O
void Q0();* Z2 I# Q9 ~# D" [& l
uchar V;
" o: [, G6 G0 z9 Yvoid delay(uint time)
$ U V9 `* m+ M+ `$ w0 I% u{
& w1 d! d p% U5 [0 {: t uint i,j;8 y9 B9 P3 o }
for(i=0;i<time;i++)
: Y: V) u" ?6 }/ l" a for(j=0;j<121;j++);
# y7 L d( M4 S% v}
# g0 G- S+ I) t) F. J& Bvoid main(void)//主函数/ ~# m$ R6 N, Q" V
{
; v6 t4 Y( T6 V; u+ V Y+ b* e1 a. H/ s- I
: Y" Q$ K+ G9 w3 v
V = dcx(0x0000); //开机时读取EEPROM区0000数据,还原关电前LED的亮灭状态
! D6 I7 t* q: F' q IF(V == 0x01)* D8 ]7 a; V+ D: m+ N
{# Q5 L, f, N ]; t" L2 q7 T/ J
LED1=0;LED2=1;
- v( W5 L( n% A8 z9 U if (V == 0x02)1 _! I" K6 d' [$ ~7 N& P
{" L" j9 ~7 K+ Z7 A
LED1=1;LED2=0;
% o) v: l) W. H+ H. f7 b% b }
* ?- k/ B9 m2 F; m7 l" p }( h; E+ ~+ H& B& ~
while(1)
7 `: @' Q% p# s: f7 v {2 i; X) ?+ O+ y) F
if(K1==0)4 Q* T9 d( T A$ r o7 ^0 }0 F, T' e
{" H# [% S; ?+ g+ T+ j: O c
delay(20);' z$ @7 x5 z; Y4 B
if(K1==0)( n# c* K1 }2 ], }
{
6 b% O% f' ^, F- g8 e6 E. `6 c LED1=0;2 ~$ h% g- o* J9 v: ], N; q* A
LED2=1;
/ n- X3 \1 Y- L$ r" n7 t cc(0x0000); //擦除扇区
s4 }. j# V+ ?# A! N xcx(0x0000,0x01); //对EEPROM区0000写入0x01
7 n6 G. u0 M1 X _
6 M" J7 T9 e' u& K# _: l }
& p' m7 P0 ~8 a/ P" L( u }
- |- t% [2 \2 B else if(K2==0)
9 _% ~: h% d# b' I" b( ` {
3 B9 t8 j5 ^9 t. {- q delay(20);) P7 _6 v6 N9 y8 _' e' F
if(K2==0)
( U9 D- M+ D& q. T+ U; |) w* C; f {1 P" K0 q4 x$ d6 N- v- R# h
LED1=1;. \8 {" Z8 C9 R+ y" s5 ~# Z
LED2=0;
! s6 k( q; V: a& M! @( s6 N cc(0x0000); //擦除扇区& ^! ]1 ]8 ~% ?+ W/ O' |
xcx(0x0000,0x02); //对EEPROM区0000写入0x10" K# U( [- F( W) ^
}+ v8 s+ m" \! U
}
/ }* S: |6 v7 B }
) G& D& T' F( z1 F6 p}
. Y( z; a; t L- H; g# y 3 f1 [/ i& q! d1 Q2 B" f3 b
4 V0 O. G2 |3 r' s0 f6 P) k! }
9 ^# j3 w1 b, Gvoid cc(uint addr)//擦除扇区 入口:addr=某一扇区首地址
' c" G7 S8 y9 h& `{
* W h/ V# |4 s/ V d4 [9 [ & L* k( O9 P3 R
IAP_CONTR = 0x83; // 打开IAP功能(IAPEN(IAP_CONTR.7)=1:允许编程改变Flash,设置Flash操作等待时间
$ F' s& v% j* j& j- d) X4 a1 _IAP_CMD = 0x11; //用户可以对"Data Flash/EEPROM?"进行扇区擦除
" F6 T6 N1 B0 aIAP_ADDRL = addr; // IAP/IAP操作时的地址寄存器2赴宋?0 T+ A( c. V2 s9 c0 Y% k0 C
IAP_ADDRH = addr>>8; // IAP/IAP操作时的地址寄存器高八位8 Z- F6 \8 R+ v! H
IAP_TRIG = 0x5A; //在IAPEN(IAP_CONTR.7)=1时,对IAP_TRIG先写入5a
3 S: `) ]/ d/ G/ ~. cIAP_TRIG = 0xA5; //再写入a5,IAP/IAP命令才会生效 \) v+ t% w! W& h( O* h
_nop_();2 J4 O8 c- }0 F4 a* t: f- W! B
_nop_();
2 h4 J+ c, O" c& v) K8 J) G_nop_();
$ {! J [+ }, E. RQ0(); //关闭IAP/IAP
0 `5 X. x% e9 ~2 k2 ]7 c}0 S5 j C+ z5 [# F
; D# w& ^" Q$ h D2 u. y
% x! c/ G! _& H" _; O7 \' S$ I9 Avoid xcx(uint addr,uchar dat)//写1字节 入口:addr=扇区单元地址,dat=待写入数据6 A; ?9 q+ c2 F
{
0 \, i" }* C' ~4 {IAP_CONTR = 0x83;
2 H' ~$ C0 s: t+ }5 ~IAP_CMD =0x10; // 用户可以对"Data Flash/EEPROM区"进行字节编程
; F0 u8 \" Q& vIAP_ADDRL = addr;* B; r. c, k8 x. s
IAP_ADDRH = addr>>8;
# a7 Q* B/ z# w& XIAP_DATA = dat; //数据进IAP_DATA9 h7 j4 m0 ^" c2 q
IAP_TRIG = 0x5A;4 P& ]# A& u4 H1 g3 F
IAP_TRIG = 0xA5;& H; p: \3 K8 e, C" O! I
_nop_();
% j2 H5 `' _0 w- Y1 `5 Q. __nop_();
a8 f V* p2 v# D1 j$ {" p: I_nop_();
4 ]' @+ w" _, C; {; {# Y! bQ0(); // 关闭IAP/IAP
8 w5 v, F- f4 t7 m* c! W- l}
- ^2 f; B" H" I D0 }! C" V. K5 v- v, s$ q( ~' H+ A' n: i
8 p4 L1 J e/ {3 X/ ~% @! Nuchar dcx(uint addr)//读1字节 入口:addr=扇区单元地址 出口:dat=读出的数据
3 O9 E( [, c5 j7 w5 ^( {9 T; z{
3 m8 j0 h6 f( Buchar dat;- d. I5 U5 |: a/ j" R
IAP_CONTR = 0x83;! N! F- \# R. P9 h+ n. i3 K5 s
IAP_CMD = 0x01; //用户可以对“Data Flash/EEPROM区”进行字节读取
; ]$ t6 B* e% [0 y% @: NIAP_ADDRL = addr;. c& l: s' }! a [
IAP_ADDRH = addr>>8;' r0 n8 W9 i+ n2 |! N
IAP_TRIG = 0x5A; P: d( E% F5 s. z- }" T
IAP_TRIG = 0xA5;; S+ m* s& `! G4 F5 s
_nop_();2 K7 O: I1 a/ s. j+ e$ h, }
_nop_(); b; W! g" @0 u0 S6 P* p
_nop_();
$ |" V) c- t* g( n( C! {1 mdat = IAP_DATA; // 读出数据
* m- H. Q6 h6 k' r; sQ0(); // 关闭IAP/IAP
- W: b C$ K% ]% Vreturn dat;) z! f+ Y& d9 S: R8 b/ k
}
; m4 ]9 s; x) S8 f, [# C" y$ x; S/ |3 U- A# N! `& t
3 _6 F& R; X! x. \. Q
void Q0()//关闭IAP/IAP9 P9 f/ ?5 W# r) T
{) Z$ i' c* o. F% H/ L, e
IAP_CONTR = 0; // 关闭IAP5 S1 p( K# b3 S& }7 F4 a
IAP_CMD = 0; // 待机模式,无IAP操作
( f* T0 p" g- p( r- q6 W( kIAP_TRIG = 0; // 关闭IAP功能,清除与IAP有关的特殊功能寄存器* J( F, b* t3 A! P6 g
IAP_ADDRH=0X80;
, j) v1 L+ }" K: cIAP_ADDRL=0;
2 T% s) Y9 X( g: D}
+ d6 P0 C2 m/ B7 U; q- U |
|