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

📄 ds1302.txt

📁 自己编写的ds1302,ds18b20,max7219组成的时间温度显示系统!采用的是汇编
💻 TXT
📖 第 1 页 / 共 2 页
字号:
  MOV C,IO
  NOP
  RRC A
  SETB SCLK
  NOP
  CLR SCLK
  DJNZ R2,REDS13021
  CLR RST
  RET

READ_DS1302_8B:
   MOV R2,#8             ;每次发送八位数据
   MOV A,#0BFH           ;连续读8字节时钟数据的命令
   CLR RST
   NOP
   CLR SCLK
   NOP
   SETB RST
 REDS13028B0:         ;写入8位连续读的命令
  RRC A
  NOP
  MOV IO,C
  NOP
  SETB SCLK
  NOP
  CLR SCLK
  DJNZ R2,REDS13028B0


  MOV R3,#8               ;读8字节数据
  MOV R1,#T_BUFFER        ;读的时钟数据首地址
 REDS13028B1:
  MOV R2,#8
  CLR A
  CLR C       ;先清空c
 REDS13028B2:
  NOP
  MOV C,IO
  NOP
  RRC A
  SETB SCLK
  NOP
  CLR SCLK
  DJNZ R2,REDS13028B2
  MOV @R1,A
  INC R1
  DJNZ R3, REDS13028B1    ;8字节数据是否读完
  CLR RST
  RET


INT0:                ;中断运行程序
   PUSH A
   PUSH B
   MOV R5,#20       ;延时10ms
 INT00:
   MOV R4,#200
 INT02:
   DJNZ R4,INT02
   DJNZ R5, INT00
   JNB P3.2,INT011
    AJMP INT01
   INT011:
   CLR EA
;-------------------------------------------------------中断处理部分
  MOV A,#8EH
  MOV B,#00000000B
  ACALL WRITE_DS1302     ;去掉DS1302的写保护
  MOV A,#81H            ;先把秒时间读出来
  ACALL READ_DS1302
  SETB ACC.7
  MOV B,A               ;读出的秒信息加入停止位后写入
  MOV A,#80H
  ACALL WRITE_DS1302     ;停止计时
;-------------------------------------------------------
 INT07:
      INC T_REG            ;修改指针其值,使其指向所修改的单元
      MOV A,T_REG
    CJNE A,#15,INT010   ;不等于15,则确定哪一页,等于14了,则说明修改完了,要推出中断和请零
       ;--------退出前的清理工作
        MOV T_REG,#0
       MOV DISP,#58H    ;调整完了以后显示shijian
       MOV A,#81H            ;先把秒时间读出来
       ACALL READ_DS1302
       CLR ACC.7
       MOV B,A               ;读出的秒信息加入停止位后写入
       MOV A,#80H
       ACALL WRITE_DS1302     ;打开计时
       MOV A,#8EH
       MOV B,#10000000B
       ACALL WRITE_DS1302     ;加DS1302写保护
      SJMP INT012
 INT010:
    MOV A,T_REG
    CLR C
    SUBB A,#7
   JC INT08              ;小于7,即显示的是年的那页,则跳转,显示缓存为
    MOV DISP,#58H         ;大于7,则显示时间
    SJMP INT09
  INT08:
    MOV DISP,#60H
  INT09:                  ;读ds1302的时间数据,并闪烁显示与T_REG对应位
    ACALL READ_DS1302_8B
    ACALL DS1302_CHULI
    ACALL DELAY
    ACALL DELAY
    ACALL SHANSHUO       ;由T_REG决定哪页的那一位闪烁
    ACALL DISPLAY
 ;-------------------------判断其中p3.3是否有按下来,此时其不是中断,而是低电位。
   JB P3.3,INT30
    MOV R5,#20       ;延时10ms后,检测是否p3.3是否被按下
  INT31:
    MOV R4,#200
    DJNZ R4,$
    DJNZ R5, INT31
    JB P3.3,INT30   ;若为高,则只是抖动,走开
    ACALL CHANGE
  INT32:
    MOV R5,#20       ;延时10ms后,检测是否p3.3是否被防开
   INT321:
    MOV R4,#200
    DJNZ R4,$
    DJNZ R5, INT321
    JNB P3.3,INT32
    ;为高,则说明按键已经防开,可以继续工作。
    ;--------------------判断是否p3.2再次按下
  INT30:
  JB P3.2,INT09
  MOV R5,#20       ;延时10ms后,检测是否p3.2再次被按下
 INT0x:
   MOV R4,#200
 INT0y:
   DJNZ R4,INT0y
   DJNZ R5, INT0x
   JNB P3.2,INT07   ;有按键按下,则T_REG加1,进入处理下一位的循环
   SJMP INT09     ;无按键按下,继续循环

