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

📄 10000clock.asm

📁 具有显示时分秒年月日和星期以及识别闰年得功能
💻 ASM
📖 第 1 页 / 共 5 页
字号:
          MOV R1,#08H
          MOV R0,#56H
S_LOOP:                            ;秒表清零
          MOV @R0,#0
          INC R0
          DJNZ R1,S_LOOP
          LCALL S_DISPLAY
          CLR TR2
          MOV TH2,#0DCH            ;定时10ms
          MOV TL2,#00H
          MOV RCAP2H,#0DCH         ;重装DC00
          MOV RCAP2L,#00H
          SETB EA
S_BEGIN:
          JB DOWN,S_KEY
          LJMP S_BEGIN
S_KEY:
          JNB ENTER,S_CONTINUE     ;按下确认键就保存退出设置
          CLR ENTER
          SETB EX0
          SETB EX1
          SETB TR2
          SETB TF1
          CLR S_WATCH
          LJMP CON4
S_CONTINUE:
          JB DOWN,S_KEYOVER            ;秒表暂停
          LCALL DELAY30MS
          JB DOWN,S_KEYOVER
          SETB TR2
S_KEYOVER:
          JB DOWN,S_KEY0
          LJMP S_KEYOVER

S_KEY0:                                ;秒表开
          JB UP,S_KEY0OVER
          LCALL DELAY30MS
          JB UP,S_KEY0OVER
          CLR TR2
S_KEY0OVER:
          JB UP,S_KEY1
          LJMP S_KEY0OVER

S_KEY1:                           ;秒表复零
          JB SW,S_KEY1OVER
          LCALL DELAY150MS
          JB SW,S_KEY1OVER
          MOV P0,#0CCH            ;写入显示起始地址(第2行第13个位置)
          LCALL ENABLE_LCD        ;调用写入命令子程序


          MOV P0,#00100000B       ;写入空值
          LCALL WR_DATA           ;调用LCD数据写入子程序

          MOV P0,#00100000B       ;写入空值
          LCALL WR_DATA           ;调用LCD数据写入子程序

          MOV P0,#00100000B       ;写入空值
          LCALL WR_DATA           ;调用LCD数据写入子程序

          MOV P0,#00100000B       ;写入空值
          LCALL WR_DATA           ;调用LCD数据写入子程序
          MOV P_COUNT,#0

          MOV P0,#0CCH            ;写入显示起始地址(第2行第13个位置)
          LCALL ENABLE_LCD        ;调用写入命令子程序
          LJMP STOPWATCH
S_KEY1OVER:
          JB SW,S_KEY2
          LJMP S_KEY1OVER

S_KEY2:                              ;秒表退出
          JB CONF,S_KEY2OVER
          LCALL DELAY150MS
          JB CONF,S_KEY2OVER
          SETB ENTER
          MOV D_COUNT,#0C8H
          MOV TL1,#0B0H              ;设置T1初值,定时50ms
          MOV TH1,#3CH
          ANL TMOD,#0FH
          ORL TMOD,#00010000B        ;16位定时器
          SETB ET1
          SETB TR1
S_KEY2OVER:
          LJMP S_KEY


C_STOP:
       SETB BEE                   ;关闹钟
       MOV C_COUNT,#64H
       LCALL C_END
       CLR LIG                    ;背光定时关
       MOV TL1,#0B0H              ;设置T1初值,定时50ms
       MOV TH1,#3CH
       ANL TMOD,#0FH
       ORL TMOD,#00010000B        ;16位定时器
       SETB ET1
       SETB TR1
       RET



INT0:
     MOV ByteCnt,#07H	;接收7字节
     MOV SlvAdr,#0A2H	;PCF8563日历时钟器件地址为A2H
     MOV SubAdr,#02H	;从日历时钟的02H单元开始
     LCALL ReceData     ;调用读EEPROM多字节读入过程,将信息读入接收缓冲区
     LCALL LCDBUF       ;把时间缓冲区的内容按十位与个位分开存放
     LCALL DISPLAY      ;把数据输出液晶显示
     CLR IE0
     RETI
     RETI
     RETI

INT1:
     CLR BEE                    ;开蜂鸣器
     MOV TL0,#0B0H              ;设置T0初值,定时50ms
     MOV TH0,#3CH
     ANL TMOD,#0F0H
     ORL TMOD,#00000001B        ;16位定时器
     SETB ET0
     SETB TR0
     CLR EX1                    ;关闭中断
     RETI
     RETI
     RETI

CTC0:
     JB C_5S,C_NEXT
     MOV TL0,#0B0H               ;手动重装,定时50ms
     MOV TH0,#3CH
     DJNZ C_COUNT,C_EXIT
     SETB C_5S
     MOV C_COUNT,#64H
     SETB BEE
     MOV TL0,#0E0H               ;定时20ms
     MOV TH0,#0B1H
     JB C_2S,C_END
     SJMP C_EXIT
