51单片机简易电子钟设计。汇编语言编写

设计要求:8位共阳极数码管,显示格式12-00-00,接口段P0位P2,按钮4个。可实现时分秒加1可不要减1。状态出现时数码管滚动显示0-9一次,结束后显示12-00-00,按钮1实现时钟走,按钮234改变时分秒。按钮可用中断可用其他端口。大致如图所示,可大改。汇编语言编写,不认可C,有.ASM .HX和.DNS即可。建议自定义标号拼音或单词缩写,便于理解。

KEYVAL EQU 30H
KEYTM EQU 31H
KEYSCAN EQU 32H
DAT EQU 33H
SCANLED EQU 39H
CLK EQU 77H
SEC EQU 78H
MIN EQU 79H
HOUR EQU 7AH
PAUSE BIT 00H
DOT BIT 01H
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR ;50ms定时
ORG 001BH
LJMP T1ISR ;扫描显示
ORG 0030H
MAIN:
  MOV SP,#5FH
  MOV TMOD,#11H
  MOV TH0,#03CH
  MOV TL0,#0B0H
  MOV TH1,#0ECH
  MOV TL1,#078H
  MOV KEYVAL,#0
  MOV SCANLED,#0
  MOV 33H,#10H
  MOV 34H,#10H
  MOV 35H,#10H
  MOV 36H,#10H
  MOV 37H,#10H
  MOV 38H,#10H
  MOV SEC,#0
  MOV MIN,#0
  MOV HOUR,#0
  MOV CLK,#0
  CLR PAUSE
  SETB EA
  SETB ET1
  SETB TR1
LOOP:
  LCALL KEYSEL
  MOV A,KEYVAL
  CJNE A,#0FFH,LOOP1
  SJMP LOOP
LOOP1:
  CJNE A,#10,LOOP2 ;“ON”启动
  SETB TR0
  SETB ET0
  SETB PAUSE
  SJMP LOOP
LOOP2:
  CJNE A,#11,LOOP3 ;“=”清零
  MOV SEC,#0
  MOV MIN,#0
  MOV HOUR,#0
  LCALL DISCHG
  SJMP LOOP
LOOP3:
  CJNE A,#15,LOOP4 ;“+”暂停
  CLR TR0
  CLR ET0
  CLR PAUSE
  SJMP LOOP
LOOP4:
  CJNE A,#14,LOOP5 ;“-”清显示暂停
  MOV 33H,#10H
  MOV 34H,#10H
  MOV 35H,#10H
  MOV 36H,#10H
  MOV 37H,#10H
  MOV 38H,#10H
  CLR TR0
  CLR ET0
  CLR PAUSE
  SJMP LOOP
LOOP5:
  CJNE A,#10,LOOP6  ;数字键
LOOP6:
  JC LOOP7
  LJMP LOOP
LOOP7:
  JNB PAUSE,LOOP8   ;暂停状态可以输入数字键
  LJMP LOOP
LOOP8:
  MOV 33H,34H
  MOV 34H,35H
  MOV 35H,36H
  MOV 36H,37H
  MOV 37H,38H
  MOV 38H,KEYVAL
  MOV A,33H
  SWAP A
  ORL A,34H
  LCALL BCDH
  MOV HOUR,A
  MOV A,35H
  SWAP A
  ORL A,36H
  LCALL BCDH
  MOV MIN,A
  MOV A,37H
  SWAP A
  ORL A,38H
  LCALL BCDH
  MOV SEC,A
  LJMP LOOP

;------------------
;BCD转换为十六进制
BCDH:
  MOV B,#10H
  DIV AB
  MOV R7,B
  MOV B,#10
  MUL AB
  ADD A,R7
  RET
;------------------
;十六进制转换为BCD
HBCD:
  MOV B,#10
  DIV AB
  SWAP A
  ORL A,B
  RET