;------------------------------------中断处理完成
INT012:
   MOV R5,#20
 INT0121:
   MOV R4,#200
   DJNZ R4,$
   DJNZ R5,INT0121
   JNB P3.2,INT012     ;按键没放开,则继续等待,一直等到是高电位了,再跳出中断
;------------------------
  SETB EA
  INT01:
   POP B
   POP A
   RETI

SHANSHUO:
  MOV R1,#66H      ;年十位信息存放地址,也做为首地址
  MOV A,R1
  MOV R1,T_REG
  SUBB A,R1
  MOV R1,A
  JB SHANSHUOBIT,SHANSHUO1  ;为1则交换reg于存储位数据,为零则将数据位给reg,
  MOV A,@R1
  MOV DISP_REG,A         ;交换显示书数据,原数据存放在disp-reg中,原数据位请零
  MOV @R1,#0
  SJMP SHANSHUO2
 SHANSHUO1:
   MOV @R1,DISP_REG
   MOV DISP_REG,#0
  SHANSHUO2:
   CPL SHANSHUOBIT
   RET


INT1:                ;中断运行程序
   PUSH A
   MOV R5,#20       ;延时10ms
 INT10:
   MOV R4,#200
 INT12:
   DJNZ R4,INT12
   DJNZ R5, INT10
   JB P3.3,INT11
   CLR EA
;------------------------------------
   MOV A,#8
   ADDC A,DISP
   MOV DISP,A
   CJNE A,#68H,INT13
   MOV DISP,#50H
;------------------------------------
 INT13:
   MOV R5,#20       ;延时10ms
 INT14:
   MOV R4,#200
 INT15:
   DJNZ R4,INT15
   DJNZ R5, INT14
   JNB P3.3,INT13
   POP A
   SETB EA
  INT11:
   RETI

   ;----------------年信息的处理
YH_CHANGE:
   MOV A,#8DH
   ACALL READ_DS1302
   MOV CHANGE_BUFFER,A          ;暂存读数值得
   ANL CHANGE_BUFFER,#00001111B
   ANL A,#11110000B
   SWAP A
   INC A
   CJNE A,#10,YH_CHANGE1
   CLR A                ;满10则回到零
   SJMP YH_CHANGE2
  YH_CHANGE1:
    SWAP  A
  YH_CHANGE2:
    ORL A,CHANGE_BUFFER
    MOV B,A
    MOV A,#8CH
    ACALL WRITE_DS1302
    RET           ;完成年的高位增1操作,结束中断
    ;--------------------------------------------
  YL_CHANGE:
   MOV A,#8DH
   ACALL READ_DS1302
   MOV CHANGE_BUFFER,A          ;暂存读数值得
   ANL CHANGE_BUFFER,#11110000B
   ANL A,#00001111B
   INC A
   CJNE A,#10,YL_CHANGE1
   CLR A                ;满10则回到零
 YL_CHANGE1:
    ORL A,CHANGE_BUFFER
    MOV B,A
    MOV A,#8CH
    ACALL WRITE_DS1302
    RET
