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

📄 main.asm

📁 基于AT89C51+DS1302的定时控制系统程序!! 具体实现功能: DS1302读写配置、DS18B20数字式温度传感器的读写控制及1602LCD的控制
💻 ASM
📖 第 1 页 / 共 3 页
字号:
        JNZ NEXT5
        JMP FRIDAY
  NEXT5:MOV A,32H
        XRL A,#07H
        JNZ NEXT6
        JMP SATERDAY
  NEXT6:JMP SUNDAY
;*********************
 MONDAY:MOV DPTR,#MON
        CALL WRSTR
        ret
TUESDAY:MOV DPTR,#TUE
        CALL WRSTR
        ret
WEDNESDAY:MOV DPTR,#WED
        CALL WRSTR
        ret
THURSDAY:MOV DPTR,#THU
        CALL WRSTR
        ret
FRIDAY: MOV DPTR,#FRI
        CALL WRSTR
        ret
SATERDAY:MOV DPTR,#SAT
        CALL WRSTR
        ret
SUNDAY: MOV DPTR,#SUN
        CALL WRSTR
        ret
;++++++++++++++++++++++++++++++++++lcd tab1
MON:DB 'Mon'
    DB 0
TUE:DB 'Tue'
    DB 0
WED:DB 'Wed'
    DB 0
THU:DB 'Thu'
    DB 0
FRI:DB 'Fri'
    DB 0
SAT:DB 'Sat'
    DB 0
SUN:DB 'Sun'
    DB 0
line1:db '20*/*/*   #'
      db 0
line2:db ' *:*    %C'
      db 0
work_str1:
          db '(1) *:*--*:*'
          db 0
work_str2:
          db '(2) *:*--*:*'
          db 0
;******************************************;按键响应子程序
START_:
        MOV     IE,#88H                    ;开TIMER1,记录按键时间
        MOV     TH1,#00
        MOV     TL1,#00
        SETB    TR1
        CALL    KEY_SCANF
        MOV     P1,#0C3H
  GOON8:MOV     A,P3                       ;直到按键松开
        JNB     ACC.2,GOON8
        CLR     TR1
        CLR     EA

        MOV     A,LCD_STAT                ;状态判断sp=50,
        XRL     A,#0
        JZ      RE_SET
        MOV     A,LCD_STAT
        XRL     A,#1
        JZ      SET_TIME
        MOV     A,LCD_STAT
        XRL     A,#2
        JZ      SET_WORK

RE_SET:  ajmp   GET_KEYDATA1       ;CPU处于显示当前时间状态

SET_TIME:ajmp   GET_KEYDATA2       ;CPU处于修改当前时间状态

SET_WORK:ajmp   GET_KEYDATA3       ;CPU处于修改任务执行时间状态

;**********************************
GET_KEYDATA1:                            ;显示当前时间准确状态,SP=50

        MOV     A,KEY_DATA               ;键值判断
        XRL     A,#1
        JZ      KEY_MODE
        MOV     A,KEY_DATA
        XRL     A,#6                     ;手动控制继电器开关
        JNZ     EXIT8
        CPL     P3.4
  EXIT8:MOV     IE,#83H                  ;设置中断,返回主循环LOP(SP=50)
        SETB    TR0
        JMP     LOP

KEY_MODE:                                ;SP=50,EA=1,EX0=0,ET0=0,ET1=1,TR0=0.TR1=0

        MOV     A,TIME1_CN               ;按键模式判断
        clr     c
        CJNE    A,#5,goon9               ;timer_counter>5 to long_press

  goon9:JC      duan_press
        jmp     long_press
;******************************
duan_press:                              ;短按,修改任务执行时间,sp=50
                                         ;SP=50,EA=1,EX0=0,ET0=0,ET1=1,TR0=0.TR1=0
           MOV     LCD_STAT,#2           ;修改状态值

           MOV     A,#LCD_SETDDADDR         ;lcd_ac=0
           CALL    WRCMD

           MOV     DPTR,#work_str1          ;写第一行数据到LCD_
           MOV     R1,#S1_HOUR_DATA
           CALL    WRSTR

           MOV     A,#LCD_SETDDADDR+64      ;换行
           CALL    WRCMD

           MOV     DPTR,#work_str2          ;写第二行数据到LCD
           MOV     R1,#S2_HOUR_DATA
           CALL    WRSTR

           MOV     A,#LCD_SETDDADDR+4       ;AC=02H
           CALL    WRCMD

           JMP     STAT1;GO-TO STAT1
           ;$$$$$$$$$$$$$$$$$$$$$$$$$
long_press:
           MOV     LCD_STAT,#1

           MOV     A,#LCD_SETDDADDR+2         ;光标AC=01H
           CALL    WRCMD

           JMP     STAT1
