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

📄 万年历.asm

📁 万年历程序 本系统采用了以广泛使用的单片机技术为核心,软硬件结合,使硬件部分大为简化,提高了系统稳定性,并采用LED显示电路、键盘电路,使人机交互简便易行,此外结合音乐闹铃电路、看门狗和供电电路
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;;;;;;;;;;;;;;;;;;;;;AT89S51,F=6MHz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;影响第0组的R1,R2,R3,R4,R5,R6,R7;;;;;;;;;;;;;;;;
;;;20H,21H,30H,31H,32H,35H,36H,37H,38H,39H,3AH,3BH,3CH,3DH,3EH;;
        ORG     00H       ;程序从这里开始
        SJMP    MAIN      ;主程序
        ORG     0BH       ;定时器0中断入口
        LJMP    GOTO


        ORG     40H
        ;初始化
   MAIN:MOV     SP,#5FH      ;设堆栈
        MOV     30H,#12H     ;存放小时,设初值
        MOV     31H,#00H     ;存放分钟,设初值
        MOV     32H,#00H     ;存放秒,设初值
        MOV     35H,#06H     ;第一个闹钟的小时位,设初值
        MOV     36H,#30H     ;第一个闹钟的分钟位,设初值
        MOV     37H,#09H     ;第二个闹钟的小时位,设初值
        MOV     38H,#00H     ;第二个闹钟的分钟位,设初值
        MOV     39H,#06H     ;存放年
        MOV     3AH,#11H     ;存放月
        MOV     3BH,#05H     ;存放日
        MOV     3CH,#00H     ;显示缓存,第1,2位
        MOV     3DH,#00H     ;显示缓存,第3,4位
        MOV     3EH,#00H     ;显示缓存,第5,6位

        CLR     00H          ;秒闪烁暂存 20H.0
        SETB    01H          ;闹钟1输出位  20H.1
        SETB    02H          ;闹钟2输出位  20H.2
        CLR     03H          ;按键2是否有效标致位  20H.3
        CLR     04H          ;按键3是否有效标致位  20H.4
        CLR     05H          ;按键2是否有效标致位  20H.5
        CLR     06H          ;闹钟开关标致 20H.6 "0"为开"1"为关
        SETB    07H          ;显示缓存,小数点1
        SETB    08H          ;显示缓存,小数点2
        SETB    09H          ;时钟加减标致位 "0"为小时,"1"为分钟
        SETB    0AH          ;闹钟1加减标致位"0"为小时,"1"为分钟
        SETB    0BH          ;闹钟2加减标致位"0"为小时,"1"为分钟

        MOV     R2,#2        ;设定时次数
        MOV     R3,#50
        MOV     R4,#25
        MOV     TMOD,#02H    ;设定时器0工作方式为方式2
        MOV     TH0,#56      ;设初始值
        MOV     TL0,#56
        SETB    TR0          ;启动定时器和中断
        SETB    ET0
        SETB    EA
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;主程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  MMAIN:JNB     P2.0,MMAIN   ;时钟主程序
 MMAIN2:LCALL   XIAN         ;显示
        LCALL   CS           ;按键秒清零
        LCALL   DAT          ;是否显示年月日
        LCALL   DSQ          ;定时器
        LCALL   T1T2         ;闹钟开关
        CLR     P2.6         ;按键有效
        JNB     P2.0,MENU1
        SJMP    MMAIN2

  MENU1:JNB     P2.0,$       ;时钟调整
        SETB    P1.0
        MOV     3CH,30H      ;将暂存的数转成字形 显示30H
        MOV     3DH,31H      ;将暂存的数转成字形 显示31H
        MOV     3EH,#0ABH    ;将暂存的数转成字形 显示" t"
        CLR     07H          ;显示小数点1
        SETB    08H          ;不显示小数点2
        LCALL   MXIAN        ;显示菜单1
        LCALL   ADDM1        ;按键加一分钟
        LCALL   ADDH1        ;按键加一小时
        LCALL   DECMH        ;减一分钟/一小时
        CLR     P2.6
        JNB     P2.0,MENU2
        SJMP    MENU1

  MENU2:JNB     P2.0,$       ;日期调整
        SETB    P1.0
        MOV     3CH,39H      ;将暂存的数转成字形 显示39H
        MOV     3DH,3AH      ;将暂存的数转成字形 显示3AH
        MOV     3EH,3BH      ;将暂存的数转成字形 显示3BH
        CLR     07H          ;显示小数点1
        CLR     08H          ;显示小数点2
        LCALL   MXIAN        ;显示菜单2
        LCALL   DATEN        ;年份+1
        LCALL   DATEM        ;月份+1
        LCALL   DATED        ;+1日
        CLR     P2.6
        JNB     P2.0,MENU3
        SJMP    MENU2

  MENU3:JNB     P2.0,$       ;闹钟1
        SETB    P1.0
        MOV     3CH,35H      ;将暂存的数转成字形 显示35H
        MOV     3DH,36H      ;将暂存的数转成字形 显示36H
        MOV     3EH,#0A1H    ;将暂存的数转成字形 显示" 1"
        CLR     07H          ;显示小数点1
        SETB    08H          ;不显示小数点2
        LCALL   MXIAN        ;显示菜单3
        LCALL   T1M1         ;闹钟1分钟+1
        LCALL   T1H1         ;闹钟1小时+1
        LCALL   DECT1        ;闹钟1减1小时/1分钟
        CLR     P2.6
        JNB     P2.0,MENU4
        SJMP    MENU3

  MENU4:JNB     P2.0,$       ;闹钟2
        SETB    P1.0
        MOV     3CH,37H      ;将暂存的数转成字形 显示37H
        MOV     3DH,38H      ;将暂存的数转成字形 显示38H
        MOV     3EH,#0A2H    ;将暂存的数转成字形 显示" 2"
        CLR     07H          ;显示小数点1
        SETB    08H          ;不显示小数点2
        LCALL   MXIAN        ;显示菜单4
        LCALL   T2M1         ;闹钟2分钟+1
        LCALL   T2H1         ;闹钟2小时+1
        LCALL   DECT2        ;闹钟减2小时/1分钟
        CLR     P2.6
        JNB     P2.0,MENU5
        SJMP    MENU4
  MENU5:LJMP    MMAIN

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;中断处理;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   GOTO:PUSH    A           ;保护现场
        DJNZ    R3,GOTO1
        MOV     R3,#50
        DJNZ    R4,GOTO1
        MOV     R4,#25
        CPL     00H         ;20H.0  用于秒闪烁
        DJNZ    R2,GOTO1
        MOV     R2,#02H     ;配合定时器定时一秒


        MOV     A,32H       ;秒位是否为59秒,是:秒清零,分钟+1,判断分钟...
        CJNE    A,#59H,M1                   ;否:跳转到秒+1
        MOV     32H,#00H

        MOV     A,31H       ;分钟位同上
        CJNE    A,#59H,M2
        MOV     31H,#00H

        MOV     A,30H       ; 小时位同上
        CJNE    A,#23H,M3
        MOV     30H,#00H
        LCALL   ADDD


        SJMP    GOTO1
     M1:ADD     A,#01       ;秒+1
        DA      A
        MOV     32H,A
        SJMP    GOTO1
     M2:ADD     A,#01       ;分钟+1
        DA      A
        MOV     31H,A
        SJMP    GOTO1
     M3:ADD     A,#01       ; 小时+1
        DA      A
        MOV     30H,A
        SJMP    GOTO1

  GOTO1:POP     A           ;恢复现场
        RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     ;子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;时钟显示专用子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;
   XIAN:MOV     A,32H      ;将暂存的数转成字形
        SWAP    A
        MOV     B,#10H
        DIV     AB
        LCALL   ZH
        MOV     P0,A       ;LED显示秒位
        MOV     P2,#0FEH
        LCALL   DELAY
        MOV     A,B
        LCALL   ZH
        MOV     P0,A
        MOV     P2,#0FDH
        LCALL   DELAY

        MOV     A,31H      ;将暂存的数转成字形
        SWAP    A
        MOV     B,#10H
        DIV     AB
        LCALL   ZH
        MOV     P0,A       ;LED显示分钟位
        MOV     C,00H
        MOV     P0.7,C     ;秒闪烁
        MOV     P2,#0FBH
        LCALL   DELAY
        SETB    P0.7       ; 取消显示小数点
        MOV     A,B
        LCALL   ZH
        MOV     P0,A
        MOV     P2,#0F7H
        LCALL   DELAY

        MOV     A,30H      ;将暂存的数转成字形
        SWAP    A
        MOV     B,#10H
        DIV     AB
        LCALL   ZH
        MOV     P0,A       ;LED显示小时位
        CLR     P0.7       ;显示小数点
        MOV     P2,#0EFH
        LCALL   DELAY
        SETB    P0.7       ;取消显示小数点
        MOV     A,B
        LCALL   ZH
        MOV     P0,A
        MOV     P2,#0DFH
        LCALL   DELAY
        RET

  DELAY:MOV     R5,#0AH     ;延时1mS(6MHz)
     L1:MOV     R6,#19H
     L2:DJNZ    R6,L2
        DJNZ    R5,L1
        RET

     ZH:MOV     DPTR,#TAB   ;字形转换
        MOVC    A,@A+DPTR
        MOV     P2,#0FFH    ;消影
        RET

    TAB:DB      0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;字形0~9
        DB      0FFH,87H,0C8H,0A1H,86H,8EH ;字形 A=" ",B="t",C="n",F="F",-hsz

   TAB2:DB      30H,31H,28H,31H,30H,31H,30H,31H,31H,30H,31H,30H,31H ;每个月的天数,平年
   TAB3:DB      30H,31H,29H,31H,30H,31H,30H,31H,31H,30H,31H,30H,31H ;每个月的天数,闰年

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;显示子程序结束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;菜单显示子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  MXIAN:MOV     A,3EH      ;将暂存的数转成字形
        SWAP    A
        MOV     B,#10H
        DIV     AB
        LCALL   ZH
        MOV     P0,A       ;LED显示5,6位
        MOV     P2,#0FEH
        LCALL   DELAY
        MOV     A,B
        LCALL   ZH
        MOV     P0,A
        MOV     P2,#0FDH
        LCALL   DELAY

        MOV     A,3DH      ;将暂存的数转成字形
        SWAP    A
        MOV     B,#10H
        DIV     AB
        LCALL   ZH
        MOV     P0,A       ;LED显示3,4位
        MOV     C,08H
        MOV     P0.7,C     ;是否显示小数点2
        MOV     P2,#0FBH
        LCALL   DELAY
        SETB    P0.7       ; 取消显示小数点
        MOV     A,B
        LCALL   ZH
        MOV     P0,A
        MOV     P2,#0F7H
        LCALL   DELAY

        MOV     A,3CH      ;将暂存的数转成字形
        SWAP    A
        MOV     B,#10H
        DIV     AB
        LCALL   ZH
        MOV     P0,A       ;LED显示1,2位
        MOV     C,07H
        MOV     P0.7,C     ;是否显示小数点1
        MOV     P2,#0EFH
        LCALL   DELAY
        SETB    P0.7       ; 取消显示小数点
        MOV     A,B
        LCALL   ZH
        MOV     P0,A
        MOV     P2,#0DFH
        LCALL   DELAY
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;按键子程序开始;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

     CS:MOV     P0,#0FFH      ;秒清零
        MOV     P2,#10111111B
        JB      P2.1,CS1
        MOV     32H,#00H
    CS1:SETB    P2.6
        RET
 ;-------------------------------------------------------------------
  ADDM1:MOV     P0,#0FFH      ;加一分钟
        MOV     P2,#10111111B
        JNB     P2.2,ADDM11
        CLR     03H      ;按键2是否有效
 ADDM11:JB      03H,ADDM12
        JB      P2.2,ADDM12
        LCALL   MXIAN          ;这四个为去抖动
        MOV     P0,#0FFH
        MOV     P2,#10111111B
        JB      P2.2,ADDM12
        SETB    03H      ;按键2是否有效
        SETB    09H      ;时钟加减标致位
        MOV     A,31H       ;分钟 +1
        CJNE    A,#59H,M21
        MOV     31H,#00H
        SJMP    ADDM12
    M21:ADD     A,#01
        DA      A
        MOV     31H,A
        SJMP    ADDM12
 ADDM12:SETB    P2.6
        RET
 ;-------------------------------------------------------------------
  ADDH1:MOV     P0,#0FFH      ;加一小时
        MOV     P2,#10111111B
        JNB     P2.3,ADDH11
        CLR     04H        ;按键3是否有效
 ADDH11:JB      04H,ADDH12
        JB      P2.3,ADDH12
        LCALL   MXIAN          ;这四个为去抖动
        MOV     P0,#0FFH
        MOV     P2,#10111111B
        JB      P2.3,ADDH12
        SETB    04H        ;按键3是否有效
        CLR     09H          ;时钟加减标致位
        MOV     A,30H       ; 小时 +1
        CJNE    A,#23H,H31
        MOV     30H,#00H
        SJMP    ADDH12
    H31:ADD     A,#01
        DA      A
        MOV     30H,A
 ADDH12:SETB    P2.6
        RET

 ;-------------------------------------------------------------------
  DECMH:MOV     P0,#0FFH      ;减一分钟/一小时
        MOV     P2,#10111111B
        JNB     P2.1,DECM11
        CLR     05H      ;按键1是否有效
 DECM11:JB      05H,DECM12
        JB      P2.1,DECM12
        LCALL   MXIAN          ;这四个为去抖动
        MOV     P0,#0FFH
        MOV     P2,#10111111B
        JB      P2.1,DECM12
        SETB    05H      ;按键1是否有效
        JNB     09H,DECMH3

⌨️ 快捷键说明

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