C_NEXT:
     MOV TL0,#0E0H               ;定时20ms
     MOV TH0,#0B1H
     DJNZ C_COUNT,C_EXIT
     MOV C_COUNT,#64H
     SETB C_2S
     CLR C_5S
     CLR BEE
     MOV TL0,#0B0H               ;手动重装,定时50ms
     MOV TH0,#3CH
     SJMP C_EXIT
C_END:
     CLR C_2S
     CLR C_5S
     CLR TR0
     CLR ET0
     MOV XmtDat,#00000010B        ;清除闹钟中断标志
     MOV ByteCnt, #01H	          ;传送1字节
     MOV SlvAdr, #0A2H	          ;PCF8563日历时钟器件地址为A2H
     MOV SubAdr, #01H	          ;从日历时钟的01H单元开始
     LCALL SendData	          ;调用写EEPROM多字节写入过程,将发送缓冲区内的信息写入
                                  ;PCF8563日历芯片内日历时间单元
     SETB EX1                     ;开闹钟中断

C_EXIT:
     CLR TF0
     RETI
     RETI
     RETI


CTC1:
     MOV TL1,#0B0H               ;手动重装,定时50ms
     MOV TH1,#3CH
     DJNZ D_COUNT,D_EXIT
     MOV D_COUNT,#0C8H
     SETB LIG
     CLR TR1
     CLR ET1
D_EXIT:
     CLR TF1
     RETI
     RETI
     RETI

CTC2:
     PUSH PSW
     PUSH ACC
     JB S_WATCH,S_W
     SETB T40                         ;40ms时间到标志置1
     SJMP CTC2_OUT
S_W:                                  ;秒表计时程序
     INC S_MS0
     MOV A,S_MS0
     CJNE A,#10,S_NEXT
     MOV S_MS0,#00H
     INC S_MS1
     MOV A,S_MS1
     CJNE A,#5,PATTERN1
     LCALL PATTERN
PATTERN1:
     CJNE A,#10,S_NEXT
     MOV S_MS1,#00H

     LCALL PATTERN
     INC S_SEC0
     MOV A,S_SEC0
     CJNE A,#10,S_NEXT
     MOV S_SEC0,#00H
     INC S_SEC1
     MOV A,S_SEC1
     CJNE A,#6,S_NEXT
     MOV S_SEC1,#00H

     INC S_MIN0
     MOV A,S_MIN0
     CJNE A,#10,S_NEXT
     MOV S_MIN0,#00H
     INC S_MIN1
     MOV A,S_MIN1
     CJNE A,#6,S_NEXT
     MOV C_MIN1,#00H

     INC S_HOU0
     MOV A,S_HOU0
     CJNE A,#10,S_NEXT
     MOV S_HOU0,#00H
     INC S_HOU1
     MOV A,S_HOU1
     CJNE A,#10,S_NEXT
     MOV C_HOU1,#00H
S_NEXT:
     LCALL S_DISPLAY

CTC2_OUT:
     CLR TF2
     POP ACC
     POP PSW
     RETI
     RETI
     RETI

;键盘检测,检测有没有按键被按下
KEYCHK:
       MOV A,P1              ;读P1状态
       ANL A,#0F0H           ;屏蔽低4位
       CJNE A,#0F0H,NEXT1    ;高4位为1说明没有按键按下
       SETB C                ;C的作用是用来改写KEYSTU
       SJMP NEXT2
NEXT1:
       CLR C
NEXT2:
       MOV A,KEYSTU
       RLC A
       ANL A,#07H            ;保留按键状态
       MOV KEYSTU,A          ;保存按键状态
       ;判别按键状态,决定是否执行按键扫描,检查是否010态
       CJNE A,#2,NEXT3
       ;处于010态,视为干扰,作000态处理
       ANL KEYSTU,#0F8H      ;重置按键状态
       SJMP NEXT4
NEXT3:
       CJNE A,#4,NEXT4
       ;处于100态,说明按键已稳定闭合,可进行按键扫描
       LCALL KEYSCAN          ;执行键盘扫描,确定哪一按键被按下
NEXT4:
       ;---键盘检测结束-----------
       RET

;键盘扫描程序,检查哪个按键被按下,P1.7-P1.4键值分别为81H,82H,83H,84H
KEYSCAN:
        ANL KEYNAME,#10000000B  ;保留b7位
        MOV A,KEYNAME
        CJNE A,#0,RETURN        ;若b7位为1,表明原键值未处理,返回
        JB P1.7,KEYSCAN1        ;若P1.7为1扫描P1.6
        MOV KEYNAME,#1
        SJMP KEYSCAN_DOEN
KEYSCAN1:
        JB P1.6,KEYSCAN2        ;若P1.6为1扫描P1.5
        MOV KEYNAME,#2
        SJMP KEYSCAN_DOEN
KEYSCAN2:
        JB P1.5,KEYSCAN3        ;若P1.5为1就肯定是P1.4
        MOV KEYNAME,#3
        SJMP KEYSCAN_DOEN
KEYSCAN3:
        MOV KEYNAME,#4