;------------------
KEYSEL: 
  MOV KEYVAL,#0
  MOV KEYSCAN,#0EFH
  LCALL GETKEY
  MOV A,KEYTM
  JZ KEYS1
  MOV KEYVAL,A
  SJMP KEYRTN
KEYS1: 
  MOV KEYSCAN,#0DFH
  LCALL GETKEY
  MOV A,KEYTM
  JZ KEYS2
  CLR C
  ADD A,#4
  MOV KEYVAL,A
  SJMP KEYRTN
KEYS2: 
  MOV KEYSCAN,#0BFH
  LCALL GETKEY
  MOV A,KEYTM
  JZ KEYS3
  CLR C
  ADD A,#8
  MOV KEYVAL,A
  SJMP KEYRTN
KEYS3: 
  MOV KEYSCAN,#7FH
  LCALL GETKEY
  MOV A,KEYTM
  JZ KEYRTN
  CLR C
  ADD A,#12
  MOV KEYVAL,A
KEYRTN: 
  LCALL CHGKEY
  RET
;--------------------
GETKEY: 
  MOV KEYTM,#0
  MOV A,KEYSCAN
  MOV P3,A
  NOP
  MOV A,P3
  ANL A,#0FH
  XRL A,#0FH
  JZ NOKEY
  MOV R2,#10
  LCALL DELAY
  MOV A,P3
  ANL A,#0FH
  XRL A,#0FH
  JZ NOKEY
  MOV A,P3
  ANL A,#0FH
  MOV R7,A
SF:
  MOV A,P3
  ANL A,#0FH
  XRL A,#0FH
  JNZ SF
  MOV A,R7
  CJNE A,#0EH,NK1
  MOV KEYTM,#1
  SJMP NOKEY
NK1:
  CJNE A,#0DH,NK2
  MOV KEYTM,#2
  SJMP NOKEY
NK2:
  CJNE A,#0BH,NK3
  MOV KEYTM,#3
  SJMP NOKEY
NK3:
  CJNE A,#07H,NOKEY
  MOV KEYTM,#4
NOKEY: RET
;--------------------
DELAY:
  MOV R3,#50
DELAY1:
  MOV R4,#100
  DJNZ R4,$
  DJNZ R3,DELAY1
  DJNZ R2,DELAY
  RET
;--------------------
T0ISR:
  PUSH ACC
  CLR TR0
  MOV TH0,#3CH
  MOV TL0,#0B0H
  SETB TR0
  INC CLK
  MOV A,CLK
  CJNE A,#20,T0ISRE
  MOV CLK,#0
  INC SEC
  MOV A,SEC
  CJNE A,#60,T0ISRE
  MOV SEC,#0
  INC MIN
  MOV A,MIN
  CJNE A,#60,T0ISRE
  MOV MIN,#0
  INC HOUR
  MOV A,HOUR
  CJNE A,#24,T0ISRE
  MOV SEC,#0
  MOV MIN,#0
  MOV HOUR,#0
T0ISRE:
  LCALL DISCHG
  POP ACC
  RETI
;--------------------
DISCHG:
  MOV A,HOUR
  LCALL HBCD
  PUSH ACC
  ANL A,#0FH
  MOV 34H,A
  POP ACC
  ANL A,#0F0H
  SWAP A
  MOV 33H,A
  MOV A,MIN
  LCALL HBCD
  PUSH ACC
  ANL A,#0FH
  MOV 36H,A
  POP ACC
  ANL A,#0F0H
  SWAP A
  MOV 35H,A
  MOV A,SEC
  LCALL HBCD
  PUSH ACC
  ANL A,#0FH
  MOV 38H,A
  POP ACC
  ANL A,#0F0H
  SWAP A
  MOV 37H,A
  RET
;--------------------
T1ISR:
  PUSH ACC
  CLR TR1
  MOV TH1,#0ECH
  MOV TL1,#78H
  SETB TR1
  MOV DPTR,#LEDTAB
