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

📄 ds1302.asm

📁 ds1302的汇编语言编程实例
💻 ASM
字号:
 ORG    0000H
 JMP    Main
 ORG    0040H

;显示控制
OUTBIT   equ 08002h  ; 位控制口
OUTSEG   equ 08004h  ; 段控制口

 ; 八段管显示码
LEDMAP:
 db    3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
 db    7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h

;控制量定义
 FLAG      bit     20H    ;标志位,用于显示模块
 BitCnt    data    30H    ;位计数器
 Command   data    31H    ;命令字地址

;寄存器定义
 SECOND    data    50H    ;秒数据发送接收寄存器
 MINUTE    data    51H    ;分
 HOUR      data    52H    ;时
 DAY       data    53H    ;日
 MONTH     data    54H    ;月
 DATE      data    55H    ;星期
 YEAR      data    56H    ;年

;端口位定义
 SCLK      bit     P3.0
 IOD       bit     P3.1
 RST       bit     P3.2

Main:
 ACALL  Set1302
loop:
 ACALL  Get1302
 ACALL  DisplayLED
 JMP    loop

;**************************************************************
;时间信息设置模块
;名称:Set1302
;描述:设置1302的(秒 分 时 日 月 星期 年)信息
;**************************************************************
Set1302:
;时间信息设定,例 08 年 07 月 01 日 20 时 15 分 30 秒 星期 二
 MOV       SECOND,#20H
 MOV       MINUTE,#40H
 MOV       HOUR,  #10H
 MOV       DAY,   #02H
 MOV       MONTH, #07H
 MOV       DATE,  #03H
 MOV       YEAR,  #08H

;允许写入1302
 MOV       R0,#8EH          ;命令字
 ACALL     Send_Command     ;发送
 MOV       R0,#00H          ;允许写入
 ACALL     Send_Byte

;时间信息传输
 MOV       R5,#7            ;秒 分 时 日 月 星期 年
 MOV       R6,#80H          ;初始命令字存于R6中
 MOV       R1,#SECOND       ;秒地址暂存于R1中
nextB_W:
 MOV       B,R6
 MOV       R0,B
 ACALL     Send_Command
 MOV       B,@R1           ;Send_Byte入口
 MOV       R0,B
 ACALL     Send_Byte
 INC       R6               ;写(秒 分 时 日 月 星期 年)命令字依次差二
 INC       R6
 INC       R1
 DJNZ      R5,nextB_W
 RET

;**************************************************************
;时间信息读取模块
;名称:Get1302
;描述:读取1302的(秒 分 时 日 月 星期 年)信息,并存入相应寄存器
;**************************************************************
Get1302:
;时间信息传输
 MOV       R5,#7            ;秒 分 时 日 月 星期 年
 MOV       R6,#81H          ;初始命令字存于R6中
 MOV       R1,#SECOND       ;秒地址暂存于R7中
nextU_R:                    ;读下一单元(Unit),单元=命令字+对应数据
 MOV       B,R6
 MOV       R0,B
 ACALL     Send_Command
 ACALL     Receive_Byte
 INC       R6               ;写(秒 分 时 日 月 星期 年)命令字依次差二
 INC       R6
 INC       R1
 DJNZ      R5,nextU_R
 RET
;*******************************************************
;发送命令字模块
;名称:Send_Command
;描述:发送命令字,完成后RST保持高电平,SCLK为低电平
;入口:MOV  R0,Command
;*******************************************************
Send_Command:
 CLR       RST
 NOP
 CLR       SCLK
 NOP
 SETB      RST
 NOP
 MOV       BitCnt,#8H
 MOV       A,R0
nextb_S_cmd:
 RRC       A
 MOV       IOD,C
 SETB      SCLK
 NOP
 CLR       SCLK
 NOP
 DJNZ      BitCnt,nextb_S_cmd
 RET


 ;ACALL     OSC_Enable   ;开振荡器

;**************************************************
;发送数据程序
;名称:Send_Byte
;描述:发送1个字节给被控器DS1302,命令字节
;为[Command],发送数据为[XmtDat]
;入口:
;MOV R0,XmtDat
;**************************************************
Send_Byte:
 MOV       BitCnt,#8H
 MOV       A,R0
nextb_S:
 RRC       A
 MOV       IOD,C
 NOP
 SETB      SCLK   ;在上升沿向1302输入一位,SCLK在传输命令字后已经使变为低电平
 NOP
 CLR       SCLK
 NOP
 DJNZ      BitCnt,nextb_S
 CLR       RST    ;停止数据传输
 RET

;*************************************************
;接收数据模块
;名称:Receive_Byte
;描述:从被控器DS1302接收1个字节到[R1]开始的内存单元
;入口:
;mov r1,RcvAddr
;*************************************************
Receive_Byte:

 MOV       BitCnt,#8

nextb_R:
 MOV       C,IOD
 RRC       A
 SETB      SCLK     ;数据移位
 NOP
 CLR       SCLK
 NOP
 DJNZ      BitCnt,nextb_R   ;每字节的8位是否传完
 MOV       @R1,A
 MOV       P1,A   ;del
 CLR       RST      ;停止数据传输
 RET

;*********************************************************
; 延时子程序
;*********************************************************
Delay:
       mov   r7, #0
DelayLoop:
       djnz  r7, DelayLoop
       djnz  r6, DelayLoop
       ret

;*********************************************************
;显示模块
;*********************************************************
DisplayLED:
       mov   r0, #SECOND
       mov   r1, #3          ; 显示: 时 分 秒
       mov   r2, #00000001b  ; 从右边开始显示
       mov   r3,#2           ;读一个时间字节,2次显示
       clr   FLAG            ;先取低四位,再取高四位

       mov   dptr, #OUTBIT
       mov   a, #0
       movx  @dptr, a        ; 关所有八段管

loop1:
       mov   a, @r0
       mov   b, a            ;b暂存数据
Loop2:
       jb    FLAG,HighB
       anl   a,#0FH
continue:
       mov   dptr,#LEDMAP
       movc   a,@a+dptr
       mov   dptr, #OUTSEG
       movx  @dptr,a
       mov   dptr, #OUTBIT
       mov   a, r2
       movx  @dptr, a        ; 显示一位八段管

       mov   r6, #01
       call  Delay

       mov   a, r2           ; 显示下一位
       rl    a
       mov   r2, a
       setb  FLAG
       djnz  r3,loop2

       mov   r3,#2          ;R3恢复为2
       clr  FLAG            ;显示低四位
       inc   r0

       djnz  r1, Loop1
       jmp   exit
HighB:
       mov   a,b
       anl   a,#0F0H
       rr    a               ;左移四位
       rr    a
       rr    a
       rr    a
       clr   FLAG
       jmp   continue
exit:
       ret
 END



































⌨️ 快捷键说明

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