;------------------------------完成年的低位增1操作,结束中断
;----------------月信息的处理
MH_CHANGE:
   MOV A,#89H
   ACALL READ_DS1302
   MOV CHANGE_BUFFER,A          ;暂存读数值得
   ANL CHANGE_BUFFER,#00001111B
   ANL A,#11110000B
   SWAP A
   INC A
   CJNE A,#2,MH_CHANGE1
   CLR A                ;满2则回到零
   SJMP MH_CHANGE2
  MH_CHANGE1:
    SWAP  A
  MH_CHANGE2:
    ORL A,CHANGE_BUFFER
    MOV B,A
    MOV A,#88H
    ACALL WRITE_DS1302
    RET           ;完成月的高位增1操作,结束中断
    ;--------------------------------------------
  ML_CHANGE:
   MOV A,#89H
   ACALL READ_DS1302
   MOV CHANGE_BUFFER,A          ;暂存读数值得
   ANL CHANGE_BUFFER,#11110000B
   ANL A,#00001111B
   INC A
   CJNE A,#10,ML_CHANGE1
   CLR A                ;满10则回到零
  ML_CHANGE1:
    ORL A,CHANGE_BUFFER
    MOV B,A
    MOV A,#88H
    ACALL WRITE_DS1302
    RET
;------------------------------完成月的低位增1操作,结束中断
;----------------日信息的处理
DH_CHANGE:
   MOV A,#87H
   ACALL READ_DS1302
   MOV CHANGE_BUFFER,A          ;暂存读数值得
   ANL CHANGE_BUFFER,#00001111B
   ANL A,#11110000B
   SWAP A
   INC A
   CJNE A,#4,DH_CHANGE1
   CLR A                ;满4则回到零
   AJMP DH_CHANGE2
  DH_CHANGE1:
    SWAP  A
  DH_CHANGE2:
    ORL A,CHANGE_BUFFER
    MOV B,A
    MOV A,#86H
    ACALL WRITE_DS1302
    RET           ;完成天的高位增1操作,结束中断
    ;--------------------------------------------
  DL_CHANGE:
   MOV A,#87H
   ACALL READ_DS1302
   MOV CHANGE_BUFFER,A          ;暂存读数值得
   ANL CHANGE_BUFFER,#11110000B
   ANL A,#00001111B
   INC A
   CJNE A,#10,DL_CHANGE1
   CLR A                ;满10则回到零
  DL_CHANGE1:
    ORL A,CHANGE_BUFFER
    MOV B,A
    MOV A,#86H
    ACALL WRITE_DS1302
    RET
;------------------------------完成年的低位增1操作,结束中断
;----------------星期信息的处理
XQ_CHANGE:
   MOV A,#8BH
   ACALL READ_DS1302
   ANL A,#00000111B
   INC A
   CJNE A,#8,XQ_CHANGE1
    MOV A,#1                ;满10则回到零
  XQ_CHANGE1:
    MOV B,A
    MOV A,#8AH
    ACALL WRITE_DS1302
    RET           ;完成星期增1操作,结束中断
OO_CHANGE:
    NOP
    RET           ;有一位无操作,结束中断

;----------------小时信息的处理
HH_CHANGE:
   MOV A,#85H
   ACALL READ_DS1302
   MOV CHANGE_BUFFER,A          ;暂存读数值得
   ANL CHANGE_BUFFER,#00001111B
   ANL A,#00110000B
   SWAP A
   INC A
   CJNE A,#3,HH_CHANGE1
   CLR A                ;满10则回到零
   SJMP HH_CHANGE2
  HH_CHANGE1:
    SWAP  A
  HH_CHANGE2:
    ORL A,CHANGE_BUFFER
    MOV B,A
    MOV A,#84H
    ACALL WRITE_DS1302
    RET         ;完成小时的高位增1操作,结束中断
    ;--------------------------------------------
  HL_CHANGE:
   MOV A,#85H
   ACALL READ_DS1302
   MOV CHANGE_BUFFER,A          ;暂存读数值得
   ANL CHANGE_BUFFER,#11110000B
   ANL A,#00001111B
   INC A
   CJNE A,#10,HL_CHANGE1
   CLR A                ;满10则回到零
  HL_CHANGE1:
    ORL A,CHANGE_BUFFER
    MOV B,A
    MOV A,#84H
    ACALL WRITE_DS1302
    RET