T100:
  MOV R0,#DAT
  MOV A,SCANLED
  ADD A,R0
  MOV R0,A
  MOV A,SCANLED
  JNZ T101
  MOV P2,#01H
  CLR DOT
  SJMP T1DIS
T101:
  DEC A
  JNZ T102
  MOV P2,#02H
  SETB DOT
  SJMP T1DIS
T102:
  DEC A
  JNZ T103
  MOV P2,#04H
  CLR DOT
  SJMP T1DIS
T103:
  DEC A
  JNZ T104
  MOV P2,#08H
  SETB DOT
  SJMP T1DIS
T104:
  DEC A
  JNZ T105
  MOV P2,#10H
  CLR DOT
  SJMP T1DIS
T105:
  MOV P2,#20H
  CLR DOT
T1DIS:
  MOV A,@R0
  MOVC A,@A+DPTR
  JNB DOT,T1DIS1
  ORL A,#01H
T1DIS1:
  CPL A
  MOV P0,A
  INC SCANLED
  MOV A,SCANLED
  CJNE A,#6,T1END
  MOV SCANLED,#0
T1END:
  POP ACC
  RETI
;--------------------
CHGKEY:
  MOV A,KEYVAL
  JZ KV16
  DEC A
  JNZ KV01
  MOV KEYVAL,#7
  RET
KV01:
  DEC A
  JNZ KV02
  MOV KEYVAL,#4
  RET
KV02:
  DEC A
  JNZ KV03
  MOV KEYVAL,#1
  RET
KV03:
  DEC A
  JNZ KV04
  MOV KEYVAL,#10
  RET
KV04:
  DEC A
  JNZ KV05
  MOV KEYVAL,#8
  RET
KV05:
  DEC A
  JNZ KV06
  MOV KEYVAL,#5
  RET
KV06:
  DEC A
  JNZ KV07
  MOV KEYVAL,#2
  RET
KV07:
  DEC A
  JNZ KV08
  MOV KEYVAL,#0
  RET
KV08:
  DEC A
  JNZ KV09
  MOV KEYVAL,#9
  RET
KV09:
  DEC A
  JNZ KV10
  MOV KEYVAL,#6
  RET
KV10:
  DEC A
  JNZ KV11
  MOV KEYVAL,#3
  RET
KV11:
  DEC A
  JNZ KV12
  MOV KEYVAL,#11
  RET
KV12:
  DEC A
  JNZ KV13
  MOV KEYVAL,#12
  RET
KV13:
  DEC A
  JNZ KV14
  MOV KEYVAL,#13
  RET
KV14:
  DEC A
  JNZ KV15
  MOV KEYVAL,#14
  RET
KV15:
  DEC A
  JNZ KV16
  MOV KEYVAL,#15
  RET
KV16:
  MOV KEYVAL,#0FFH
  RET
;--------------------
LEDTAB: DB 0FCH ;"0" 00H
  DB 60H ;"1" 01H
  DB 0DAH ;"2" 02H
  DB 0F2H ;"3" 03H
  DB 66H ;"4" 04H
  DB 0B6H ;"5" 05H
  DB 0BEH ;"6" 06H
  DB 0E0H ;"7" 07H
  DB 0FEH ;"8" 08H
  DB 0F6H ;"9" 09H
  DB 0EEH ;"A" 0AH
  DB 3EH ;"B" 0BH
  DB 9CH ;"C" 0CH
  DB 7AH ;"D" 0DH
  DB 9EH ;"E" 0EH
  DB 8EH ;"F" 0FH
  DB 00H ;" " 10H
;--------------------
END

追问

NO ,不好不好,太复杂了,可以简单的,我还在搞,而且,8个数码管,12-00-00格式也好看一些。对吧?右下角,我不理解,学的不深,慢慢来吧。

温馨提示:答案为网友推荐,仅供参考
相似回答