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