KEYSCAN_DOEN:
        ORL KEYNAME,#80H        ;按键有效标志置1
RETURN:
        RET

LOADLCD:
     MOV P0,#00000001B       ;清屏并光标复位
     LCALL ENABLE_LCD        ;调用写入命令子程序
     MOV P0,#00111000B       ;设置显示模式,8位2行5X7点阵
     LCALL ENABLE_LCD        ;调用写入命令子程序
     MOV P0,#00001100B       ;显示器开、光标关、光标不允许闪烁
     LCALL ENABLE_LCD        ;调用写入命令子程序
     MOV P0,#00000110B       ;文字不动,光标自动右移
     LCALL ENABLE_LCD        ;调用写入命令子程序
     MOV P0,#80H             ;写入显示起始地址(第一行第一个位置)
     LCALL ENABLE_LCD        ;调用写入命令子程序

     MOV P0,#00110010B       ;写入2
     LCALL WR_DATA           ;调用LCD数据写入子程序

     MOV P0,#00110000B       ;写入0
     LCALL WR_DATA           ;调用LCD数据写入子程序

     MOV P0,#84H             ;写入显示起始地址(第一行第五个位置)
     LCALL ENABLE_LCD        ;调用写入命令子程序

     MOV P0,#00101111B       ;写入/
     LCALL WR_DATA           ;调用LCD数据写入子程序

     MOV P0,#87H             ;写入显示起始地址(第一行第八个位置)
     LCALL ENABLE_LCD        ;调用写入命令子程序

     MOV P0,#00101111B       ;写入/
     LCALL WR_DATA           ;调用LCD数据写入子程序

     MOV P0,#0C2H             ;写入显示起始地址(第二行第三个位置)
     LCALL ENABLE_LCD        ;调用写入命令子程序

     MOV P0,#00111010B       ;写入:
     LCALL WR_DATA           ;调用LCD数据写入子程序

     MOV P0,#0C5H             ;写入显示起始地址(第二行第六个位置)
     LCALL ENABLE_LCD        ;调用写入命令子程序

     MOV P0,#00111010B       ;写入:
     LCALL WR_DATA           ;调用LCD数据写入子程序
     ;输入SUNGT86


;显示字母SETTIME
DIS_TIME:
     MOV P0,#0C9H            ;写入显示起始地址(第二行第十个位置)
     LCALL ENABLE_LCD        ;调用写入命令子程序

     MOV P0,#01010011B       ;写入S
     LCALL WR_DATA           ;调用LCD数据写入子程序

     MOV P0,#01000101B       ;写入E
     LCALL WR_DATA           ;调用LCD数据写入子程序

     MOV P0,#01010100B       ;写入T
     LCALL WR_DATA           ;调用LCD数据写入子程序

     MOV P0,#01010100B       ;写入T
     LCALL WR_DATA           ;调用LCD数据写入子程序

     MOV P0,#01001001B       ;写入I
     LCALL WR_DATA           ;调用LCD数据写入子程序

     MOV P0,#01001101B       ;写入M
     LCALL WR_DATA           ;调用LCD数据写入子程序

     MOV P0,#01000101B       ;写入E
     LCALL WR_DATA           ;调用LCD数据写入子程序
RET

;在第一行显示ALARM
DIS_ALARM:
     MOV P0,#00000001B       ;清屏并光标复位
     LCALL ENABLE_LCD        ;调用写入命令子程序

     MOV P0,#0C2H            ;写入显示起始地址(第二行第三个位置)
     LCALL ENABLE_LCD        ;调用写入命令子程序

     MOV P0,#00111010B       ;写入:
     LCALL WR_DATA           ;调用LCD数据写入子程序

     MOV P0,#82H             ;写入显示起始地址(第一行第二个位置)
     LCALL ENABLE_LCD        ;调用写入命令子程序

     MOV P0,#01000001B       ;写入A
     LCALL WR_DATA           ;调用LCD数据写入子程序

     MOV P0,#01001100B       ;写入L
     LCALL WR_DATA           ;调用LCD数据写入子程序

     MOV P0,#01000001B       ;写入A
     LCALL WR_DATA           ;调用LCD数据写入子程序

     MOV P0,#01010010B       ;写入R
     LCALL WR_DATA           ;调用LCD数据写入子程序

     MOV P0,#01001101B       ;写入M
     LCALL WR_DATA           ;调用LCD数据写入子程序

     MOV P0,#00100000B       ;写入空值
     LCALL WR_DATA           ;调用LCD数据写入子程序

     MOV P0,#01001001B       ;写入I
     LCALL WR_DATA           ;调用LCD数据写入子程序

     MOV P0,#01010011B       ;写入S
     LCALL WR_DATA           ;调用LCD数据写入子程序

     MOV P0,#00100000B       ;写入空值
     LCALL WR_DATA           ;调用LCD数据写入子程序

     MOV P0,#01001111B       ;写入O
     LCALL WR_DATA           ;调用LCD数据写入子程序

     RET

;在第一行显示STOPWATCH

⌨️ 快捷键说明

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