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

📄 yaokongrili.asm

📁 该遥控日历具有遥控器调整日历
💻 ASM
📖 第 1 页 / 共 5 页
字号:
           mov    r0,#32h
         tsr2:
           jnb    date_line,tsr3   ;等待DS18B20回应
          djnz    r0,tsr2
           jmp    tsr4             ; 延时
         tsr3:
          setb    f1           ; 置标志位,表示DS1820存在
           jmp    tsr5
         tsr4:
           clr    f1          ; 清标志位,表示DS1820不存在
           jmp    tsr7
         tsr5:
           mov    r0,#06bh
         tsr6:
          djnz    r0,$            ; 时序要求延时一段时间
         tsr7:
          setb    date_line
           ret
             ;WRITE DS18B20                             2007-05-28>>MON
         DSWR:
           mov    r2,#8            ;一共8位数据
           CLR    C
          wr1:
           clr    date_line        ;开始写入DS18B20总线要处于复位(低)状态
           mov    r3,#07
          djnz    r3,$            ;总线复位保持16微妙以上
           rrc    a                ;把一个字节DATA 分成8个BIT环移给C
           mov    date_line,c      ;写入一个BIT
           mov    r3,#3CH
          djnz    r3,$            ;等待100微妙
          setb    date_line       ;重新释放总线
           nop
          djnz    r2,wr1          ;写入下一个BIT
          setb    date_line
           ret
             ;READ DS18B20
         DSRE:
           mov    r4,#2         ; 将温度低位、高位、TH、TL从DS18B20中读出
           mov    r1,#TEMPL        ; 存入25H、26H、27H、28H
         re00:
           mov    r2,#8
         re01:
           clr    cy
          setb    date_line
           nop
           nop
           clr    date_line        ;读前总线保持为低
           nop
           nop
           nop
          setb    date_line       ;开始读总线释放
           mov    r3,#09           ;延时18微妙
          djnz    r3,$
           mov    c,date_line      ;从DS18B20总线读得一个BIT
           mov    r3,#3CH
          djnz    r3,$            ;等待100微妙
           rrc    a                ;把读得的位值环移给A
          djnz    r2,re01         ;读下一个BIT
           mov    @r1,a
           inc    r1
          djnz    r4,re00
         LCALL    TRAN       ;温度转换子程序
           RET

         TRAN:
           mov    A,TEMPH
           ANL    A,#0F0H
          CJNE    A,#0F0H,ZDATA   ;判断温度是零上还是零下
           MOV    A,TEMPH           ;高位取反
           CPL    A
           MOV    TEMPH,A
           MOV    A,TEMPL           ;低位取反加1
           CPL    A
           ADD    A,#1
           MOV    TEMPL,A
          lJMP    ZFDATA
        ZDATA:
           MOV    A,TEMPL           ;零上温度处理程序
           ANL    A,#0F0H
           MOV    TEMP_BUF,A
           MOV    A,TEMPH            ;30H 存放温度低位数据,31H 存放温度高位数据
           ANL    A,#07H
           ORL    A,TEMP_BUF
          SWAP    A
           MOV    B,#10
           DIV    AB
           MOV    TEMP_UNIT,B ;
          CJNE    A,#10,TEMP_TH     ;判断温度是否大于100摄氏度
      TEMP_TH:
           JNC    TEMP_TH_RE
           MOV    TEMP_TEN,A        ;温度小于100摄氏度,正常显示
          AJMP    OVER
   TEMP_TH_RE:
           MOV    TEMP_TEN,#9       ;温度大于100摄氏度,显示99.9'C
           MOV    TEMP_UNIT,#9
           MOV    TEMP_DEC,#9
          AJMP    TEMP_OUT

         OVER:               ;小数点后两位处理程序
           MOV    DPTR,#TABB
           MOV    A,TEMPL
           ANL    A,#0FH
          MOVC    A,@A+DPTR
           MOV    TEMP_DEC,A
     TEMP_OUT:
           MOV    A,TEMP_TEN         ;消隐,温度十位0
          CJNE    A,#00H,TEMP_OUT1
           MOV    TEMP_TEN,#0AH
    TEMP_OUT1:
           RET
       ZFDATA:
           MOV    A,TEMPL           ;零下温度处理程序
           ANL    A,#0F0H
           MOV    TEMP_BUF,A
           MOV    A,TEMPH            ;
           ANL    A,#07H
           ORL    A,TEMP_BUF
          SWAP    A
           MOV    B,#10
           DIV    AB
          CJNE    A,#1,TEMP_TL       ;判断温度是否低于零下10摄氏度
      TEMP_TL:
           JNC    TEMP_TL_RE
           MOV    TEMP_TEN,#0BH      ;温度高于零下10摄氏度,显示正常温度
           MOV    A,B
           MOV    TEMP_UNIT,A
          AJMP    TEMP_TL_ON
   TEMP_TL_RE:
           MOV    TEMP_TEN,#0BH      ;温度低于零下10摄氏度,显示-9.9'C
           MOV    TEMP_UNIT,#09H
           MOV    TEMP_DEC,#09H
          AJMP    TEMP_OUT
   TEMP_TL_ON:
          LJMP    OVER
         TABB:    DB        0,  0,  1,  1,  2,  3,  3,  4,  5
                  ;小数位数 0   1   2   3   4   5   6   7   8
                  DB        5,  6,  6,  7,  8,  8,  9,
                  ;         9   A   B   C   D   E   F


