⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock.asm

📁 基于89c51的led时间显示程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
        LJMP    INC_RET
INC_012:JNB     CURSOR_7,INC_014
        MOV     A,DATE_H        ;光标在第“07”位
        CJNE    A,#09H,INC_013
        LJMP    INC_RET
INC_013:INC     A
        MOV     DATE_H,A
        LJMP    INC_RET
INC_014:JNB     CURSOR_8,INC_016
        MOV     A,DATE_L        ;光标在第“08”位
        CJNE    A,#09H,INC_015
        LJMP    INC_RET
INC_015:INC     A
        MOV     DATE_L,A
        LJMP    INC_RET
INC_016:JNB     CURSOR_9,INC_018
        MOV     A,HOUR_H        ;光标在第“09”位
        CJNE    A,#09H,INC_017
        LJMP    INC_RET
INC_017:INC     A
        MOV     HOUR_H,A
        LJMP    INC_RET
INC_018:JNB     CURSOR_10,INC_020
        MOV     A,HOUR_L        ;光标在第“10”位
        CJNE    A,#09H,INC_019
        LJMP    INC_RET
INC_019:INC     A
        MOV     HOUR_L,A
        LJMP    INC_RET
INC_020:JNB     CURSOR_11,INC_022
        MOV     A,MINUTE_H        ;光标在第“11”位
        CJNE    A,#09H,INC_021
        LJMP    INC_RET
INC_021:INC     A
        MOV     MINUTE_H,A
        LJMP    INC_RET
INC_022:JNB     CURSOR_12,INC_RET
        MOV     A,MINUTE_L        ;光标在第“12”位
        CJNE    A,#09H,INC_023
        LJMP    INC_RET
INC_023:INC     A
        MOV     MINUTE_L,A
        LJMP    INC_RET
INC_RET:LCALL   WRITE_LED
        RET
;-------数字减少处理程序----------
KEY_DECPROG:
        JNB     CURSOR_1,DEC_002
        MOV     A,YEAR_A        ;光标在第“01”位
        CJNE    A,#00H,DEC_001
        LJMP    DEC_RET
DEC_001:DEC     A
        MOV     YEAR_A,A
        LJMP    DEC_RET
DEC_002:JNB     CURSOR_2,DEC_004
        MOV     A,YEAR_A        ;光标在第“02”位
        CJNE    A,#00H,DEC_003
        LJMP    DEC_RET
DEC_003:DEC     A
        MOV     YEAR_B,A
        LJMP    DEC_RET
DEC_004:JNB     CURSOR_3,DEC_006
        MOV     A,YEAR_H        ;光标在第“03”位
        CJNE    A,#00H,DEC_005
        LJMP    DEC_RET
DEC_005:DEC     A
        MOV     YEAR_H,A
        LJMP    DEC_RET
DEC_006:JNB     CURSOR_4,DEC_008
        MOV     A,YEAR_L        ;光标在第“04”位
        CJNE    A,#00H,DEC_007
        LJMP    DEC_RET
DEC_007:DEC     A
        MOV     YEAR_L,A
        LJMP    DEC_RET
DEC_008:JNB     CURSOR_5,DEC_010
        MOV     A,MOTH_H        ;光标在第“05”位
        CJNE    A,#00H,DEC_009
        LJMP    DEC_RET
DEC_009:DEC     A
        MOV     MOTH_H,A
        LJMP    DEC_RET
DEC_010:JNB     CURSOR_6,DEC_012
        MOV     A,MOTH_L        ;光标在第“06”位
        CJNE    A,#00H,DEC_011
        LJMP    DEC_RET
DEC_011:DEC     A
        MOV     MOTH_L,A
        LJMP    DEC_RET
DEC_012:JNB     CURSOR_7,DEC_014
        MOV     A,DATE_H        ;光标在第“07”位
        CJNE    A,#00H,DEC_013
        LJMP    DEC_RET
DEC_013:DEC     A
        MOV     DATE_H,A
        LJMP    DEC_RET
DEC_014:JNB     CURSOR_8,DEC_016
        MOV     A,DATE_L        ;光标在第“08”位
        CJNE    A,#00H,DEC_015
        LJMP    DEC_RET
DEC_015:DEC     A
        MOV     DATE_L,A
        LJMP    DEC_RET
