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

📄 万年历.asm

📁 一个单片机+实时时钟芯片实现的万年历程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
        BIT7    EQU     3FH
        BIT6    EQU     3EH
        BIT5    EQU     3DH
        BIT4    EQU     3CH
        BIT3    EQU     3BH
        BIT2    EQU     3AH
        BIT1    EQU     39H
        BIT0    EQU     38H
        ORG     0000H
        AJMP    MAIN
        ORG     30H
MAIN:   MOV     SP,70H
;初始化 DS12887
        MOV     DPTR,#7F0AH;         寄存器A的地址
        MOV     A,#70H;              DV2~DV0=111,分频复位
        MOVX    @DPTR,A;
        INC     DPTR;                到寄存器B地址
        MOV     A,#8AH;              停止更新,允许更新中断,选BCD码,24小时制
        MOVX    @DPTR,A;
        MOV     DPL,#00H;            秒单元地址
        CLR     A;                   00秒
        MOVX    @DPTR,A;
        MOV     DPL,#02H;            分单元地址
        CLR     A;00分
        MOVX    @DPTR,A;
        MOV     DPL,#04H;            时单元地址
        MOV     A,#09H;              9时
        MOVX    @DPTR,A;
        MOV     DPL,#07H;           日单元地址
        MOV     A,#01H;              1日
        MOVX    @DPTR,A;
        MOV     DPL,#08H;                到月地址
        MOV     A,#01H;             1月
        MOVX    @DPTR,A;
        INC     DPTR;               到年单元地址
        MOV     A,#98H;             1998年
        MOVX    @DPTR,A;
        INC     DPTR;               到寄存器A地址
        MOV     A,#26H;             DV2~DV0=010  RS3~RS0=0110
        MOVX    @DPTR,A;            选中断周期为976.5625μs,允许方波输出,频率1kHz
        INC     DPTR;               到寄存器B
        MOV     A,#1AH;             每秒更新一次,允许方波输出,24小时制,BCD码的数据
        MOVX    @DPTR,A;            时钟开始运行
        MOV     R0,#16H;
        MOV     @R0,#00H;           设计地址为 00H:年月日,01H:时分秒

        CALL    INST;                   液晶初始化
        CALL    CLRDP
        CALL    D1S;                    并保持1秒


RGAIN:  CALL    CLRDP;                  清屏
MAIN1:  CALL    GAIN;                   读取时间
        CALL    DISPLAY;                显示
A13:    CALL    D100MS
        JNB     P1.3,SET10;             如有按键P1.3按下,则进入更改时间子程序
        AJMP    MAIN1;                  回显示
SET10:  LJMP    S21;


;液晶初始化子程序
INST:	MOV    	R7,#4
INST1:	MOV	A,#38H;   		5X7X2
	ACALL	CODE1
	ACALL	DIMS1
	DJNZ	R7,INST1
        MOV     A,#06H;                 光标以增量方式移动,整体显示不移动
	ACALL	CODE1
	ACALL	DIMS1
	MOV	A,#0CH;                 显示开,光标关,光标位不闪烁
	ACALL	CODE1
	ACALL	DIMS1
	ACALL	CLRDP
	ACALL	DIMS1
	RET


;清屏子程序
CLRDP:	MOV	A,#01H;                  送指令
	ACALL	RDBUSY;                  读忙标志
	ACALL	CODE1;                   不忙,则操作
	RET


;向显示屏发送A中的命令
CODE1:  NOP
	ACALL	RDBUSY;                  读忙标志
	NOP
        CLR	P3.4;                    R/W置0
        CLR	P3.5;                    RS置0
        SETB	P2.0;                    E置1,选中
        MOV	P0,A;                    送指令
        CLR	P2.0;                    在下降沿写入
        SETB	P3.4
        RET


;延时5ms子程序
DIMS1:	MOV	R6,#5
DLAY2:	MOV	R5,#64H
DLAY3:	NOP
	NOP
	NOP
	NOP
	DJNZ	R5,DLAY3
	DJNZ	R6,DLAY2
	RET


;读忙标志子程序
RDBUSY:	PUSH	ACC;			 显示屏不忙则返回,否则一直等待
	CLR	P2.0
	CLR	P3.5
	SETB	P3.4
RBS:	SETB	P2.0
	MOV	A,P0
	CLR	P2.0
	RLC	A
 	JC	RBS
	CLR	P2.0
	POP	ACC
	RET