;=================================================
; 遥控器IR 译码子程序
;中断服务程序
;=================================================
          INT:
           CLR    EA         ;暂时关闭CPU的所有中断请求
          PUSH    ACC
          PUSH    PSW
          SETB    PSW.4     ;选择工作寄存器组2
           CLR    PSW.3

           MOV    R0,#IRCOM
           MOV    R1,#04H
           I1:
           JNB    IRIN,I2       ;等待 IR 信号出现
          DJNZ    R1,I1
           JMP    IR_OUT
           I2:
           MOV    R4,#20
          I20:
          CALL    DEL
          DJNZ    R4,I20
            JB    IRIN,I1        ;确认IR信号出现
          I21:
            JB    IRIN,I3        ;等 IR 变为高电平
          CALL    DEL
           JMP    I21
           I3:
           MOV    R3,#0         ;8位数清为0
           LL:
           JNB    IRIN,I4       ;等 IR 变为低电平
          CALL    DEL
           JMP    LL
           I4:
            JB    IRIN,I5        ;等 IR 变为高电平
          CALL    DEL
           JMP    I4
           I5:
           MOV    R2,#0         ;0.14ms 计数
           L1:
          CALL    DEL
            JB    IRIN, N1       ;等 IR 变为高电平
                             ;IR=0,检查R2中的计数值
           MOV    A,#8          ;
           CLR    C
          SUBB    A,R2         ;判断高低位
                             ;IF C=0  BIT=0
           MOV    A,@R0
           RRC    A
           MOV    @R0,A         ;处理完一位
           INC    R3
          CJNE    R3,#8,LL     ;需处理完8位
           MOV    R3,#0
           INC    R0
          CJNE    R0,#2CH,LL   ;收集到4字节了
           JMP    IR_SHOW
           N1:
           INC    R2
          CJNE    R2,#30,L1    ;0.14ms 计数过长则时间到自动离开
       IR_OUT:
           CLR    PSW.4
           POP    PSW
           POP    ACC
          SETB    EA
          RETI
      IR_SHOW:
           CLR    PSW.4
           MOV    A,2AH
           CPL    A                ;将22H取反后和23H比较
          CJNE    A,2BH,IR_SHOW1  ;如果不等表示接收数据发生错误,放弃。
          CALL    DO
     IR_SHOW1:
           JMP    IR_OUT

; ***************************
; * 遥控器按键处理程序          *
; ***************************
           DO:
            JB    CHOICE_ADJ,DO_EXIT   ;
           MOV    A,2AH                ;开启,关闭整机
          CJNE    A,#16H,DO_A_0
           CPL    TURNOFF
            JB    TURNOFF,GOGO
         LCALL    ON_DISPLAY
          SETB    LED2
          AJMP    GOGO1
         GOGO:
           CLR    LED2
        GOGO1:
           RET
       DO_A_0:


          CJNE    A,#10H,DO_0            ;关闭/开启秒钟闪烁功能
           CPL    CLOSE_DIS

           JNB    CLOSE_DIS,TUON_LED
          SETB    TR0
          SETB    ET0

          AJMP    DO_OFLED
     TUON_LED:
           CLR    TR0
           CLR    ET0
           CLR    LED1

     DO_OFLED:
           RET
      DO_EXIT:


           CLR    HOURFLASH
           CLR    DAYFLASH
           CLR    MONTHFLASH
           CLR    YEARFLASH
           CLR    YEARBIT
           CLR    MONTHBIT
           CLR    DAYBIT
           CLR    HOURBIT
           CLR    MINUTEBIT
           CLR    ET1
           CLR    TR1
          RETI


         DO_0:
          CJNE    A,#0FFH,DO_1         ;遥控进入调整状态
           CPL    CON_ADJ
           JNB    CON_ADJ,CLOSE_CON
           MOV    DS1302_ADDR,#8EH
           MOV    DS1302_DATA,#00H      ;允许写1302
         LCALL    WRITE

          SETB    ET1                   ;打开定时器0中断入口
          SETB    TR1                   ;打开定时器0
          AJMP    CON_ADJ_OUT
    CLOSE_CON:
           ;MOV    DS1302_ADDR,#80H
           ;MOV    DS1302_DATA,#00H      ;1302开始振荡
         ;LCALL    WRITE
           MOV    DS1302_ADDR,#8EH
           MOV    DS1302_DATA,#80H      ;禁止写1302
         LCALL    WRITE


          AJMP    DO_EXIT

  CON_ADJ_OUT:
           RET
         DO_1:
           JNB    CON_ADJ,DO_EXIT


          CJNE    A,#12H,SHUNXU

           MOV    DS1302_ADDR,#80H
           MOV    DS1302_DATA,#00H      ;1302开始振荡
         LCALL    WRITE
           RET
