51单片机作的电子钟程序在很多地方已经有了介绍, 对于单片机学习者而言这个程序基本上是一道门槛,掌握了电子钟程序, 基本上可以说51单片机就掌握了80%。常见的电子钟程序由显示部分, 计算部分, 时钟调整部分构成。
- z; i: z/ h" J' T9 q4 _ 时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。10秒位到5后,即59秒 ,分钟加1,10秒位回0。依次类推,时钟最大的显示值为23小时59分59秒。这里只要确定了1秒的定时时间, 其他位均以此为基准往上累加。 . [* Q: X0 U/ n4 k" J
开始程序定义了秒, 十秒, 分, 十分,小时, 十小时,共6位的寄存器, 分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。 1 V( X( L3 b+ w" k2 W: I3 `
6个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。 # e# w) U1 O0 n# A, |( |
3 i8 D6 }! k+ U& q" \
2 u0 z. `3 a" u0 ?+ \7 i K
: }3 T; g" [; K) H3 u& I" [7 V' P. P4 I
以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。
! A9 S8 y" _& Y+ b3 B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1 Q1 y/ S- J! Y- `& p0 X4 j
;; 中断入口程序 ;; (仅供参考)
* g& u. ]4 F/ O" S;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;' j8 X$ A4 Z: L+ o8 p0 f( n
;
: z+ \4 o- F7 `! o3 o$ U$ d" o5 FORG 0000H ;程序执行开始地址
2 k2 x5 [7 a+ o8 {, dLJMP START ;跳到标号START执行
2 e, E3 t3 B. p7 JORG 0003H ;外中断0中断程序入口
. D% Y5 {. J3 p' P1 bRETI ;外中断0中断返回5 v& ?4 M: A2 A4 A0 d% c' f% F* j
ORG 000BH ;定时器T0中断程序入口
% ?! F8 ^7 e7 r7 V, @: \7 W3 ELJMP INTT0 ;跳至INTTO执行- C8 e+ t+ d6 y
ORG 0013H ;外中断1中断程序入口3 _/ C! g- M3 J
RETI ;外中断1中断返回
1 P% y; f, U" M) j9 G% w2 Y- zORG 001BH ;定时器T1中断程序入口& L) K# g. H9 U$ C- M/ ^
LJMP INTT1 ;跳至INTT1执行( B6 c" a) x$ {3 [* S7 ~
ORG 0023H ;串行中断程序入口地址- v. ]' Q7 N1 h" B
RETI ;串行中断程序返回
2 o4 a( C& U6 G;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0 @$ H( ~! Y$ ~) e) l; Y' F. h, k;; 主 程 序 ;;) L+ M& Q1 j" l1 V1 A7 Y
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
' b" K% n( G) a9 J8 T' | ^7 m. h' ?;
8 Z s3 \% P. b0 Q7 NSTART: MOV R0,#70H ;清70H-7AH共11个内存单元
2 v. x+ L+ @9 W6 Y0 S0 s" ZMOV R7,#0BH 2 a/ }7 T- C$ z% b* q+ G% N0 t
;clr P3.7 ;
$ T8 A2 f. ~) r% w0 q; CCLEARDISP: MOV @R0,#00H ;
/ e" P2 z& b" K7 `7 E$ k* R5 V0 }INC R0 ;" J8 K, R" F& a/ Z2 ]
DJNZ R7,CLEARDISP ;( q: K! N! l$ w- V# f$ s$ H9 t B; j
MOV 20H,#00H ;清20H(标志用)$ Y3 S* c Y# c. `! _- M* _
MOV 7AH,#0AH ;放入"熄灭符"数据% U$ W" _( A; W# ]
MOV TMOD,#11H ;设T0、T1为16位定时器+ T+ |2 R2 q+ K% N" w
MOV TL0,#0B0H ;50MS定时初值(T0计时用)
, \: X7 m, \3 tMOV TH0,#3CH ;50MS定时初值6 s% k8 f6 F5 S
MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用) A$ i1 K6 ~6 }. [1 W
MOV TH1,#3CH ;50MS定时初值
+ u" M+ B" z3 o3 f5 j2 [SETB EA ;总中断开放
! j' {# l' o4 k, J, d4 a* w9 ySETB ET0 ;答应T0中断
+ O' X! J( c9 l, U5 w4 TSETB TR0 ;开启T0定时器& r1 q# b. [$ ^" v1 X
MOV R4,#14H ;1秒定时用初值(50MS×20)
3 }$ T, V4 j E a* wSTART1: LCALL DISPLAY ;调用显示子程序2 L" D7 J* Q3 F7 {9 n$ U1 ]( a
JNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序
9 K8 d+ }8 P0 F& lSJMP START1 ;P3.7口为1时跳回START1
5 \( d1 c% s7 `" C5 kSETMM1: LJMP SETMM ;转到时间调整程序SETMM5 w2 { A I0 T; W& V/ u
;7 R) S8 y' l8 h7 {( r8 @
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;& M& A4 _$ E# P
;; 1秒计时程序 ;;5 j% @4 D8 Z% c4 e. s8 h3 P- a6 j
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1 L& H# P- k% K% X' ?;T0中断服务程序7 I, V$ O. L9 G/ e* d: l
INTT0: PUSH ACC ;累加器入栈保护
/ W1 U% F4 l' z, e* O% K' aPUSH PSW ;状态字入栈保护
' c5 g. |9 r8 _# {CLR ET0 ;关T0中断答应* B8 K9 ? s& V) u1 C2 I
CLR TR0 ;封闭定时器T09 p) c l6 ^+ c
MOV A,#0B7H ;中断响应时间同步修正
* x( q: l: u; TADD A,TL0 ;低8位初值修正
2 A, j6 r. z; c, r EMOV TL0,A ;重装初值(低8位修正值)
5 _$ r$ I8 a- N6 JMOV A,#3CH ;高8位初值修正) m. q, C& T. A+ B7 S
ADDC A,TH0 ;2 y2 W( E. i7 P) B" B
MOV TH0,A ;重装初值(高8位修正值)
" k1 S. h1 _) z% o0 S& z# X' ?SETB TR0 ;开启定时器T0
, K3 W6 C6 G7 [" m. ~DJNZ R4, OUTT0 ;20次中断未到中断退出
- I2 a3 H, P# P! t/ M# E% w$ I4 DADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值+ F) _9 v$ ?0 `3 U2 }6 f4 k0 Q
MOV R0,#71H ;指向秒计时单元(71H-72H)
3 W% A3 a9 i9 LACALL ADD1 ;调用加1程序(加1秒操作)4 w5 r+ D% c s. l5 G n; G
MOV A,R3 ;秒数据放入A(R3为2位十进制数组合)
7 m' ?- r' E( a; `CLR C ;清进位标志- p# R# C) `, \" C
CJNE A,#60H,ADDMM ;- e: i1 b" D2 ^4 e$ G+ S! ]
ADDMM: JC OUTT0 ;小于60秒时中断退出
3 @; z: H/ N& vACALL CLR0 ;大于或即是60秒时对秒计时单元清0! N! h B, I9 |( F
MOV R0,#77H ;指向分计时单元(76H-77H). R& P) E0 i) m" [
ACALL ADD1 ;分计时单元加1分钟- T' }7 S. O- K- b
MOV A,R3 ;分数据放入A m% u9 }# K% F* ]8 F8 p
CLR C ;清进位标志3 [! p/ G9 L7 K
CJNE A,#60H,ADDHH ;" ]# e, l- y4 c- b! E8 F0 ?; e
ADDHH: JC OUTT0 ;小于60分时中断退出
2 t, M" G3 [9 ~ WACALL CLR0 ;大于或即是60分时分计时单元清0/ b$ V' S6 h) X4 L* r0 N; {
MOV R0,#79H ;指向小时计时单(78H-79H)3 c1 z: {; i, ]
ACALL ADD1 ;小时计时单元加1小时5 m% F+ _2 @( K+ P
MOV A,R3 ;时数据放入A
2 |4 T& w0 |; lCLR C ;清进位标志3 o) w8 V4 W+ W6 K. g( v
CJNE A,#24H,HOUR ;
' f; j8 t- {3 o, W& k# W7 KHOUR: JC OUTT0 ;小于24小时中断退出7 X/ J, S# s2 N3 h; ~5 {
ACALL CLR0 ;大于或即是24小时小时计时单元清0
* X3 l! }" W2 H" v hOUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移
4 }/ o7 g- I# C% x( ?MOV 73H,77H ;入对应显示单元
2 p/ k5 g; g; O! {6 f* m6 EMOV 74H,78H ;
# M% i& A$ X: K; Q6 h N) I6 yMOV 75H,79H ;
9 d+ M: M. |3 D1 E" ^POP PSW ;恢复状态字(出栈)2 |& e5 O/ C) K9 b) F% q; ]
POP ACC ;恢复累加器
) Y% `; s% |/ Q0 Z8 WSETB ET0 ;开放T0中断
5 B" e3 E& S, p- _. ~6 d+ k6 wRETI ;中断返回
: E# B& N* i! k" g) ~;
' G- @( z e1 {) z; E, j5 J;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;( |+ y# ?, r* A, Y `
;; 闪动调时 程 序 ;;
' t1 u5 q: F6 m2 O/ @' N;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3 Y& M3 ]; k7 Y. ]/ T;T1中断服务程序,用作时间调整时调整单元闪烁指示
7 `- h* c2 \& i n3 ZINTT1: PUSH ACC ;中断现场保护
: M& @6 E9 T# L- i0 x: IPUSH PSW ;2 F+ |/ ?% v0 g
MOV TL1, #0B0H ;装定时器T1定时初值
" Q/ u" o2 a* aMOV TH1, #3CH ;
* A) O$ I' Q( dDJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次) ^. Z# p/ {8 i$ G( l5 M
MOV R2,#06H ;重装0.3秒定时用初值4 c; R3 S) i0 H; x+ _ P
CPL 02H ;0.3秒定时到对闪烁标志取反
( y; w8 P! q6 E+ [JB 02H,FLASH1 ;02H位为1时显示单元"熄灭"
& n3 d5 S1 i& U* c& j: ^ ^MOV 72H,76H ;02H位为0时正常显示# F! t2 I5 x4 D
MOV 73H,77H ;
0 N3 @; o c6 kMOV 74H,78H ;
* ^% K: y2 _, z# s. S4 MMOV 75H,79H ;' l' C; @; \' [" x- N7 c7 U
INTT1OUT: POP PSW ;恢复现场
0 k! v% { d, n. C6 qPOP ACC ;
. F5 @9 }( _7 y7 l7 G Z* oRETI ;中断退出
7 r \8 A) [8 \" Z4 u$ hFLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制
2 w. k( C2 D2 e& y& K7 fMOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分
7 V( t( `) ]. j6 ]. bMOV 73H,7AH ;显示单元(72H-73H),将不显示分数据
, s( | c* Y# ^4 ~8 }8 {, PMOV 74H,78H ;
% ^: F" w! n& r" V* g. A' d: kMOV 75H,79H ;
" ]+ Q5 I. q! c" b! hAJMP INTT1OUT ;转中断退出
' P8 g4 l- B. Z5 ^ M: ~FLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时
4 l$ Y4 `7 D& CMOV 73H,77H ;显示单元(74H-75H),小时数据将不显示& T5 W8 |2 p$ U0 q. @- T
MOV 74H,7AH ;% \% p9 R" i3 Z9 ]; Q
MOV 75H,7AH ;
+ p {6 _" d* e8 ]: }* ^* V* k! VAJMP INTT1OUT ;转中断退出
- o, A' u9 H ~9 F;
. w- U8 U# `$ F: X! f4 i;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6 A- ~: b( ~& L) A! z;; 加1子 程 序 ;;9 s4 x2 M" {8 S
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
) x# M, l" N( M3 Q( y C;# O! U" @" N4 _. f% \# u
ADD1: MOV A,@R0 ;取当前计时单元数据到A
* S/ O' j7 {9 G4 K I5 ODEC R0 ;指向前一地址& g; Q) c/ K0 ?( b
SWAP A ;A中数据高四位与低四位交换
2 t, S \. s4 B, F+ Z( dORL A,@R0 ;前一地址中数据放入A中低四位
4 D5 C' b# D3 D* j5 _) \+ NADD A,#01H ;A加1操作, S6 e. Z+ k, {& ?3 {4 P+ r5 @
DA A ;十进制调整
R0 @& `! f+ X* }, w; u2 BMOV R3,A ;移入R3寄存器
, A" R& s; [' c) E# w1 k) DANL A,#0FH ;高四位变0
% Z5 {& _& E; m8 w/ `MOV @R0,A ;放回前一地址单元
% p) F& h3 Q9 W- }* @4 f" fMOV A,R3 ;取回R3中暂存数据
; o* f9 {! t- X: r6 C+ V9 z% z) kINC R0 ;指向当前地址单元! P9 J8 t! \2 U. r
SWAP A ;A中数据高四位与低四位交换
6 T5 y( V5 N4 u. M4 U8 Y9 W: g- ^9 fANL A,#0FH ;高四位变07 O5 u- K6 M. O
MOV @R0,A ;数据放入当削地址单元中
7 N+ u5 [' s) n8 zRET ;子程序返回
. R/ d7 ?+ X0 L# D8 ` X- g;5 S! k5 C; t3 _3 ]- Y/ Y
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@' ~* G) W$ ?! p7 ?;; 清零程序 ;;
6 S$ z: P3 m, O2 o: F+ R, M;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;* E3 a1 b2 M; B' t8 g' H
;.............
9 q& l$ z4 [/ W: f5 w* g;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7 ]* q1 Q8 f; [, e! s- a2 A;; 时钟调整程序 ;;" v+ i8 f+ Y8 b: p+ }3 y2 s
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;$ U1 |- P# ^& x1 N# g5 [" l' ?
;当调时按键按下时进入此程序; @& f' F' c# I M/ V4 ]* w8 E
SETMM: cLR ET0 ;关定时器T0中断4 O) i+ Y& F# B! M8 H% j
CLR TR0 ;封闭定时器T0
( J- X* u; y4 O7 e+ r/ W% ULCALL DL1S ;调用1秒延时程序
3 U. u. i7 D5 p# a( NJB P3.7,CLOSEDIS ;键按下时间小于1秒,封闭显示(省电)9 B4 B4 a* F3 H( y0 s7 A
MOV R2,#06H ;进入调时状态,赋闪烁定时初值
' b: d% H+ A# G4 N4 ]! NSETB ET1 ;答应T1中断
* ~. D9 z( V2 d& K* YSETB TR1 ;开启定时器T1
: b# S) w# P% A4 \5 `% T4 J) z3 bSET2: JNB P3.7,SET1 ;P3.7口为0(键未开释),等待( X% r1 ` ?! z# q7 k t. A5 ]
SETB 00H ;键开释,分调整闪烁标志置1
9 x, ~$ y% m+ Q TSET4: JB P3.7,SET3 ;等待键按下0 P2 v8 z) y# P& h+ ~
LCALL DL05S ;有键按下,延时0.5秒: \; `* }7 C% n0 h& Q
JNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态+ M q) q3 s9 y/ G% G
MOV R0,#77H ;按下时间小于0.5秒加1分钟操作
1 E9 M% Y2 j$ f" Y$ Z7 tLCALL ADD1 ;调用加1子程序6 y% ~. Y2 R' H7 D
MOV A,R3 ;取调整单元数据! ?* |* Y# j( e8 i( s- O8 H
CLR C ;清进位标志' r7 c; ^: c' \) V" L7 r
CJNE A,#60H,HHH ;调整单元数据与60比较
( e0 i% |' y# t! _9 J% mHHH: JC SET4 ;调整单元数据小于60转SET4循环1 u. q5 a7 d! t2 o! v8 }
LCALL CLR0 ;调整单元数据大于或即是60时清0& C: r7 c6 A6 V- d/ v
CLR C ;清进位标志0 |% e, O+ G. l0 n1 j1 P& A8 I
AJMP SET4 ;跳转到SET4循环
1 N# B N; c8 H0 c3 mCLOSEDIS: SETB ET0 ;省电(LED不显示)状态。开T0中断* O/ z' m5 i A9 E: Q/ p
SETB TR0 ;开启T0定时器(开时钟); K: U9 \3 O( v4 {" ~
CLOSE: JB P3.7,CLOSE ;无按键按下,等待。
1 m# O# M1 c, mLCALL DISPLAY ;有键按下,调显示子程序延时削抖
( n* Q5 ]" H {1 sJB P3.7,CLOSE ;是干扰返回CLOSE等待
4 s- j" T- G% A5 o( m1 TWAITH: JNB P3.7,WAITH ;等待键开释
# s, A+ L( S& L" t( {- kLJMP START1 ;返回主程序(LED数据显示亮)
) i; d T2 C, U& H* O* u8 r9 tSETHH: CLR 00H ;分闪烁标志清除(进入调小时状态)
2 C+ j! D+ o- p$ K& Y/ y( k0 `" XSETHH1: JNB P3.7,SET5 ;等待键开释: [. e- J# N) t
SETB 01H ;小时调整标志置1, P5 r w7 W/ ~, W/ w
SET6: JB P3.7,SET7 ;等待按键按下
u3 \0 ]3 w9 \% z: J4 E9 N. j; QLCALL DL05S ;有键按下延时0.5秒; ^) Z6 O# y- i/ P. T k" [( G
JNB P3.7,SETOUT ;按下时间大于0.5秒退出时间调整
+ ?5 C6 J( _2 L$ ^5 JMOV R0,#79H ;按下时间小于0.5秒加1小时操作& h: C- w- }2 B1 s& z
LCALL ADD1 ;调加1子程序
1 h3 O' ?% }& mMOV A,R3 ;# _2 s/ h9 s6 u; M9 [& a
CLR C ;) m- v$ [8 Z% N- R9 h4 y, Z+ F) {. t! v
CJNE A,#24H,HOUU ;计时单元数据与24比较
$ `( Z3 Z1 C& b4 cHOUU: JC SET6 ;小于24转SET6循环: z3 t7 e% F9 s( {5 e$ s) S
LCALL CLR0 ;大于或即是24时清0操作
6 L% P) S7 j ^6 NAJMP SET6 ;跳转到SET6循环
, G2 j" \ d( b. Z, R# e7 j3 K! QSETOUT: JNB P3.7,SETOUT1 ;调时退出程序。等待键开释& Z- v. w$ s: R4 S% P4 b
LCALL DISPLAY ;延时削抖
6 r9 K- q2 s: g" v5 ?JNB P3.7,SETOUT ;是抖动,返回SETOUT再等待
- S$ g% K( j% B& zCLR 01H ;清调小时标志
& n( [( I( S7 M! eCLR 00H ;清调分标志, h, ?, i9 Z$ c9 }. b
CLR 02H ;清闪烁标志
% Q: w2 S- J4 V X+ h) O& j/ J& YCLR TR1 ;封闭定时器T1
$ p- \: B0 F& h% f9 wCLR ET1 ;关定时器T1中断/ h, K0 T7 [% w
SETB TR0 ;开启定时器T0. i+ X4 Z2 n8 i' B: z9 ~. q0 ^
SETB ET0 ;开定时器T0中断(计时开始)0 U8 ?- @( l* Y" a1 v
LJMP START1 ;跳回主程序! j) w2 U4 t* i
SET1: LCALL DISPLAY ;键开释等待时调用显示程序(调分)
* P. h7 ^1 R8 `AJMP SET2 ;防止键按下时无时钟显示
9 i5 q$ b. l- lSET3: LCALL DISPLAY ;等待调分按键时时钟显示用
3 b8 g: K2 l1 U. W- Y9 _& B- `/ C2 @% oAJMP SET40 e/ c6 Q$ ]; _1 } Q2 {* Z/ m
SET5: LCALL DISPLAY ;键开释等待时调用显示程序(调小时)
: S" H+ D6 ?8 p; sAJMP SETHH1 ;防止键按下时无时钟显示9 d7 _! z, r6 Q, E# u" Z
SET7: LCALL DISPLAY ;等待调小时按键时时钟显示用1 B& J6 x- L2 Q
AJMP SET6
& n& B; `# n2 g. M _$ @SETOUT1: LCALL DISPLAY ;退出时钟调整时键开释等待
& U( d. H4 i2 B* @+ o! C) G+ fAJMP SETOUT ;防止键按下时无时钟显示
: }; }' O0 y$ _- ~4 k7 F3 e6 P;
! Y( K* z6 ^9 l( m, R;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7 v! e; E/ b$ a' N* R;; 显示程序 ;;0 n* x1 v/ }1 J* ]1 {1 A! |3 c, V% J* K
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;% b4 \9 o- J4 _- `9 V$ H* C
$$$$$$$$$$$$$$$$$$$$$$$$$$$
* l2 H. C3 W, m& R5 T3 z3 l1 o& _;1MS延时程序,LED显示程序用
H$ N8 s, z7 Y& FDL1MS: MOV R6,#14H- ]4 @) B! u9 X+ @& r
DL1: MOV R7,#19H
; v' B4 q7 E5 y/ e5 J' rDL2: DJNZ R7,DL2
! E4 C% a; Z% D$ a! V" r3 LDJNZ R6,DL1: w' ]- W/ h! S# P, ?7 e9 k
RET
. o5 x! k7 h, F# m5 |6 |& Y;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象
4 p: X C0 F l# ` B1 `9 }0 ~DS20MS: ACALL DISPLAY! _9 |! Q6 g0 S5 c
ACALL DISPLAY
9 m) R. H4 m: R8 \& Z! r$ wACALL DISPLAY
' r, G8 X+ ]* MRET7 f( z) i" j! Y, {. H3 Q( q: {7 l
;延时程序,用作按键时间的长短判定0 c3 }3 k% M! U5 K: n/ P
DL1S: LCALL DL05S6 e; Z! ]2 M! ?
LCALL DL05S; M' {* |% L$ b0 T" H: B
RET1 O, u5 j+ j" t6 u
DL05S: MOV R3,#20H ;8毫秒*32=0.196秒
: _6 t7 t( t5 _DL05S1: LCALL DISPLAY$ K S" w# C: L0 `, b
DJNZ R3,DL05S10 L# O7 q& u" n+ v/ M9 O
RET. ^0 n5 x$ }# [& w
END ;程序结束$ q+ Z' w& u9 i2 D
|