单片机
返回首页

时钟芯片DS1302汇编程序

2017-12-05 来源:eefocus

    include  

     CBLOCK 20H 
     SEC      ;秒 
     MIN      ;分 

     HOU      ;小时 
     DATE     ;日期 
     MON      ;月 
    DAY      ;日 
     YERR     ;年 
     DDD      ;写使能位 
     TIME_TX ;1302发送寄存器 
     TIME_RX ;1302接收寄存器 
     COUNT1     ; 
     COUNT2     ; 
     DELAY1 
     DELAY2 
     ENDC 

;================================= 
;1302子程序说明 
; DS1302INI     ;1302初始化,先禁止RST,设定充电方式 
; SET_TIME     ;一次发送7个数据设定时间,包含写使能寄存器,8个数据 
; GET_TIME     ;一次接收7个数据显示时间 
; TIME_WRITE_1    ;一次写入1302一个字节 
; TIME_READ_1     ;一次接收一个字节数据 

;============== 1302定义 =================== 
#DEFINE I_O      PORTC,7     ;1302I_O 
#DEFINE SCLK     PORTC,6     ;1302时钟 
#DEFINE RST      PORTA,0     ;1302使能位 
#DEFINE RX_ADD     40H      ;保存接受的7个数据 
#DEFINE TX_ADD     20H      ;开始保存7个要写入的时间数据 
BANK1 MACRO 
     BSF      STATUS,RP0 
     ENDM 
BANK0 MACRO 
     BCF      STATUS,RP0 
     ENDM 

;====================================== 
    ORG      00H 
     NOP 
     GOTO     MAIN 
MAIN  
     CALL      CLR_RAM     ;清除RAN 
     CALL     PORT_INI      ;端口定义 
     CALL     DS1302_INI 
     CALL     SET_TIME     ; 一次写入7个时间数据 
     CALL     GET_TIME     ; 一次读回7个时间数据 
     GOTO     $ 


;写入秒,可以写任意的7个时间数据,单字节 
     MOVLW     B’10000000’ 
     MOVWF     TIME_TX 
     BSF      RST 
     CALL     CMD 
     MOVLW     B’00100101’ 
     MOVWF     TIME_TX 
     CALL     CMD 
     BCF      RST 

;读秒,可以读任意7个时间,单字节 
     MOVLW     B’10000001’ 
     MOVWF     TIME_TX 
     BSF      RST 
     CALL     CMD 
      CALL     TIME_READ_1 
     BCF      RST     
    GOTO     $ 

;************************************************** 
; DS1302_INI:子程序 
; 作用:初始化1302,先禁止RST,允许写使能 
;************************************************** 
DS1302_INI 
     BCF      SCLK 
     BCF      RST           ;先禁止 
     MOVLW     B’10001110’     ;写使能寄存器 
     MOVWF     TIME_TX 
     BSF      RST 
     CALL     CMD 
     MOVLW     B’0’          ;允许写使能 
     MOVWF     TIME_TX 
     CALL     CMD        ;发送一个字节的数据 
     BCF      RST 
  
;设定充电方式  没有设定 
     RETURN   
  
;************************************************** 
; SET_TIME      
; 作用:一次输入7个数据来一次性的设定时间,同时使能写寄存器 
; 突发模式写入,必须写入8个数据,不是7个 
; INPUT:要设定的8个数据已经写入到TIME_TX_ADD开始的8个字节里面 
;************************************************** 
SET_TIME    
       MOVLW     B’10111110’ ;标志位 
     MOVWF     TIME_TX 
     BSF      RST   
     CALL     CMD 
    ;TIME_WRITE_8       ;发送8个数据 
     MOVLW     TX_ADD  ;//发送数据的起始地址 
     MOVWF     FSR 
     MOVLW     D’8’ 
     MOVWF     COUNT2 
TW1 
     MOVF     INDF,W 
     MOVWF     TIME_TX 
     CALL     CMD 
     INCF     FSR,F 
     DECFSZ     COUNT2,F 
     GOTO     TW1 
     BCF      RST 
     RETURN  