;向显示屏发送A中的数据显示子程序
DATA1:  NOP;
	ACALL	RDBUSY;                  读忙标志
	NOP
        CLR	P3.4
        SETB	P3.5
        SETB	P2.0
        MOV	P0,A
        CLR	P2.0;                    在下降沿写入
        SETB	P3.4
        RET


;时间读取子程序
;依次从DS12887读出年、周日、月、日、时、分、秒
;对应的存入R6、R5、R4、R3、R2、R1、R0中(BCD码形式)
;查询方式读出数据
GAIN:  MOV     DPTR,#7F0AH;
        MOVX    A,@DPTR;
WAIT:   JB      ACC,WAIT;
        MOV     DPL,#00H;               秒地址
        MOVX    A,@DPTR;
        MOV     R0,A;
        MOV     DPL,#02H;               分地址
        MOVX    A,@DPTR;
        MOV     R1,A;4
        MOV     DPL,#04H;               时地址
        MOVX    A,@DPTR;
        MOV     R2,A;
        MOV     DPL,#07H;               日地址
        MOVX    A,@DPTR;
        MOV     R3,A;
        MOV     DPL,#08H;               月地址
        MOVX    A,@DPTR;
        MOV     R4,A;
        MOV     DPL,#06;                周日地址
        MOVX    A,@DPTR;
        MOV     R5,A;
        MOV     DPL,#09H;               年地址
        MOVX    A,@DPTR;
        MOV     R6,A;
        RET


;当前时间送LCD显示子程序
DISPLAY: MOV    A,#10000000B;
         CALL   CODE1;
         MOV    A,R5;
         ANL    A,#11110000B;
         SWAP   A;
         ORL    A,#00110000B;
         CALL   DATA1;
         MOV    A,R5;
         ANL    A,#00001111B;
         ORL    A,#00110000B;
         CALL   DATA1;                   显示年
         MOV    A,#00101110B;
         CALL   DATA1;                   间隔点
         MOV    A,R4;
         ANL    A,#11110000B;
         SWAP   A;
         ORL    A,#00110000B;
         CALL   DATA1;
         MOV    A,R4;
         ANL    A,#00001111B;
         ORL    A,#00110000B;
         CALL   DATA1;                   显示月
         MOV    A,#00101110B;
         CALL   DATA1;                   间隔点
         MOV    A,R3;
         ANL    A,#11110000B;
         SWAP   A;
         ORL    A,#00110000B;
         CALL   DATA1;
         MOV    A,R3;
         ANL    A,#00001111B;
         ORL    A,#00110000B;
         CALL   DATA1;                   显示日
         MOV    A,#10001010B;
         CALL   CODE1;                   DD RAM地址设置
         MOV    A,#00101010B;
         CALL   DATA1;                   显示*号

         MOV    A,R2;
         JNB    ACC.7,M24;               判断24/12制

AM:      MOV    A,#11000001B;
         CALL   CODE1;
         MOV    A,#01000001B;
         CALL   DATA1;
         MOV    A,#01001101B;
         CALL   DATA1;                   显示“AM”
M240:    MOV    A,#11000100B;
         CALL   CODE1;
         MOV    A,R2;
         ANL    A,#00010000B;
         SWAP   A;
         ORL    A,#00110000B;
         CALL   DATA1;
         AJMP   M241;
M24:     MOV    A,#11000100B;
         CALL   CODE1;                   DD RAM地址设置
         MOV    A,R2;
         ANL    A,#11110000B;
         SWAP   A;
         ORL    A,#00110000B;
         CALL   DATA1
M241:    MOV    A,R2;
         ANL    A,#00001111B;
         ORL    A,#00110000B;
         CALL   DATA1;                   显示时
         MOV    A,#00111010B;
         CALL   DATA1;                   显示双间隔点
         MOV    A,R1;
         ANL    A,#11110000B;
         SWAP   A;
         ORL    A,#00110000B;
         CALL   DATA1;
         MOV    A,R1;
         ANL    A,#00001111B;
         ORL    A,#00110000B;
         CALL   DATA1;                   显示分
         MOV    A,#00111010B;
         CALL   DATA1;                   显示双间隔点
         MOV    A,R0;
         ANL    A,#01110000B;            最终显示:
         SWAP   A;                       ================
         ORL    A,#00110000B;            02.05.02  *4 #01
         CALL   DATA1;                    AM 01:50:40
         MOV    A,R0;                    ================
         ANL    A,#00001111B;
         ORL    A,#00110000B;
         CALL   DATA1;                   显示秒
         RET






;DS12887数据读出子程序(输入指令在A中,读出数据也在A中)
DSOUT:   MOV   DPH,#7FH;
         MOV   DPL,A;
         MOVX  A,@DPTR
         RET


