last.asm
来自「本设计主要是运用单片机设计一个最小系统——电子时钟」· 汇编 代码 · 共 376 行
ASM
376 行
LED0 EQU 30H
LED1 EQU 31H
LED2 EQU 32H
LED3 EQU 33H
STA0 EQU 34H
STA2 EQU 35H
SEC EQU 36H ;秒计数初始值200
TCN EQU 37H
LDS EQU 38H
SL EQU 39H
SH EQU 3AH
ML EQU 3BH
MH EQU 3CH
YST EQU 3DH;延时1min计数器
NZT EQU 3EH;闹钟响铃时间计数器
NZON EQU 3FH
NZOFF EQU 40H
HL EQU 41H
HH EQU 42H
FLAG0 EQU 21H ;键标志位
FKZJ BIT FLAG0.0
HKZJ BIT FLAG0.1 ;增加键按下标志位=1有效;
FKXZ BIT FLAG0.2
HKXZ BIT FLAG0.3 ;选择键按下标志位=1有效
FKFU BIT FLAG0.4
HKFU BIT FLAG0.5
STOP BIT FLAG0.6;走时允许标志位(当stop=1时禁止走时)
FLASH BIT FLAG0.7;flash=0时数码管正常显示,flash=1数码管闪)
FLAG1 EQU 22H
LEDS BIT FLAG1.0
RING BIT FLAG1.1;鸣叫标志位,为“1”时有效
HNZ BIT FLAG1.2;整点报时有效标志位
FNZ BIT FLAG1.3;正常响铃标志位
SFNZ BIT FLAG1.4;延时响铃标志位
BELL BIT FLAG1.5
;------------------LED0-LED3片选位
CS0 BIT P3.0
CS1 BIT P3.1
CS2 BIT P3.2
CS3 BIT P3.7
KXZ BIT P3.3;选择键
KZJ BIT P3.4;增加键
KFU BIT P3.5
ORG 0000H
LJMP MAIN
MAIN: MOV R1, #04H
MOV R2, #04H
MOV R3, #04H
MOV R4, #04H
MOV R0, #30H
FW: MOV @R0, A
INC R0
CJNE R0, #3DH,FW; 清30H-3CH单元
MOV HL,#02H
MOV HH,#01H
MOV TCN, #50 ;数码管闪烁初始值50
MOV SEC, #200
MOV YST, #28H
MOV NZT, #14H
MOV NZON, #02H
MOV NZOFF, #04H
MOV FLAG0, #00H;总清按键标志位
MOV FLAG1, #00H
MOV LDS, #02H
MOV TMOD, #01H;使用定时器T0的方式1功能
;----------------------------程序开始-------------------------------
START: MOV TH0,#0ECH;定时5ms
MOV TL0,#78H
CLR TF0
SETB TR0
DJNZ TCN,LOOP;250ms到了位闪标志取反
MOV TCN,#50
CPL FLASH
JB STOP,LOOP
DJNZ LDS,LOOP;秒标志亮灭0.5s
CPL LEDS
MOV LDS,#2
;闹钟处理
NZCL: JNB HNZ,WORK
SETB BELL
DJNZ R4,WORK
CLR BELL
CLR HNZ
MOV R4,#04H
WORK: JNB FNZ,NZYS
JB RING,LMP0
CLR BELL
DJNZ NZOFF,LOOP
CPL RING
MOV NZOFF,#02H
SJMP LOOP
LMP0: SETB BELL
DJNZ NZON,NZYS
CPL RING
MOV NZON,#02H
DJNZ NZT,LOOP
MOV NZT,#14H
CLR FNZ
CLR BELL
SJMP LOOP
NZYS: JNB SFNZ,LOOP
DJNZ YST,LOOP
MOV YST,#28H
SETB FNZ
CLR SFNZ
LOOP: LCALL AJSM
LCALL TIME
LCALL DISP0
LCALL NZPD
NEXT0: JB TF0,START
SJMP NEXT0
;----- -按键扫描---------------------------------
AJSM: SETB KFU
SETB KXZ
SETB KZJ
ANJFU: JB KFU,ANJ2
DJNZ R3,ANJ2
MOV R3,#04H
SETB HKFU
ANJ2: JNB KFU,ANJXZ
MOV R3,#04H
JNB HKFU,ANJXZ
CLR HKFU
CPL F0
ANJXZ: JB KXZ,ANJ0
DJNZ R1,ANJ0
MOV R1,#04
SETB HKXZ
ANJ0: JNB KXZ,ANJZJ;是否放开
MOV R0,#04H
JNB HKXZ,ANJZJ
CLR HKXZ
SETB FKXZ
ANJZJ: JB KZJ,ANJ1
DJNZ R2,ANJ1
MOV R2,#04H
SETB HKZJ
ANJ1: JNB KZJ,ANJCL
MOV R2,#04H
JNB HKZJ,ANJCL
CLR HKZJ
SETB FKZJ
;--- ---按键处理---------------
ANJCL: JNB FKXZ,L0
CLR FKXZ
JNB FNZ,LMP1
CLR FNZ
CLR BELL
RET
LMP1: INC STA0;STA0按键次数的查表指针
INC STA0
MOV A,STA0
CJNE A,#0AH,L0;判断查表指针是否超过范围
MOV STA0,#00H
CLR STOP;若调整完所有4位数码管,进入走时状态
MOV SL,#00H
MOV SH,#00H
RET
;-----------增加键处理-----------
L0: JNB FKZJ,NEXT1
CLR FKZJ
JNB FNZ,LMP2
CLR FNZ
SETB SFNZ
CLR BELL
RET
LMP2: SETB STOP;停止走时
MOV A,STA0
MOV DPTR,#TAB0
JMP @A+DPTR
TAB0: AJMP BACK
AJMP TZ_HH
AJMP TZ_HL
AJMP TZ_MH
AJMP TZ_ML
TZ_ML: INC ML ;分低位处理
MOV A,ML
CJNE A,#0AH,NEXT1
MOV ML,#00H
RET
TZ_MH: INC MH ;分高位处理
MOV A,MH
CJNE A,#06H,NEXT1
MOV MH,#00H
RET
TZ_HL: INC HL ;时低位处理
MOV A,HH
XRL A,#02H
JZ L1
MOV A,HL
CJNE A,#0AH,NEXT1
MOV HL,#00H
RET
L1: MOV A,HL
CJNE A,#04H,NEXT1
MOV HL,#00H
RET
TZ_HH: INC HH ;时高位处理
MOV A,HH
CJNE A,#03H,NEXT1
MOV HH,#00H
NEXT1: RET
BACK: CLR SOP
RET
;---- ---正常走时----------
TIME: JB STOP,NEXT2
DJNZ SEC,NEXT2
MOV SEC,#200
INC SL
MOV A,SL
CJNE A,#0AH,NEXT2
MOV SL,#00H
INC SH
MOV A,SH
CJNE A,#06H,NEXT2
MOV SH,#00H
INC ML ;秒计数溢出,分低位加1
MOV A,ML
CJNE A,#0AH,NEXT2
MOV ML,#00H
INC MH ;分低位计数溢出,分高位加1
M1: MOV A,MH
CJNE A,#06H,NEXT2
MOV MH,#00H
INC HL ;分高位计数溢出,时低位加1
SETB HNZ
M2: MOV A,HH
CJNE A,#02H,M3
MOV A,HL
CJNE A,#04H,NEXT2
MOV HL,#00H
INC HH ;时低位计数溢出,时高位加1
LJMP M4
M3: MOV A,HL
CJNE A,#0AH,NEXT2
MOV HL,#00H
INC HH
M4: MOV A,HH
CJNE A,#03H,NEXT2
MOV HH,#00H
NEXT2: RET
;--- ---扫描显示子程序---------
DISP0: JB F0,ZZS5
MOV DPTR,#TAB
MOV A,STA0
JMP @A+DPTR
TAB: AJMP ZZS4;正常显示
AJMP ZZS3;时高位闪
AJMP ZZS2;时低位闪
AJMP ZZS1;分高位闪
AJMP ZZS0;分低位闪
ZZS0: JNB FLASH,ZZS4
MOV LED0,#0AH
MOV LED1,MH
MOV LED2,HL
MOV LED3,HH
LCALL DISP
RET
ZZS1: JNB FLASH,ZZS4
MOV LED0,ML
MOV LED1,#0AH
MOV LED2,HL
MOV LED3,HH
LCALL DISP
RET
ZZS2: JNB FLASH,ZZS4
MOV LED0,ML
MOV LED1,MH
MOV LED2,#0AH
MOV LED3,HH
LCALL DISP
RET
ZZS3: JNB FLASH,ZZS4
MOV LED0,ML
MOV LED1,MH
MOV LED2,HL
MOV LED3,#00H
LCALL DISP
RET
ZZS4: MOV LED0,ML
MOV LED1,MH
MOV LED2,HL
MOV LED3,HH
LCALL DISP
RET
ZZS5: MOV LED0,SL
MOV LED1,SH
MOV LED2,ML
MOV LED3,MH
LCALL DISP
RET
;闹钟时间判断**********************
NZPD: JB STOP,NEXT5
MOV A,ML
CJNE A,#00H,NEXT5
MOV A,MH
CJNE A,#00H,NEXT5
MOV A,HL
CJNE A,#06H,NEXT5
MOV A,HH
CJNE A,#00H,NEXT5
MOV A,SL
CJNE A,#00H,NEXT5
MOV A,SH
CJNE A,#00H,NEXT5
SETB FNZ
NEXT5: RET
;---------5ms刷新动态显示子程序
DISP: SETB CS0
SETB CS1
SETB CS2
SETB CS3
CLR C
MOV C,BELL
MOV DPTR,#TAB1
MOV A,STA2
JMP @A+DPTR
TAB1: AJMP DLED3
AJMP DLED2
AJMP DLED1
AJMP DLED0
DLED0: MOV A,LED0;分低
RLC A
MOV DPTR,#TAB2
MOVC A,@A+DPTR
MOV P1,A
CLR CS0
MOV STA2,#00H
RET
DLED1: MOV A,LED1
RLC A
MOV DPTR,#TAB2
MOVC A,@A+DPTR
MOV P1,A
CLR CS1
MOV STA2,#06H
RET
DLED2: MOV A,LED2;时低
RLC A
JNB F0,N0
MOV A,#0F7H
SJMP N2
N0: MOV DPTR,#TAB2
MOVC A,@A+DPTR
N2: MOV P1,A
CLR CS2
MOV STA2,#04H
RET
DLED3:
MOV A,LED3;时高
RLC A
CLR C
MOV C,LEDS
RLC A
JNB F0,NN
MOV A,#0F7H
SJMP N1
NN: MOV DPTR,#TAB3
MOVC A,@A+DPTR
N1: MOV P1,A
CLR CS3
MOV STA2,#02H
RET
TAB2: DB 88H,08H,0BEH,3EH,0C4H,44H,94H,14H,0B2H,32H
DB 91H,11H,81H,01H,0BCH,3CH,80H,00H,90H,10H,0FFH,7FH
TAB3: DB 0FFH,0FBH,07FH,07BH;0,0:,"0-BELL","0:BELL"
DB 0BEH,0BAH,3EH,3AH
DB 0C4H,0C0H,24H,20H;" "," :","1","1:","2","2:"
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?