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

📄 clock.asm

📁 基于89c51的led时间显示程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;          时钟程序
;-------------------20H------------------------
ENTER      BIT     00H     ;确认键按下标志位
SET_BIT    BIT     01H     ;设置键按下标志位
KEY_MOVE   BIT     02H     ;移动键按下标志位
INC_A      BIT     03H	   ;数字增加键按下标志位
DEC_A      BIT	   04H	   ;数字减少键按下标志位
T0_OVER    BIT	   05H	   ;T0中断溢出标志位
KEY_DW     BIT	   06H	   ;键盘有键按下标志位
K_DOWN     BIT	   07H	   ;已取完键值标志位
;------------------21H------------------------
CURSOR_1   BIT	   08H	   ;光标在第"1"个数码管标志位
CURSOR_2   BIT	   09H	   ;光标在第"2"个数码管标志位
CURSOR_3   BIT	   0AH	   ;光标在第"3"个数码管标志位
CURSOR_4   BIT	   0BH	   ;光标在第"4"个数码管标志位
CURSOR_5   BIT	   0CH	   ;光标在第"5"个数码管标志位
CURSOR_6   BIT	   0DH	   ;光标在第"6"个数码管标志位
CURSOR_7   BIT	   0EH	   ;光标在第"7"个数码管标志位
CURSOR_8   BIT	   0FH	   ;光标在第"8"个数码管标志位
;------------------22H--------------------------------
CURSOR_9   BIT	   10H	   ;光标在第"9"个数码管标志位
CURSOR_10  BIT	   11H	   ;光标在第"10"个数码管标志位
CURSOR_11  BIT	   12H	   ;光标在第"11"个数码管标志位
CURSOR_12  BIT	   13H	   ;光标在第"12"个数码管标志位
CURSOR_13  BIT	   14H	   ;光标在第"13"个数码管标志位
CURSOR_14  BIT	   15H	   ;光标在第"14"个数码管标志位
CURSOR_15  BIT	   16H	   ;光标在第"15"个数码管标志位
CURSOR_16  BIT	   17H	   ;光标在第"16"个数码管标志位
;------------------23H--------------------------------
SEC_FRT    BIT     18H     ;秒二极管亮、灭标志位
RS_REVFA   BIT     19H     ;接收到通信起始位标志
RS_REVFB   BIT     1AH     ;接收完数据标志
SECOND_ON  BIT     1BH     ;秒LED发光管亮标志位
;          BIT     1CH
;          BIT     1DH
;          BIT     1EH
;          BIT     1FH
;------------------24H------------------------
BLINK1     BIT     20H      ;数码管1闪烁控制位
BLINK2     BIT     21H      ;数码管2闪烁控制位
BLINK3     BIT     22H      ;数码管3闪烁控制位
BLINK4     BIT     23H      ;数码管4闪烁控制位
BLINK5     BIT     24H      ;数码管5闪烁控制位
BLINK6     BIT     25H      ;数码管6闪烁控制位
BLINK7     BIT     26H      ;数码管7闪烁控制位
BLINK8     BIT     27H      ;数码管8闪烁控制位
;------------------25H------------------------
BLINK9     BIT     28H      ;数码管9闪烁控制位
BLINK10    BIT     29H      ;数码管10闪烁控制位
BLINK11    BIT     2AH      ;数码管11闪烁控制位
BLINK12    BIT     2BH      ;数码管12闪烁控制位
BLINK13    BIT     2CH      ;数码管13闪烁控制位
BLINK14    BIT     2DH      ;数码管14闪烁控制位
BLINK15    BIT     2EH      ;数码管15闪烁控制位
BLINK16    BIT     2FH      ;数码管16闪烁控制位
;----------------------------------------------
WP         BIT     P1.0    ;X5045/WP信号
DATA_OUT   BIT     P1.1    ;X5045数据输出信号
CS         BIT     P1.2    ;X5045片选信号
SCLK       BIT     P1.3    ;X5045时钟信号
DATA_IN    BIT     P1.4    ;X5045数据输入信号
SER_CLK    BIT	   P1.5    ;DS1302的串行时钟信号
SER_DAT    BIT     P1.6    ;DS1302的串行数据信号
RESET      BIT     P1.7    ;DS1302的RESET信号
;------------------------------------------------
LED_DAT    BIT     P3.2    ;
MCU_KEY    BIT     P3.3    ;BC7281芯片KEY信号
CTRL_SEC   BIT     P3.4    ;秒闪烁控制信号
MCU_CLK    BIT     P3.5    ;BC7281芯片时钟信号
MCU_DAT    BIT     P3.7    ;BC7281芯片数据信号
;------------------内存地址定义------------------
BLINK_A     DATA    24H
BLINK_B     DATA    25H
DAT_OUT     DATA    28H
DAT_IN      DATA    29H
WRITE_DATA  DATA    2AH    ;DS1302命令数据
WRITE_DATB  DATA    2BH    ;DS1302时钟数据
MKEYN       DATA    2CH
BCD_A       DATA    2DH
BCD_B       DATA    2EH
;           DATA    2FH
;---------------------------
HOUR_H      DATA    30H     ;
HOUR_L      DATA    31H     ;
MINUTE_H    DATA    32H     ;
MINUTE_L    DATA    33H     ;
DATE_L      DATA    34H     ;
DATE_H      DATA    35H     ;
MOTH_H      DATA    36H     ;
MOTH_L      DATA    37H     ;
YEAR_A      DATA    38H     ;
YEAR_B      DATA    39H     ;
YEAR_H      DATA    3AH     ;
YEAR_L      DATA    3BH     ;
;           DATA    3CH     ;
;           DATA    3DH     ;
;           DATA    3EH     ;
;           DATA    3FH     ;
;------------------------------
YEAR_DAT    DATA    40H
MOTH_DAT    DATA    41H
DATE_DAT    DATA    42H
WEEK_DAT    DATA    43H
HOUR_DAT    DATA    44H
MINUTE_DAT  DATA    45H
SECOND_DAT  DATA    46H
SEC_OLD     DATA    47H
TACOM       DATA    48H
RXDAT       DATA    49H
RS_DATA     DATA    4AH
;           DATA    4BH
;           DATA    4CH
;           DATA    4DH
;           DATA    4EH
;           DATA    4FH
;---------RS232数据缓冲区--------
RS_BUFFER   DATA    50H
;           DATA    51H
;           DATA    52H
;           DATA    53H
;           DATA    54H
;           DATA    55H
;           DATA    56H
;           DATA    57H
;           DATA    58H
;           DATA    59H
;┌─────────DS1302寄存器及控制字───────────┐
;│ 寄存器名     命令    取值范围           各位内容           │
;│          写   读            7    6   5   4  3  2  1  0 │
;│秒寄存器  |80H  81H  | 00-59   |  CH |  10SEC   |    SEC    │
;│分寄存器  |82H  83H  | 00-59   |   0 |  10MIN   |    MIN    │
;│时寄存器  |84H  85H  |1-12 0-23|12/24| 0 10AP HR|   HOUR    │
;│日寄存器  |86H  87H  | 01-31   |   0 | 0 10DATE |   DATE    │
;│月寄存器  |88H  89H  | 01-12   |   0 | 0  0  10M|  MONTH    │
;│周寄存器  |8AH  8BH  | 00-07   |   0 | 0  0   0 | 0  DAY    │
;│年寄存器  |8CH  8DH  | 00-99   |   0 | 10YEAR   |   YEAR    │
;├──────────────────────────────┤
;│  注释:                                                    │
;│  1. CH:秒时钟触发位                                       │
;│         CH=1时钟禁止                                       │
;│         CH=0正常工作                                       │
;│  2. 12/24:12小时、24小时选择位                            │
;│         =1 12小时模式                                      │
;│         =0 24小时模式                                      │
;│  3. AM/PM:上午、下午位                                    │
;│         =1  表示AM(上午)                                 │
;│         =0  表示PM(下午)                                 │
;├──────────────────────────────┤
;│   DS1303命令格式:                                          │
;│        D7    D6    D5    D4    D3    D2    D1    D0        │
;│        1  RAM/CLK  A4    A3    A2    A1    A0   RD/WR      │
;│                                                            │
;│   D6=RAM/CLK="1"  指向DS1302的内部RAM                      │
;│   D6=RAM/CLK="0"  指向DS1302的内部时钟                     │
;│   D0=RD/WR="1"    进行内部RAM或时钟读操作                  │
;│   D0=RD/WR="0"    进行内部RAM或时钟写操作                  │
;│   A0---A4:        内部RAM或时钟地址                        │
;└──────────────────────────────┘
	ORG     0000H
	LJMP    MAIN
	ORG     000BH
	LJMP    TIME0PR
	ORG     0023H
	LJMP    RS_RECEIVE
	ORG     100H