DEC_016:JNB     CURSOR_9,DEC_018
        MOV     A,HOUR_H        ;光标在第“09”位
        CJNE    A,#00H,DEC_017
        LJMP    DEC_RET
DEC_017:DEC     A
        MOV     HOUR_H,A
        LJMP    DEC_RET
DEC_018:JNB     CURSOR_10,DEC_020
        MOV     A,HOUR_L        ;光标在第“10”位
        CJNE    A,#00H,DEC_019
        LJMP    DEC_RET
DEC_019:DEC     A
        MOV     HOUR_L,A
        LJMP    DEC_RET
DEC_020:JNB     CURSOR_11,DEC_022
        MOV     A,MINUTE_H        ;光标在第“11”位
        CJNE    A,#00H,DEC_021
        LJMP    DEC_RET
DEC_021:DEC     A
        MOV     MINUTE_H,A
        LJMP    DEC_RET
DEC_022:JNB     CURSOR_12,DEC_RET
        MOV     A,MINUTE_L        ;光标在第“12”位
        CJNE    A,#00H,DEC_023
        LJMP    DEC_RET
DEC_023:DEC     A
        MOV     MINUTE_L,A
DEC_RET:LCALL   WRITE_LED
        RET
;-----------------------------
LED_INT:NOP
        MOV     DAT_OUT,#12H
        LCALL   SEND_A
        MOV     DAT_OUT,#82H
	LCALL   SEND_A          ;复位数码管
        MOV     DAT_OUT,#11H
        LCALL   SEND_A
        MOV     DAT_OUT,#090H
        LCALL   SEND_A
        LCALL   WRITE_LED
        RET
;-----------------------------
WRITE_LED:
        MOV     R2,#00H
        MOV     R0,#30H
LED_INA:LCALL   WR_LED
        INC     R0
        INC     R2
        CJNE    R2,#10H,LED_INA
        RET
;-------数码管显示程序--------
WR_LED: MOV     DAT_OUT,#14H
        LCALL   SEND_A
	MOV     DAT_OUT,@R0      ;数码管显示内容及位置
        MOV     A,R2
        SWAP    A
        ORL     DAT_OUT,A
	LCALL   SEND_A
	RET
;---------------------------
LDELAY: MOV     R6,#60
	DJNZ    R6,$
	RET
;---------------------------
SDELAY: MOV    R6,#10
	DJNZ   R6,$
	RET
;---------------------------
DELAYA: MOV     R6,#0FFH
	DJNZ    R6,$
	RET
;---向计时BC7281发指令/数据程序----
SEND_A: CLR     MCU_CLK
        SETB    MCU_CLK
        JB      MCU_DAT,SEND_A
        CLR     MCU_CLK
        SETB    MCU_CLK
        JNB     MCU_DAT,$
        MOV     A,DAT_OUT
        MOV     R4,#08H
SEND_B: RLC     A
        MOV     MCU_DAT,C
        LCALL   SDELAY
        CLR     MCU_CLK
        SETB    MCU_CLK
        LCALL   SDELAY
        DJNZ    R4,SEND_B
        LCALL   SDELAY
        SETB    MCU_DAT
        RET
;------BC7281读数据程序------
RECEIVE:CLR     MCU_CLK
        SETB    MCU_CLK
        JB      MCU_DAT,$
        CLR     MCU_CLK
        SETB    MCU_CLK
        MOV     R4,#08H
	SETB    MCU_DAT
	LCALL   LDELAY
RECEA:  SETB    MCU_CLK
	CALL    SDELAY
	MOV     A,DAT_IN
	RL      A
	MOV     DAT_IN,A
	MOV     C,MCU_DAT
	MOV     DAT_IN.0,C
	CLR     MCU_CLK
	LCALL   SDELAY
	DJNZ    R4,RECEA
	LCALL   SDELAY
	SETB    MCU_DAT
	RET
;--读DS1302的年、月、日、秒、分、小时数据-----
READ_TIMER:
        MOV     WRITE_DATA,#81H
        LCALL   LOAD_SDAT
        MOV     SECOND_DAT,A
        MOV     WRITE_DATA,#83H
        LCALL   LOAD_SDAT
        MOV     MINUTE_DAT,A
        LCALL   BCD_HMINUTE
        MOV     WRITE_DATA,#85H
        LCALL   LOAD_SDAT
        MOV     HOUR_DAT,A
        LCALL   BCD_HOUR
        MOV     WRITE_DATA,#87H
        LCALL   LOAD_SDAT
        MOV     DATE_DAT,A
        LCALL   BCD_HDATE
        MOV     WRITE_DATA,#89H
        LCALL   LOAD_SDAT
        MOV     MOTH_DAT,A
        LCALL   BCD_HMOTH
        MOV     WRITE_DATA,#8DH
        LCALL   LOAD_SDAT
        MOV     YEAR_DAT,A
        LCALL   BCD_HYEAR
        RET