;-------------------------------------------------
       SHUNXU:
          CJNE    A,#1BH,DO_2
           JNB    YEARBIT,SHUNXU_1     ;顺序闪烁调整
           JNB    MONTHBIT,SHUNXU_2
           JNB    DAYBIT,SHUNXU_3
           JNB    HOURBIT,SHUNXU_4
          AJMP    SHUNXU_5
     SHUNXU_1:
          SETB    YEARBIT     ;顺序月闪烁
          SETB    YEARFLASH
           CLR    MONTHBIT
           RET
     SHUNXU_2:
          SETB    MONTHBIT    ;顺序日闪烁
          SETB    MONTHFLASH
           CLR    DAYBIT
           RET
     SHUNXU_3:
          SETB    DAYBIT      ;顺序时闪烁
          SETB    DAYFLASH
           CLR    HOURBIT
           RET
     SHUNXU_4:
          SETB    HOURBIT
          SETB    HOURFLASH   ;顺序分闪烁
           CLR    MINUTEBIT
           RET
     SHUNXU_5:
           RET
;-------------------------------------------------
         DO_2:
          CJNE    A,#1FH,DO_3       ;逆序闪烁调整
           JNB    YEARBIT,NIXU_1
           JNB    MONTHBIT,NIXU_2
           JNB    DAYBIT,NIXU_3
           JNB    HOURBIT,NIXU_4
          AJMP    NIXU_5
       NIXU_1:
           CLR    YEARFLASH   ;逆序年闪烁

           RET
       NIXU_2:
           CLR    YEARBIT     ;逆序年闪烁
           CLR    YEARFLASH
           RET
       NIXU_3:
           CLR    MONTHBIT    ;逆序月闪烁
           CLR    MONTHFLASH
           RET
       NIXU_4:
           CLR    DAYBIT      ;逆序日闪烁
           CLR    DAYFLASH
           RET
       NIXU_5:
           CLR    HOURBIT      ;逆序时闪烁
           CLR    HOURFLASH
           RET



;-------------------------------------------------
         DO_3:
          CJNE    A,#1AH,DO_4              ;加法调整程序
           JNB    YEARBIT,CON_ADD_YEAR
           JNB    MONTHBIT,CON_ADD_MONTH
           JNB    DAYBIT,CON_ADD_DAY
           JNB    HOURBIT,CON_ADD_HOUR
           JNB    MINUTEBIT,CON_ADD_MINU
;-------------------------------------------------
         DO_4:
          CJNE    A,#1EH,DO_OUT              ;减法调整程序
           JNB    YEARBIT,CON_DEC_YEAR
           JNB    MONTHBIT,CON_DEC_MONTH
           JNB    DAYBIT,CON_DEC_DAY
           JNB    HOURBIT,CON_DEC_HOUR
           JNB    MINUTEBIT,CON_DEC_MINU
           RET
       DO_OUT:
           RET
;-------------------------------------------------
 CON_ADD_YEAR:
          AJMP    ADD_YEAR
CON_ADD_MONTH:
          AJMP    ADD_MONTH
  CON_ADD_DAY:
          AJMP    ADD_DAY
 CON_ADD_HOUR:
          AJMP    ADD_HOUR
 CON_ADD_MINU:
          AJMP    ADD_MINU
;-------------------------------------------------
 CON_DEC_YEAR:
          AJMP    DEC_YEAR
CON_DEC_MONTH:
          AJMP    DEC_MONTH
  CON_DEC_DAY:
          AJMP    DEC_DAY
 CON_DEC_HOUR:
          AJMP    DEC_HOUR
 CON_DEC_MINU:
          AJMP    DEC_MINU
;--------------遥控器年加调整-----------------------------------
     ADD_YEAR:
           MOV    R7,TIME_YEAR               ;年加1
         LCALL    ADD1
           MOV    TIME_YEAR,A

           MOV    DS1302_ADDR,#8CH   ;年值送1302
           MOV    DS1302_DATA,TIME_YEAR
         LCALL    WRITE

           RET
;--------------遥控器月加调整-----------------------------------
   

⌨️ 快捷键说明

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