MAIN:   LCALL   DS1302_INIT     ;DS1302初始化
        LCALL   RAM_INT         ;内部存储器初始化
	LCALL   LED_INT         ;数码管初始化
        LCALL   RS_SET          ;RS232接口初始化
	MOV     SP,#60H
;-----------主程序-----------
START00:JNB     T0_OVER,START01
	CLR     T0_OVER                ;  T0_OVER(T0中断溢出标志位)清零
        LCALL   SECOND
        LCALL   READ_KEY
;--------键盘按键处理----------
START01:JNB     KEY_DW,START02
	LCALL   KEYPROG                 ;键盘处理
	CLR     KEY_DW
	MOV     MKEYN,#0FFH
START02:JNB     RS_REVFB,START00
        MOV     A,RS_BUFFER+1           ;设置时间、日期
        CJNE    A,#01H,START00
        LCALL   SET_TIME
        LCALL   DISPLAY_TIME
        LCALL   CLR_BUFFER
        LJMP    START00
;-----------秒处理程序------------
SECOND: MOV	WRITE_DATA,#81H
	LCALL	LOAD_SDAT
        MOV     SECOND_DAT,A            ; 1302读来的数据送SECOND_DAT
        ANL     SECOND_DAT,#7FH         ; 并将其最高位清零
        JB      SEC_FRT,SEC_NA          ; 秒二极管亮灭标志位为1则转SEC_NA
        MOV     SEC_OLD,A
        SETB    SEC_FRT
        LJMP    SEC_RET