;------------------------------完成小时的低位增1操作,结束中断
;----------------分信息的处理
MINH_CHANGE:
   MOV A,#83H
   ACALL READ_DS1302
   MOV CHANGE_BUFFER,A          ;暂存读数值得
   ANL CHANGE_BUFFER,#00001111B
   ANL A,#11110000B
   SWAP A
   INC A
   CJNE A,#6,MINH_CHANGE1
   CLR A                ;满6则回到零
   SJMP MINH_CHANGE2
  MINH_CHANGE1:
    SWAP  A
  MINH_CHANGE2:
    ORL A,CHANGE_BUFFER
    MOV B,A
    MOV A,#82H
    ACALL WRITE_DS1302
   RET           ;完成分的高位增1操作,结束中断
    ;--------------------------------------------
  MINL_CHANGE:
   MOV A,#83H
   ACALL READ_DS1302
   MOV CHANGE_BUFFER,A          ;暂存读数值得
   ANL CHANGE_BUFFER,#11110000B
   ANL A,#00001111B
   INC A
   CJNE A,#10,MINL_CHANGE1
   CLR A                ;满10则回到零
  MINL_CHANGE1:
    ORL A,CHANGE_BUFFER
    MOV B,A
    MOV A,#82H
    ACALL WRITE_DS1302
    RET
;------------------------------完成分的低位增1操作,结束中断
;----------------秒信息的处理
SH_CHANGE:
   MOV A,#81H
   ACALL READ_DS1302
   MOV CHANGE_BUFFER,A          ;暂存读数值得
   ANL CHANGE_BUFFER,#00001111B
   ANL A,#01110000B
   SWAP A
   INC A
   CJNE A,#6,SH_CHANGE1
     MOV A,#10000000B                ;满6则回到零 ,仍需要停止计时
     SJMP SH_CHANGE2
  SH_CHANGE1:
    SWAP  A
  SH_CHANGE2:
     ORL A,CHANGE_BUFFER
     SETB ACC.7                   ;仍需要停止计时
    MOV B,A
    MOV A,#80H
    ACALL WRITE_DS1302
    RET          ;完成秒的高位增1操作,结束中断
    ;--------------------------------------------
  SL_CHANGE:
   MOV A,#83H
   ACALL READ_DS1302
   MOV CHANGE_BUFFER,A          ;暂存读数值得
   ANL CHANGE_BUFFER,#11110000B
   ANL A,#00001111B
   INC A
   CJNE A,#10,SL_CHANGE1
   CLR A                ;满10则回到零
  SL_CHANGE1:
    ORL A,CHANGE_BUFFER
    MOV B,A
    MOV A,#82H
    ACALL WRITE_DS1302
    RET
;------------------------------完成秒的低位增1操作,结束中断


CHANGE:
   MOV A,T_REG             ;这一部分可能会跑偏
   CJNE A,#1,CHANG1
   ACALL YH_CHANGE
   AJMP CHANGE14
  CHANG1:
   CJNE A,#2,CHANG2
   ACALL YL_CHANGE
    AJMP CHANGE14
  CHANG2:
   CJNE A,#3,CHANG3
   ACALL MH_CHANGE
    AJMP CHANGE14
  CHANG3:
  CJNE A,#4,CHANG4
   ACALL ML_CHANGE
   AJMP CHANGE14
  CHANG4:
   CJNE A,#5,CHANG5
   ACALL DH_CHANGE
    AJMP CHANGE14
  CHANG5:
  CJNE A,#6,CHANG6
   ACALL ML_CHANGE
    AJMP CHANGE14
  CHANG6:
  CJNE A,#7,CHANG7
   ACALL XQ_CHANGE
    AJMP CHANGE14
  CHANG7:
  CJNE A,#8,CHANG8
   ACALL OO_CHANGE
    AJMP CHANGE14
  CHANG8:
  CJNE A,#9,CHANG9
   ACALL HH_CHANGE
    AJMP CHANGE14
  CHANG9:
  CJNE A,#10,CHANG10
   ACALL HL_CHANGE
    AJMP CHANGE14
  CHANG10:
  CJNE A,#11,CHANG11
   ACALL MINH_CHANGE
    AJMP CHANGE14
  CHANG11:
  CJNE A,#12,CHANG12
   ACALL MINL_CHANGE
    AJMP CHANGE14
  CHANG12:
  CJNE A,#13,CHANG13
   ACALL SH_CHANGE
    AJMP CHANGE14
  CHANG13:
  CJNE A,#14,CHANGE14
   ACALL SL_CHANGE
 CHANGE14:
     RET
;-------------------------------------各时间寄存器的加1子程序

⌨️ 快捷键说明

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