;--写DS1302的年、月、日、秒、分、小时数据-----
WRITE_TIMER:
        LCALL   DATA_WIRTE
        MOV     WRITE_DATA,#8EH
        MOV     WRITE_DATB,#00H         ;允许写数据
        LCALL   SAVE_SDAT
        MOV     WRITE_DATA,#8CH
        MOV     WRITE_DATB,YEAR_DAT
        LCALL   SAVE_SDAT
        MOV     WRITE_DATA,#8AH
        MOV     WRITE_DATB,WEEK_DAT
        LCALL   SAVE_SDAT
        MOV     WRITE_DATA,#88H
        MOV     WRITE_DATB,MOTH_DAT
        LCALL   SAVE_SDAT
        MOV     WRITE_DATA,#86H
        MOV     WRITE_DATB,DATE_DAT
        LCALL   SAVE_SDAT
        MOV     WRITE_DATA,#84H
        MOV     WRITE_DATB,HOUR_DAT
        LCALL   SAVE_SDAT
        MOV     WRITE_DATA,#82H
        MOV     WRITE_DATB,MINUTE_DAT
        LCALL   SAVE_SDAT
        MOV     WRITE_DATA,#80H
        MOV     WRITE_DATB,SECOND_DAT
        LCALL   SAVE_SDAT
        RET
;------------------------------------
DATA_WIRTE:
        MOV     YEAR_DAT,#04H
        MOV     MOTH_DAT,#07H
        MOV     DATE_DAT,#12H
        MOV     WEEK_DAT,#01H
        MOV     HOUR_DAT,#11H
        MOV     MINUTE_DAT,#05H
        MOV     SECOND_DAT,#00H
        RET
;-------分BCD码转换为16进制数----
BCD_HMINUTE:
        MOV     MINUTE_L,MINUTE_DAT
        ANL     MINUTE_L,#0FH
        MOV     A,MINUTE_DAT
        SWAP    A
        ANL     A,#07H
        MOV     MINUTE_H,A
        RET
;-------时BCD码转换为16进制数----
BCD_HOUR:
        MOV     HOUR_L,HOUR_DAT
        ANL     HOUR_L,#0FH
        MOV     A,HOUR_DAT
        SWAP    A
        ANL     A,#03H
        MOV     HOUR_H,A
        RET
;-------日BCD码转换为16进制数----
BCD_HDATE:
        MOV     DATE_L,DATE_DAT
        ANL     DATE_L,#0FH
        MOV     A,DATE_DAT
        SWAP    A
        ANL     A,#03H
        MOV     DATE_H,A
        RET
;-------月BCD码转换为16进制数----
BCD_HMOTH:
        MOV     MOTH_L,MOTH_DAT
        ANL     MOTH_L,#0FH
        MOV     A,MOTH_DAT
        SWAP    A
        ANL     A,#03H
        MOV     MOTH_H,A
        RET
;------年BCD码转换为16进制数----
BCD_HYEAR:
        MOV     YEAR_L,YEAR_DAT
        ANL     YEAR_L,#0FH
        MOV     A,YEAR_DAT
        SWAP    A
        ANL     A,#03H
        MOV     YEAR_H,A
        RET
;-----向DS1302芯片写时钟数据------
SAVE_SDAT:
	CLR	SER_CLK
	NOP
	SETB	RESET
	MOV	R5,#08H
        MOV     A,WRITE_DATA
SAVE_PA:CLR	SER_CLK
	RRC	A
	MOV	SER_DAT,C    ;发送命令字
	SETB	SER_CLK
	NOP
	DJNZ	R5,SAVE_PA
	MOV	R5,#08H
        MOV     A,WRITE_DATB
SAVE_PB:CLR	SER_CLK
	RRC	A
	MOV	SER_DAT,C    ;发送写数据
	SETB	SER_CLK
	DJNZ	R5,SAVE_PB
        CLR     RESET
 	RET