SEC_NA: CJNE    A,SEC_OLD,SEC_NB
        LJMP    SEC_RET
SEC_NB: JB      SECOND_ON,SEC_NC
        SETB    SECOND_ON
        CLR     CTRL_SEC
        LJMP    SEC_ND
SEC_NC: CLR     SECOND_ON
        SETB    CTRL_SEC
SEC_ND: MOV     SEC_OLD,SECOND_DAT
        LCALL   DISPLAY_TIME
SEC_RET:RET
;--显示时间、日期、温/湿度数据----
DISPLAY_TIME:
        LCALL   READ_TIMER
        LCALL   WRITE_LED
        RET
;-------------------------------
SET_TIME:
        MOV     YEAR_DAT,RS_BUFFER+2
        LCALL   BCD_HYEAR
        MOV     MOTH_DAT,RS_BUFFER+3
        LCALL   BCD_HMOTH
        MOV     DATE_DAT,RS_BUFFER+4
        LCALL   BCD_HDATE
        MOV     WEEK_DAT,RS_BUFFER+5
        MOV     HOUR_DAT,RS_BUFFER+6
        LCALL   BCD_HMINUTE
        MOV     MINUTE_DAT,RS_BUFFER+7
        MOV     SECOND_DAT,RS_BUFFER+8
        LCALL   WRITE_TIMER
        RET
;------- 定时器“0”中断 ------
TIME0PR:PUSH    ACC
        PUSH    PSW
	MOV     TH0,#0C0H
	MOV     TL0,#58H
	MOV     A,TACOM
	INC     A
	CJNE    A,#08H,TIME0PB
TIME0PA:MOV     A,#00H
        MOV     TACOM,A
        SETB    T0_OVER
        LJMP    TIME0PD
TIME0PB:JNC     TIME0PA
        MOV     TACOM,A
TIME0PD:SETB    TR0
        POP     PSW
	POP     ACC
	RETI
;********读键值程序*************
READ_KEY:JB     MCU_KEY,READ_REC
	 JB     K_DOWN,READ_RET
	 MOV    DAT_OUT,#93H
	 LCALL  SEND_A
	 LCALL  RECEIVE
	 MOV    A,DAT_IN
	 CJNE   A,#05,READ_REA
	 LJMP   READ_REB
READ_REA:JNC    READ_RET
READ_REB:SETB   K_DOWN
         RET