;############################################STAT1
STAT1:
           mov     A,#LCD_SETVISIBLE+5        ;显示BLACK
	   call    wrcmd

           MOV     TIME1_CN,#0                ;清T1定时寄存器值
           MOV     IE,#89H                    ;重设中断,启动TIMER1
           SETB    TR1

        TK:MOV     A,TIME1_CN                 ;5S无键中断响应退出到主屏LOP
           CLR     C
           CJNE    A,#30,KT
        KT:JC      TK                         ;时间到,

  GO_START:CLR     TR1
           MOV     TIME0_CN,#1
           MOV     TIME1_CN,#0
           MOV     LCD_STAT,#0

           MOV     IE,#83H
           SETB    TR0
           AJMP    LOP

;************************************
GET_KEYDATA2:
           clr     ea
           CLR     TR1                      ;SP=50,IE=09,TR0=0,TR1=0
           MOV     TIME1_CN,#0

           MOV     A,KEY_DATA               ;键值判断
           XRL     A,#2
           JZ      MOVE_LIFT
           MOV     A,KEY_DATA
           XRL     A,#3
           JZ      MOVE_RIGHT
           MOV     A,KEY_DATA
           XRL     A,#4
           JZ      INC_1
           MOV     A,KEY_DATA
           XRL     A,#5
           JZ      DEC_1
           MOV     A,KEY_DATA
           XRL     A,#6
           JZ      ENTER
           jmp     back2
;+++++++++++++++++++++++++++++++++++++++++
MOVE_LIFT: CALL    MOVE_L
           JMP     BACK2
MOVE_RIGHT:CALL    MOVE_R
           JMP     BACK2
INC_1:     CALL    INC_
           JMP     BACK2
DEC_1:     CALL    DEC_
           JMP     BACK2
ENTER:     CALL    IS_OK
           JMP     BACK2
BACK2:     MOV     IE,#89H                 ;SP=50
           SETB    TR1
           JMP     STAT1
;+++++++++++++++++++++++++++++++++++++++++光标左移到指定位置子程序
    MOVE_L:mov     dptr,#LCD_BUSY_RD       ;SP=52,IE=09,TR0=0,TR1=0
	   movx    A,@dptr                 ;读LCD的AC值
           JB      ACC.7,MOVE_L            ;忙则重新读一次
           MOV     AC_ADD,A                ;保存AC值

           XRL     A,#02H                  ;LCD光标位置判断
           JZ      TO_45
           MOV     A,AC_ADD
           XRL     A,#03H
           JZ      TO_2
           MOV     A,AC_ADD
           XRL     A,#05H
           JZ      TO_3
           MOV     A,AC_ADD
           XRL     A,#06H
           JZ      TO_5
           MOV     A,AC_ADD
           XRL     A,#08H
           JZ      TO_6
           MOV     A,AC_ADD
           XRL     A,#09H
           JZ      TO_8
           MOV     A,AC_ADD
           XRL     A,#0DH
           JZ      TO_9
           MOV     A,AC_ADD
           XRL     A,#41H
           JZ      TO_13
           MOV     A,AC_ADD
           XRL     A,#42H
           JZ      TO_41
           MOV     A,AC_ADD
           XRL     A,#44H
           JZ      TO_42
           MOV     A,AC_ADD
           XRL     A,#45H
           JZ      TO_44
TO_45:
           MOV  A,#LCD_SETDDADDR+45H
           CALL WRCMD
           RET                              ;返回,BACK2
TO_2:
           MOV  A,#LCD_SETDDADDR+2
           CALL WRCMD
           RET
TO_3:
           MOV  A,#LCD_SETDDADDR+3
           CALL WRCMD
           RET
TO_5:
           MOV  A,#LCD_SETDDADDR+5
           CALL WRCMD
           RET
TO_6:
           MOV  A,#LCD_SETDDADDR+6
           CALL WRCMD
           RET
TO_8:
           MOV  A,#LCD_SETDDADDR+8
           CALL WRCMD
           RET
TO_9:
           MOV  A,#LCD_SETDDADDR+9
           CALL WRCMD
           RET
TO_13:
           MOV  A,#LCD_SETDDADDR+13
           CALL WRCMD
           RET
TO_41:
           MOV  A,#LCD_SETDDADDR+41H
           CALL WRCMD
           RET
TO_42:
           MOV  A,#LCD_SETDDADDR+42H
           CALL WRCMD
           RET
TO_44:
           MOV  A,#LCD_SETDDADDR+44H
           CALL WRCMD
           RET
;MOVE TO RIGHT
MOVE_R:
           mov     dptr,#LCD_BUSY_RD
	   movx    A,@dptr
           JB      ACC.7,MOVE_R
           MOV     AC_ADD,A

           XRL     A,#02H
           JZ      TO_3
           MOV     A,AC_ADD
           XRL     A,#03H
           JZ      TO_5
           MOV     A,AC_ADD
           XRL     A,#05H
           JZ      TO_6
           MOV     A,AC_ADD
           XRL     A,#06H
           JZ      TO_8
           MOV     A,AC_ADD
           XRL     A,#08H
           JZ      TO_9
           MOV     A,AC_ADD
           XRL     A,#09H
           JZ      TO_13
           MOV     A,AC_ADD
           XRL     A,#0DH
           JZ      TO_41
           MOV     A,AC_ADD
           XRL     A,#41H
           JZ      TO_42
           MOV     A,AC_ADD
           XRL     A,#42H
           JZ      TO_44
           MOV     A,AC_ADD
           XRL     A,#44H
           JZ      TO_45
           MOV     A,AC_ADD
           XRL     A,#45H
           JZ      TO_2