;*********************************************** 
; GET_TIME   
; 作用:一次接受7个字节的时间数据,突发模式读取 
; INPUT:NONE 
; OUTPUT:把7个时间数据保存在TIME_RX_ADD开始的7个寄存器里面 
;*********************************************** 
GET_TIME     
        MOVLW     B’10111111’ 
     MOVWF     TIME_TX 
     BSF      RST 
     CALL     CMD 
    ;TIME_READ_7           ;接收7个数据 
     MOVLW     RX_ADD      ;保存数据的起始地址 
     MOVWF     FSR 
     MOVLW     D’7’ 
     MOVWF     COUNT2 
TR2 
     CALL     TIME_READ_1 
     MOVF     TIME_RX,W 
     MOVWF     INDF 
     INCF     FSR,F 
     DECFSZ     COUNT2,F 
     GOTO     TR2 
     BCF      RST 
     RETURN 

;************************************************ 
; TIME_WRITE_1 
; 作用:一次发送一个字节的数据,用于发送1302的 
; 控制字或者发送一个数据 
; INPUT: TIME_TX 
;************************************************ 
CMD 
     MOVLW D’8’ 
     MOVWF COUNT1 
TLOP 
     BCF      I_O       ;初始值是低电平 
     BCF      SCLK 
     BTFSC     TIME_TX,0 
     BSF      I_O 
     RRF      TIME_TX,F 
     BSF      SCLK      ;高电平发送数据 
     DECFSZ     COUNT1,F 
     GOTO     TLOP 
     BCF      SCLK      ;恢复 
     RETURN 

;************************************************ 
; TIME_READ_1 
; 作用:读取1302一个字节的数据 
; INPUT: NONE 
; OUTPUT:接收数据保存在TIME_RX里面 
; 原理:在SCLK下降沿接收数据,低字节在前,根据I_O的 
;    的电平的高低,采取带进位和不带进位右移. 
;*********************************************** 
TIME_READ_1 
     BANK1 
     BSF      TRISC,7     ;I_O  IS INPUT 
     BANK0 
     MOVLW     D’8’ 
     MOVWF     COUNT1         ;读取8个字节 
TR1 
     BCF      SCLK         ;下降沿读取 
     BCF      STATUS,C 
     BTFSC     I_O 
     BSF      STATUS,C 
     RRF      TIME_RX,F 
     BSF      SCLK         ;恢复高电平 
     DECFSZ     COUNT1,F 
     GOTO     TR1 
     BANK1 
     BCF      TRISC,7     ;OUTPUT 
     BANK0 
     BCF      SCLK         ;恢复 
     RETURN 

;====================================== 
PORT_INI 
     BANK1 
     MOVLW     B’00000000’ 
     MOVWF     TRISC 
     MOVLW     B’0’ 
     MOVWF     TRISB 
     MOVLW     B’00000111’ 
     MOVWF     ADCON1 
     MOVLW     B’00000000’ 
     MOVWF     TRISA 
     BANK0 
     MOVLW     18H 
     MOVWF     20H 
     MOVLW     19H 
     MOVWF     21H 
     MOVLW     05H 
     MOVWF     22H 
     MOVLW     13H 
     MOVWF     23H 
     MOVLW     14H 
     MOVWF     24H 
     MOVLW     15H 
     MOVWF     25H 
     MOVLW     16H 
     MOVWF     26H 
     RETURN 

;========================== 
CLR_RAM 
      MOVLW     20H 
      MOVWF     FSR 
LOOP  
      CLRF     INDF 
      INCF     FSR,F 
      BTFSS     FSR,7 
      GOTO     LOOP     ;清除32个 
      RETURN 
;========================== 
     END 


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 用数字电路CD4069制作的万能遥控轻触开关

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 开关电源的基本组成及工作原理

  • 用NE555制作定时器

  • 带有短路保护系统的5V直流稳压电源电路图

    相关电子头条文章