;DS12887数据写入子程序(输入指令在A中,写入数据在R0中)
DSIN:    MOV    DPH,#7FH;
         MOV    DPL,A;
         MOV    A,R0;
         MOVX   @DPTR,A;
         RET


;延时30ms子程序
DIMS:   MOV     A,R6
        PUSH    A
        MOV     R6,#20H
DLAY:	MOV     R7,#64H
DLAY1:	NOP
	NOP
	NOP
	NOP
	DJNZ     R7,DLAY1
	DJNZ     R6,DLAY
        POP      A
        MOV      R6,A
	RET


;延时1s子程序
D1S:	MOV	R5,#0FFH
D1S2:	ACALL	DIMS
	DJNZ	R5,D1S2
	RET




;时间设置部分程序
S21:    SETB    BIT6;
        SETB    BIT5;
        SETB    BIT4;
        SETB    BIT3;
        SETB    BIT2;
        SETB    BIT1;
        CLR     BIT0;
        CALL    CLRDP;                  设定初始显示
AA:     LCALL   GAIN;                   获取当前时间
        JB      BIT6,AA6;
        MOV     A,#80H
        CALL    CODE1
        MOV     A,#20H
        CALL    DATA1
        CALL    DATA1
        CALL    D100MS
        CALL    DIMS
        JNB     P1.4,RGAIN1
        JNB     P1.5,MOVE0
        JNB     P1.6,SET0
        CALL    D100MS
        CALL    DIMS
        JNB     P1.4,RGAIN1
        JNB     P1.5,MOVE0
        JNB     P1.6,SET0;              闪烁实现及按键判断
        AJMP    AA6
MOVE0:  LJMP    MOVE
SET0:   LJMP    SETA
RGAIN1: LJMP    MAIN1
AA6:    MOV     A,#80H
        CALL    CODE1
        MOV     A,R6;
        ANL     A,#0F0H;
        SWAP    A;
        ORL     A,#30H;
        CALL    DATA1;
        MOV     A,R6;
        ANL     A,#0FH;
        ORL     A,#30H;
        CALL    DATA1;                  显示年
        MOV     A,#2EH;
        CALL    DATA1;                  间隔点
        JB      BIT5,AA5;
        MOV     A,#20H
        CALL    DATA1
        CALL    DATA1
        CALL    D100MS
        CALL    DIMS
        JNB     P1.4,RGAIN2
        JNB     P1.5,MOVE1
        JNB     P1.6,SET11
        CALL    D100MS
        CALL    DIMS
        JNB     P1.4,RGAIN2
        JNB     P1.5,MOVE1
        JNB     P1.6,SET11;             闪烁实现及按键判断
        AJMP    AA5
MOVE1:  LJMP    MOVE
SET11:  LJMP    SETA
RGAIN2: LJMP    MAIN1
AA5:    MOV     A,#83H
        CALL    CODE1
        MOV     A,R4;
        ANL     A,#0F0H;
        SWAP    A;
        ORL     A,#30H;
        CALL    DATA1;
        MOV     A,R4;
        ANL     A,#0FH;
        ORL     A,#30H;
        CALL    DATA1;                  显示月
        MOV     A,#2EH;
        CALL    DATA1;                  间隔点
        JB      BIT4,AA4;
        MOV     A,#20H
        CALL    DATA1
        CALL    DATA1
        CALL    D100MS
        CALL    DIMS
        JNB     P1.4,RGAIN3
        JNB     P1.5,MOVE2
        JNB     P1.6,SET21
        CALL    D100MS
        CALL    DIMS
        JNB     P1.4,RGAIN3
        JNB     P1.5,MOVE2
        JNB     P1.6,SET21;             闪烁实现及按键判断
        AJMP    AA4
MOVE2:  LJMP    MOVE
SET21:  LJMP    SETA
RGAIN3: LJMP    MAIN1
AA4:    MOV     A,#86H
        CALL    CODE1
        MOV     A,R3;
        ANL     A,#0F0H;
        SWAP    A;
        ORL     A,#30H;
        CALL    DATA1;
        MOV     A,R3;
        ANL     A,#0FH;
        ORL     A,#30H;
        CALL    DATA1;                  显示日
        MOV     A,#8AH;
        CALL    CODE1;                  DD RAM地址设置
        MOV     A,#2AH;
        CALL    DATA1;                  显示*号
        JB      BIT3,AA3;
        MOV     A,#20H
        CALL    DATA1

⌨️ 快捷键说明

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