INC_:
           mov  dptr,#lcd_busy_rd            ;;SP=52,IE=09,TR0=0,TR1=0
           movx  a,@dptr
           jb  acc.7,inc_
           setb acc.7                        ;保存当前光标位置值
           mov  AC_ADD,a
           XRL  A,#8DH                       ;判断光标是否指到显示星期位置
           JZ   CHANGE_WEEK
           MOV  DPTR,#LCD_DATA_RD            ;读光标所在处显示值
           MOVX A,@DPTR
           mov  AC_DATA,a
           MOV  A,AC_ADD
           call wrcmd                        ;光标归位
           mov a,AC_DATA
           CLR  C
           SUBB A,#48
           MOV  DPTR,#NO_STR1
           MOVC A,@A+DPTR

           ADD  A,#48
           MOV  DPTR,#LCD_DATA_WR
           MOVX @DPTR,A
           mov  a,ac_adD
           call wrcmd

           RET                              ;返回BACK2
CHANGE_WEEK:                                ;SP=52
           MOV  A,WEEK
           XRL  A,#07H
           JNZ  JMPK
           MOV  WEEK,#00H
JMPK:      MOV  A,WEEK
           INC  A
           MOV  WEEK,A
           MOV  A,#LCD_SETVISIBLE+4
           CALL WRCMD
           CALL WEEK0

           MOV  A,AC_ADD
           CALL WRCMD
           MOV  A,#LCD_SETVISIBLE+5
           CALL WRCMD
           RET
DEC_:
           mov  dptr,#lcd_busy_rd
           movx  a,@dptr
           clr  acc.7
           add  a,#80h
           mov  ac_adD,a
           XRL  A,#8dH
           JZ   CHANGE_WEEK
           MOV  DPTR,#LCD_DATA_RD
           MOVX A,@DPTR
           mov  45h,a
           mov  a,ac_adD
           call wrcmd
           mov a,45h
           CLR  C
           SUBB A,#48
           MOV  DPTR,#NO_STR2
           MOVC A,@A+DPTR

           ADD  A,#48
           MOV  DPTR,#LCD_DATA_WR
           MOVX @DPTR,A
           mov  a,ac_adD
           call wrcmd

           RET
NO_STR1:
        DB 1,2,3,4,5,6,7,8,9,0
NO_STR2:
        DB 9,0,1,2,3,4,5,6,7,8
IS_OK:
           POP  ACC
           POP  ACC
           MOV  A,#LCD_SETDDADDR
           CALL WRCMD

           MOV  A,#LCD_SETVISIBLE+4
           CALL WRCMD

           CALL READ_LCD_DATA
           CALL WR_DATA_DS1302

           POP    ACC
           POP    ACC
           JMP    GO_START
READ_LCD_DATA:
           MOV    R1,#YEAR
           MOV    R2,#2
           CALL   GET_DATA
           MOV    @R1,A

           INC    R1
           MOV    R2,#5
           CALL   GET_DATA
           CLR    C
           CJNE   A,#13H,MONTH_RIGHT
MONTH_RIGHT:JNC   UESLESS_DATE
           MOV    @R1,A

           INC    R1
           MOV    R2,#8
           CALL   GET_DATA
           CLR    C
           CJNE   A,#32H,DATE_RIGHT
DATE_RIGHT:JNC    UESLESS_DATE
           MOV    @R1,A

           INC    R1
           MOV    R2,#41H
           CALL   GET_DATA
           CLR    C
           CJNE   A,#24H,HOUR_RIGHT
HOUR_RIGHT:JNC   UESLESS_DATE
           MOV    @R1,A

           INC    R1
           MOV    R2,#44H
           CALL   GET_DATA
           CLR    C
           CJNE   A,#60H,MINU_RIGHT
MINU_RIGHT:JNC   UESLESS_DATE
           MOV    @R1,A
           RET
UESLESS_DATE:
           POP  ACC
           POP  ACC
           CLR  UESLESS_BIT
           JMP  UESLESS_DISPLAY

WR_DATA_DS1302:

         MOV    R5,#8CH
         MOV    R1,#YEAR
         CALL   WR_DATA_DS

         MOV    R5,#8AH
         MOV    R1,#WEEK
         CALL   WR_DATA_DS

         MOV    R5,#88H
         MOV    R1,#MONTH
         CALL   WR_DATA_DS

         MOV    R5,#86H
         MOV    R1,#DATE
         CALL   WR_DATA_DS

         MOV    R5,#84H
         MOV    R1,#HOUR
         CALL   WR_DATA_DS

         MOV    R5,#82H
         MOV    R1,#MINU
         CALL   WR_DATA_DS

         CLR    RST
         RET

WR_DATA_DS:
         CLR    RST

⌨️ 快捷键说明

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