READ_REC:JNB    K_DOWN,READ_RET
	 MOV    MKEYN,DAT_IN
	 SETB   KEY_DW
	 CLR    K_DOWN
READ_RET:RET
;*********主键盘处理程序*******
KEYPROG:MOV     A,MKEYN
	CJNE    A,#0FFH,KEYPRA
	LJMP    KEYPRET
KEYPRA: CJNE    A,#05H,KEYPRB
	LJMP    KEYPRC
KEYPRB: JC      KEYPRC
	LJMP    KEYPRET
KEYPRC: CLR     C
	MOV     B,#3
	MUL     AB
	MOV     DPTR,#JMPTBL
	JMP     @A+DPTR
        RET
;********功能键跳转*********
JMPTBL:  LJMP	 KEY_SET
	 LJMP    INC_KEY
	 LJMP	 DEC_KEY
	 LJMP	 MOVE_KEY
	 LJMP	 ENTER_KEY
         LJMP    KEYPRET
 KEYPRET:RET
;---------------------------------
KEY_SET:
         LJMP    KEYPRET
;---数字增加键处理程序---
INC_KEY:JNB     KEY_MOVE,KEYPRET
        LCALL   KEY_INCPROG
	LJMP	KEYPRET
;---数字减少键处理程序---
DEC_KEY:JNB     KEY_MOVE,KEYPRET
        LCALL   KEY_DECPROG
	LJMP	KEYPRET
;------数字移动键处理程序--------
MOVE_KEY:
        SETB    KEY_MOVE
        LCALL   KEY_MOVPROG
	LJMP	KEYPRET
;-----确认键按下处理程序------
ENTER_KEY:
        JNB     KEY_MOVE,KEYPRET
        MOV     BCD_A,#0FFH
        MOV     BCD_B,#0FFH
        LCALL   WRITE_BLINK
        LCALL   WRITE_LED
        ANL     20H,#0E0H
        CLR     CURSOR_1
        LJMP    KEYPRET
;------光标位置检查处理程序---
KEY_MOVPROG:
        JNB     CURSOR_1,MOV_001
        CLR     CURSOR_1        ;光标在第“1”位
        SETB    CURSOR_2
	SETB    BLINK1
        CLR     BLINK2
	MOV     BCD_A,BLINK_A
	MOV     BCD_B,BLINK_B
	LCALL   WRITE_BLINK
        LJMP    MOV_RET
MOV_001:JNB     CURSOR_2,MOV_002
        CLR     CURSOR_2        ;光标在第“2”位
        SETB    CURSOR_3
	SETB    BLINK2
        CLR     BLINK3
	MOV     BCD_A,BLINK_A
	MOV     BCD_B,BLINK_B
	LCALL   WRITE_BLINK
        LJMP    MOV_RET
MOV_002:JNB     CURSOR_3,MOV_003
        CLR     CURSOR_3        ;光标在第“3”位
        SETB    CURSOR_4
	SETB    BLINK3
        CLR     BLINK4
	MOV     BCD_A,BLINK_A
	MOV     BCD_B,BLINK_B
	LCALL   WRITE_BLINK
        LJMP    MOV_RET
MOV_003:JNB     CURSOR_4,MOV_004
        CLR     CURSOR_4        ;光标在第“4”位
        SETB    CURSOR_5
	SETB    BLINK4
        CLR     BLINK5
	MOV     BCD_A,BLINK_A
	MOV     BCD_B,BLINK_B
	LCALL   WRITE_BLINK
        LJMP    MOV_RET
MOV_004:JNB     CURSOR_5,MOV_005
        CLR     CURSOR_5        ;光标在第“5”位
        SETB    CURSOR_6
	SETB    BLINK5
        CLR     BLINK6
	MOV     BCD_A,BLINK_A
	MOV     BCD_B,BLINK_B
	LCALL   WRITE_BLINK
        LJMP    MOV_RET
MOV_005:JNB     CURSOR_6,MOV_006
        CLR     CURSOR_6        ;光标在第“6”位
        SETB    CURSOR_7
	SETB    BLINK6
        CLR     BLINK7
	MOV     BCD_A,BLINK_A
	MOV     BCD_B,BLINK_B
	LCALL   WRITE_BLINK
        LJMP    MOV_RET