;----读DS1302芯片时钟数据------
LOAD_SDAT:
	CLR	SER_CLK            ; DS1302串行时钟信号清位(用SER_CLK的高低作为时钟信号控制1302的动作)
	NOP
	SETB	RESET              ; DS1302复位信号置位,即启动1302发送数据
	MOV	R5,#08H
        MOV     A,WRITE_DATA       ; 读入1302的命令数据
LOAD_PA:CLR	SER_CLK
	RRC	A
	MOV	SER_DAT,C     ;发送命令字——送串行数据信号
	SETB	SER_CLK
	NOP
	DJNZ	R5,LOAD_PA        ; 共8次
	MOV	R5,#08H
	CLR	SER_CLK
	NOP
        SETB    SER_DAT
	MOV	R5,#08H
LOAD_PB:CLR	SER_CLK
	MOV	C,SER_DAT    ;将读到的数据送“C”标志位
	RRC	A
	SETB	SER_CLK
	NOP
	DJNZ	R5,LOAD_PB
	CLR     RESET
	RET
;---------------------------
DS1302_INIT:
        MOV     WRITE_DATA,#90H
        MOV     WRITE_DATB,#0A0H         ;禁止向备用电池充电
        LCALL   SAVE_SDAT
        MOV     WRITE_DATA,#80H
        MOV     WRITE_DATB,#00H         ;秒开始计数
        LCALL   SAVE_SDAT
        MOV     WRITE_DATA,#8EH
        MOV     WRITE_DATB,#80H
        LCALL   SAVE_SDAT               ;禁止向DS1302写数据
        RET
;-----RS232初始化程序--------
RS_SET:	MOV     TMOD,#21H
	MOV     TH1,#0F4H
	MOV     TL1,#0F4H
	MOV     SCON,#01010000B
	MOV     PCON,#80H               ;4800bps
	MOV     TH0,#0CH
	MOV     TL0,#58H
        SETB    ET0             ;允许"T0"中断
 	SETB    TR0             ;启动定时器"0"
	SETB    TR1
	SETB    ES
	SETB    EA
        RET
;--------初始化各参数-----------
RAM_INT:MOV     A,#00H
	MOV     R0,#20H
RAM_INA:MOV     @R0,A
        INC     R0
        CJNE    R0,#60H,RAM_INA
        MOV     RS_BUFFER,#0AAH
        MOV     RS_BUFFER+9,#0BBH
        MOV     RS_DATA,#50H
        MOV     YEAR_A,#02H
        MOV     YEAR_B,#00H
        MOV     A,#0FFH
        MOV     P1,A
        MOV     P3,A
        CLR     CTRL_SEC
        CLR     RESET
        LCALL   WRITE_TIMER
        LCALL   READ_TIMER
        RET
;-----------------------------
RS_RECEIVE:
        PUSH    ACC
        PUSH    PSW
	JNB     TI,RS_RECA
        POP     PSW
	POP     ACC
        RETI
RS_RECA:JNB     RI,RS_RET
        CLR     RI
	MOV     A,SBUF
        CJNE    A,#0AAH,RS_RECD
        SETB    RS_REVFA
RS_RECB:MOV     R1,RS_DATA
        MOV     @R1,A
        INC     R1
        MOV     RS_DATA,R1
        LJMP    RS_RET
RS_RECD:JNB     RS_REVFA,RS_RET
        CJNE    A,#0BBH,RS_RECB
        MOV     R1,RS_DATA
        MOV     @R1,A
        MOV     RS_DATA,#50H
        CLR     RS_REVFA
        SETB    RS_REVFB
RS_RET: POP     PSW
        POP     ACC
       	RETI
;-------------------------
DTIME:  MOV	R3,#080H
	DJNZ	R3,$
 	RET
;--------------------------
CLR_BUFFER:
        MOV     R0,#51H
        MOV     A,#00H
CLR_BUA:MOV     @R0,A
        INC     R0
        CJNE    R0,#59H,CLR_BUA
        RET
;*******数码管显示程序********
WRITE_BLINK:
        MOV     DAT_OUT,#10H
	LCALL   SEND_A
	MOV     DAT_OUT,BCD_A    ;数码管显示位置
	LCALL   SEND_A
        MOV     DAT_OUT,#19H
	LCALL   SEND_A
	MOV     DAT_OUT,BCD_B    ;数码管显示内容
	LCALL   SEND_A
	RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -