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

📄 calendar.asm

📁 这个是基于单片机的,万年历的设计.可以计算出闰年.还可以整点报时,响6秒,自动停止.并且可以手动调整时间
💻 ASM
字号:
DATA_IN  DATA  0020H
DATA_OUT DATA  0021H
WEISHU  DATA   0022H
WEISHU2 DATA   0029H
SHI     DATA   0023H
FEN     DATA   0024H
MIAO    DATA   0025H
YEAR    DATA   0026H
MONTH   DATA   0027H
DAY     DATA   0028H
KEY      BIT P3.3    ;7279的KEY按键输出
DAT      BIT P1.1    ;7279的DATA串行数据引脚
CLK      BIT P1.0    ;7279的CLK同步时钟引脚
CS       BIT P2.6    ;7279的CS片选输入端

;*************************************
;************  主程序   **************
;*************************************
         ORG   0000H
         LJMP  START
         ORG   000BH
         LJMP  INT
         ORG   0013H
         LJMP  INT1
         ORG   0100H

START:   MOV SP,#2FH
         SETB CS
         SETB KEY
         CLR CLK
         CLR DAT    ;初始化I/O口
         CALL DELAY25  ;延时25mS
         MOV R3,#20
         SETB EA
         SETB ET0
         SETB EX1
         SETB PX1
         MOV TMOD,#01H
         MOV TH0,#03CH
         MOV TL0,#0B0H
         SETB TR0     ;中断初始化
         MOV  DATA_OUT,#0A4H
         CALL SEND   ;发复位(清除)指令
;-----------------------------------------
         MOV MIAO,#00H  ;存放秒数字
         MOV FEN,#00H  ;存放分数字
         MOV SHI,#00H  ;存放时数字
         MOV DAY,#01H
         MOV MONTH,#01H
         MOV YEAR,#00H
         MOV WEISHU,#03H
         MOV WEISHU2,#03H
         SETB P1.7          ;判断是否闪烁
         SETB P1.5
         SETB P1.6
         MOV R6,#11111100B  ;存放要闪烁的位数,要左移
         MOV R4,#11111100B
;----------------------------------------
;   第三个和第六个数码管位一横并闪烁
;           扫描显示时钟
;----------------------------------------
SHIZHONG:MOV  DATA_OUT,#88H
         CALL SEND
         MOV  DATA_OUT,#11011011B
         CALL SEND
    CFSM:MOV  DATA_OUT,#95H
         CALL SEND
         MOV  DATA_OUT,#01H
         CALL SEND

;--------------------------------
         MOV  DATA_OUT,#92H
         CALL SEND
         MOV  DATA_OUT,#01H
         CALL SEND
;--------------------------------
         MOV R5,#87H
         MOV A,SHI        ;显示时分秒
     XS: MOV B,#10
         DIV AB
         MOV DATA_OUT,R5
         CALL SEND
         MOV DATA_OUT,A
         CALL SEND
         DEC R5
         MOV DATA_OUT,R5
         CALL SEND
         DEC R5
         MOV DATA_OUT,B
         CALL SEND
         CJNE R5,#85H,LOP1
         MOV A,FEN
         DEC R5
         SJMP XS
    LOP1:CJNE R5,#82H,LOP2
         MOV A,MIAO
         DEC R5
         SJMP XS
   LOP2:JNB P1.6,RIQI    ;P1.0=0扫描显示日期
         JB P1.7,SHIZHONG
         SJMP CFSM
    DDD0:SJMP SHIZHONG
;----------------------------
;      扫描显示日期
;----------------------------
    RIQI:MOV  DATA_OUT,#88H
         CALL SEND
         MOV  DATA_OUT,#11011011B
         CALL SEND
   CFSM2:MOV  DATA_OUT,#95H
         CALL SEND
         MOV  DATA_OUT,#01H
        CALL SEND
;---;-----------------------------
         MOV  DATA_OUT,#92H
         CALL SEND
         MOV  DATA_OUT,#01H
         CALL SEND
         MOV R5,#87H
         MOV A,YEAR        ;显示年月日
     XS2: MOV B,#10
         DIV AB
         MOV DATA_OUT,R5
         CALL SEND
         MOV DATA_OUT,A
         CALL SEND
         DEC R5
         MOV DATA_OUT,R5
         CALL SEND
         DEC R5
         MOV DATA_OUT,B
         CALL SEND
         CJNE R5,#85H,LOP21
         MOV A,MONTH
         DEC R5
         SJMP XS2
    LOP21:CJNE R5,#82H,LOP22
         MOV A,DAY
         DEC R5
         SJMP XS2
   LOP22:JB P1.6,DDD0;若P1.6=1,扫描时钟显示
         JB P1.5,RIQI
         SJMP CFSM2

;***********************************
;******  定时T0中断服务程序    *****
;***********************************
  INT:   PUSH A
         DJNZ R3,OUT
         MOV R3,#20
         INC MIAO
         MOV A,MIAO           ;秒+1
         CJNE A,#60,OUT   ;如果还没到60秒,返回
         MOV MIAO,#00H
         INC FEN
         MOV A,FEN            ;到60秒。秒就清零,分+1
         CJNE A,#60,OUT   ;如果还没到60分,返回
         MOV FEN,#00H
         INC SHI
         MOV A,SHI        ;到60分。分就清零,时+1
         CJNE A,#24,OUT   ;如果还没到24时,返回
         MOV SHI,#00H     ;到24时。时就清零
     ;----------------------------------------
         INC DAY
         MOV A,YEAR       ;判断是否为闰年
         MOV B,#4
         DIV AB
         MOV A,B
         CJNE A,#0,OUT11       ;是否被四整除?,不整除则跳转
         MOV DPTR,#TABLE1
   RRT:  MOV A,MONTH
         MOVC A,@A+DPTR
         INC A
         CJNE A,DAY,OUT
         MOV DAY,#01H
         INC MONTH
         MOV A,MONTH
         CJNE A,#13,OUT
         MOV MONTH,#01H
         INC YEAR
         MOV A,YEAR
         CJNE A,#100,OUT
         MOV YEAR,#00H
         JMP OUT
   OUT11:MOV DPTR,#TABLE2
         SJMP RRT
     OUT:POP A
         MOV TH0,#03CH
         MOV TL0,#0B0H
         RETI

;*************************************
;***********   按键中断程序  *********
;*************************************
  INT1:  PUSH A
         CALL DELAY25
         JB P3.3,OUT2
         MOV  DATA_OUT,#15H  ;读键值指令
         CALL SEND
         CALL RECEIVE
         SETB CS
         MOV A,DATA_IN       ;键值放在A里面

;-------------------------------
;        在时钟界面下操作
;-------------------------------
;----------S0按下----------
     S0: CJNE A,#00H,S1
         JNB P1.6,S80C
         JB P1.7,S00      ;P1.7=1 :不闪烁,要进入闪烁状态
         CPL P1.7         ;P1.7=0 :已经闪烁,要关掉。
         JMP OUT2
     S00:CPL P1.7
         MOV R0,WEISHU
         CJNE R0,#00H,S01   ;时闪烁,R0=00H-- 分闪烁,R0=01H---秒闪烁,R0=02H
         MOV WEISHU,#03H    ;已经闪烁完,则重新再来
         MOV R6,#11111100B
     S01:MOV DATA_OUT,#88H  ;要闪烁的位数
         CALL SEND
         MOV DATA_OUT,R6
         CALL SEND
         MOV R0,A
         MOV A,R6
         RL A
         RL A
         RL A
         MOV R6,A
         MOV A,R0
         DEC WEISHU
         SJMP OUT2
;---------S1按下 加1  ----------
      S1:CJNE A,#01H,S2
         JNB P1.6,S81C
         JNB P1.7,S10   ;P1.7=0闪烁,才进行加1操作
         SJMP OUT2        ;否则退出
     S10:MOV R1,WEISHU
         CJNE R1,#00H,S11 ;如果 时闪烁,R0=00H
         INC SHI
         MOV R0,SHI
         CJNE R0,#24,OUT2  ;若SHI从23加到24,则SHI=00
         MOV SHI,#00H
         SJMP OUT2
     S11:CJNE R1,#01H,S12  ;如果 分闪烁,R0=01H
         INC FEN
         MOV R0,FEN
         CJNE R0,#60,OUT2  ;若FEN从59加到60,则FEN=00
         MOV FEN,#00H
         JMP OUT2
     S12:INC MIAO          ;如果 秒闪烁,R0=02H
         MOV R0,MIAO
         CJNE R0,#60,OUT2  ;若MIAO从59加到60,则MIAO=00
         MOV MIAO,#00H
         JMP OUT2
;---------跳出中断中转-------
    S0C:SJMP S0
    OUT2:SJMP OUT21
    S80C:SJMP S80

;---------S2按下 减1 ----------
      S2:CJNE A,#02H,S8
         JNB P1.6,S82C
         JNB P1.7,S20    ;P1.7=0有闪烁,才进入减1操作
         SJMP OUT2         ;无闪烁才退出
     S20:MOV R1,WEISHU
         CJNE R1,#00H,S21  ;如果 时闪烁,R0=00H
         DEC SHI
         MOV R0,SHI
         CJNE R0,#0FFH,OUT2 ;若SHI从00到FF,则SHI=23
         MOV SHI,#23
         SJMP OUT2
     S21:CJNE R1,#01H,S22  ;如果 分闪烁,R0=01H
         DEC FEN
         MOV R0,FEN
         CJNE R0,#0FFH,OUT2  ;若FEN从00到FF,则FEN=59
         MOV FEN,#59
         SJMP OUT2
     S22:DEC MIAO          ;如果 秒闪烁,R0=02H
         MOV R0,MIAO
         CJNE R0,#0FFH,OUT2 ;若MIAO从00到FF,则MIAO=59
         MOV MIAO,#59
         SJMP OUT2
;--------------------------------------
;       在日期界面下操作
;

⌨️ 快捷键说明

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