MOV_006:JNB     CURSOR_7,MOV_007
        CLR     CURSOR_7        ;光标在第“7”位
        SETB    CURSOR_8
	SETB    BLINK7
        CLR     BLINK8
	MOV     BCD_A,BLINK_A
	MOV     BCD_B,BLINK_B
	LCALL   WRITE_BLINK
        LJMP    MOV_RET
MOV_007:JNB     CURSOR_8,MOV_008
        CLR     CURSOR_8        ;光标在第“8”位
        SETB    CURSOR_13
	SETB    BLINK8
        CLR     BLINK13
	MOV     BCD_A,BLINK_A
	MOV     BCD_B,BLINK_B
	LCALL   WRITE_BLINK
        LJMP    MOV_RET
MOV_008:JNB     CURSOR_9,MOV_009
        CLR     CURSOR_9        ;光标在第“09”位
        SETB    CURSOR_10
	SETB    BLINK9
        CLR     BLINK10
	MOV     BCD_A,BLINK_A
	MOV     BCD_B,BLINK_B
	LCALL   WRITE_BLINK
        LJMP    MOV_RET
MOV_009:JNB     CURSOR_10,MOV_010
        CLR     CURSOR_10        ;光标在第“10”位
        SETB    CURSOR_11
	SETB    BLINK10
        CLR     BLINK11
	MOV     BCD_A,BLINK_A
	MOV     BCD_B,BLINK_B
	LCALL   WRITE_BLINK
        LJMP    MOV_RET
MOV_010:JNB     CURSOR_11,MOV_011
        CLR     CURSOR_11        ;光标在第“11”位
        SETB    CURSOR_12
	SETB    BLINK11
        CLR     BLINK12
	MOV     BCD_A,BLINK_A
	MOV     BCD_B,BLINK_B
	LCALL   WRITE_BLINK
        LJMP    MOV_RET
MOV_011:JNB     CURSOR_12,MOV_012
        CLR     CURSOR_12        ;光标在第“12”位
        SETB    CURSOR_1
	SETB    BLINK12
        CLR     BLINK1
	MOV     BCD_A,BLINK_A
	MOV     BCD_B,BLINK_B
	LCALL   WRITE_BLINK
        LJMP    MOV_RET
MOV_012:SETB    CURSOR_1
        CLR     BLINK1
	MOV     BCD_A,BLINK_A
	MOV     BCD_B,BLINK_B
	LCALL   WRITE_BLINK
MOV_RET:RET
;-------数字增加处理程序-------
KEY_INCPROG:
        JNB     CURSOR_1,INC_002
        MOV     A,YEAR_A        ;光标在第“01”位
        CJNE    A,#09H,INC_001
        LJMP    INC_RET
INC_001:INC     A
        MOV     YEAR_A,A
        LJMP    INC_RET
INC_002:JNB     CURSOR_2,INC_004
        MOV     A,YEAR_B        ;光标在第“02”位
        CJNE    A,#09H,INC_003
        LJMP    INC_RET
INC_003:INC     A
        MOV     YEAR_B,A
        LJMP    INC_RET
INC_004:JNB     CURSOR_3,INC_006
        MOV     A,YEAR_H        ;光标在第“03”位
        CJNE    A,#09H,INC_005
        LJMP    INC_RET
INC_005:INC     A
        MOV     YEAR_H,A
        LJMP    INC_RET
INC_006:JNB     CURSOR_4,INC_008
        MOV     A,YEAR_L        ;光标在第“04”位
        CJNE    A,#09H,INC_007
        LJMP    INC_RET
INC_007:INC     A
        MOV     YEAR_L,A
        LJMP    INC_RET
INC_008:JNB     CURSOR_5,INC_010
        MOV     A,MOTH_H        ;光标在第“05”位
        CJNE    A,#09H,INC_009
        LJMP    INC_RET
INC_009:INC     A
        MOV     MOTH_H,A
        LJMP    INC_RET
INC_010:JNB     CURSOR_6,INC_012
        MOV     A,MOTH_L        ;光标在第“06”位
        CJNE    A,#09H,INC_011
        LJMP    INC_RET
INC_011:INC     A
        MOV     MOTH_L,A

⌨️ 快捷键说明

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