;************** LCD显示第一行的字 *************************
LCD1602_SHOW_L1 MOVLW 80H
MOVWF LCD1602_LINE_SHOWADDR
;MOVLW D8
;MOVWF LCD1602_LINE_LEN
MOVLW LOW(TABLE_LCD1602_LINE1)
MOVWF LCD1602_LINE_ADDRL
MOVLW HIGH(TABLE_LCD1602_LINE1)
MOVWF LCD1602_LINE_ADDRH
CALL LCD1602_WRITE_LINE_EX
RETURN
;************** LCD显示第二行的字 *************************
LCD1602_SHOW_L2 MOVLW 0C0H
MOVWF LCD1602_LINE_SHOWADDR
;MOVLW D8
;MOVWF LCD1602_LINE_LEN
MOVLW LOW(TABLE_LCD1602_LINE2)
MOVWF LCD1602_LINE_ADDRL
MOVLW HIGH(TABLE_LCD1602_LINE2)
MOVWF LCD1602_LINE_ADDRH
CALL LCD1602_WRITE_LINE_EX
RETURN
;************************送数据到LCD***********************
;写数据子程序 LCD1602_CODER
;RS=1,RW=0,E=高脉冲,D0-D7=数据
;**********************************************************
LCD1602_WRITECODE MOVLW 0FFH
MOVWF PORTD
;
CALL LCD1602_CHKBUSY ;判断总线是否忙
BSF LCD1602_RS
BCF LCD1602_RW
MOVF LCD1602_CODER , 0
MOVWF PORTD ;送出数据
BSF LCD1602_E
NOP
NOP
BCF LCD1602_E
RETURN
;************************送命令到LCD***********************
;写指令子程序 LCD1602_COM
;RS=0,RW=0,E=高脉冲,D0-D7=指令码
;**********************************************************
LCD1602_WRITECOM MOVLW 0FFH
MOVWF PORTD
;
BTFSC LCD1602_NEED_CHKBUSY,0
CALL LCD1602_CHKBUSY ;判断总线是否忙
BCF LCD1602_RS
BCF LCD1602_RW
MOVF LCD1602_COM ,0
MOVWF PORTD ;送命令
BSF LCD1602_E
NOP
NOP
BCF LCD1602_E
RETURN
;************************判断LCD总线是否忙********************
;测忙碌子程序
;RS=0,RW=1,E=H,D0-D7=状态字
;**********************************************************
LCD1602_CHKBUSY BTFSC IDERUN_FLAG,0
RETURN
;NOP
;BANKSEL TRISD
BSF STATUS,RP0
MOVLW 0FFH
MOVWF TRISD ;D口设置为输入
BCF STATUS,RP0
CLRF STATUS
MOVLW 0FFH
MOVWF PORTD
BCF LCD1602_RS
BSF LCD1602_RW
LCD1602_CHKBUSY_A CLRWDT;NOP
NOP
NOP
BSF LCD1602_E
NOP
NOP
NOP
BTFSS PORTD,7 ;D7为高表示总线忙,为低表示总线空闲
GOTO LCD1602_CHKBUSY_B;$+6
NOP
NOP
NOP
BCF LCD1602_E
GOTO LCD1602_CHKBUSY_A
LCD1602_CHKBUSY_B BCF LCD1602_E
;BANKSEL TRISD
BSF STATUS,RP0
CLRF TRISD ;恢复D口为输出
BCF STATUS,RP0
CLRF STATUS
RETURN
;
; ********* LCD1602 INIT *********************
LCD1602_INIT CLRF LCD1602_NEED_CHKBUSY
NOP
CALL DELAY_5MS
CALL DELAY_10MS
MOVLW 38H
MOVWF LCD1602_COM
CALL LCD1602_WRITECOM
CALL DELAY_5MS
MOVLW 38H
MOVWF LCD1602_COM
CALL LCD1602_WRITECOM
CALL DELAY_5MS
MOVLW 38H
MOVWF LCD1602_COM
CALL LCD1602_WRITECOM
BSF LCD1602_NEED_CHKBUSY,0
;
MOVLW 38H
MOVWF LCD1602_COM
CALL LCD1602_WRITECOM
MOVLW 08H
MOVWF LCD1602_COM
CALL LCD1602_WRITECOM
MOVLW 01H
MOVWF LCD1602_COM
CALL LCD1602_WRITECOM
MOVLW 06H
MOVWF LCD1602_COM
CALL LCD1602_WRITECOM
MOVLW 0CH
MOVWF LCD1602_COM
CALL LCD1602_WRITECOM
RETURN
;************* KEY键盘动作检查子程序 **********
KEYCHECK BTFSS KEYSCAN_CON_FLAG,0
GOTO KEYCHECKA
INCF KEYSCAN_CON_COUNTER,F
;MOVLW D12
MOVF KEYSCAN_CON_COUNTER_LIMIT,W
SUBWF KEYSCAN_CON_COUNTER,W
BTFSS STATUS,C
GOTO KEYCHECKA
CLRF KEYSCAN_CON_KEYVALUE
CLRF KEYSCAN_CON_COUNTER
CLRF KEYSCAN_CON_FLAG
;
KEYCHECKA CALL KEYSCAN ;调用键盘扫描子程序
COMF KEYSCAN_VALUE,0 ;位置码取反送W
BTFSC STATUS,Z ;测试右键按下否?有! 跳过下条指令
RETURN ;无
;
CALL DELAY_20MS
;CALL DELAY_10MS
CALL KEYSCAN ;再次调用键盘扫描子程序
COMF KEYSCAN_VALUE,0 ;位置码取反送W
BTFSC STATUS,Z ;测试有键按下否?有!跳过下条指令
RETURN ;无
;
MOVF KEYSCAN_VALUE,0 ;键值全是0则不做处理
XORLW 00H
BTFSC STATUS,Z
RETURN
MOVF KEYSCAN_VALUE,0 ;键值全是1则不做处理
XORLW 0FFH
BTFSC STATUS,Z
RETURN
;
;判断 KEYSCAN_CON_COUNTER ,只有 (KEYSCAN_CON_COUNTER==0 ) OR ( KEYSCAN_CON_COUNTER>0 AND KEYSCAN_CON_KEYVALUE<>KEYSCAN_VALUE )的时候才处理这次按键
; 也就是说不处理按键的条件为 KEYSCAN_CON_COUNTER>0 AND KEYSCAN_CON_KEYVALUE==KEYSCAN_VALUE
MOVLW 00H
SUBWF KEYSCAN_CON_COUNTER,0
BTFSC STATUS,Z
GOTO KEYACTIONRISE
MOVF KEYSCAN_VALUE,0
SUBWF KEYSCAN_CON_KEYVALUE,0
BTFSC STATUS,Z
RETURN
;
KEYACTIONRISE MOVLW D12
MOVWF KEYSCAN_CON_COUNTER_LIMIT ;赋值必须要放到处理函数调用的前面
;
CALL KEYACTION_PROCESS ;调用按键处理子程序 键值位置码保存在 KEYSCAN_VALUE
MOVF KEYSCAN_VALUE,W
MOVWF KEYSCAN_CON_KEYVALUE
BSF KEYSCAN_CON_FLAG,0
CLRF KEYSCAN_CON_COUNTER
RETURN
;
; ********* 键盘扫描子程序 ************ ******************
KEYSCAN BCF STATUS,RP1 ;设置文件寄存器的体1
BSF STATUS,RP0
BCF OPTION_REG,NOT_RBPU ;启用B口上拉电阻
MOVLW 0FH ;将端口B的方向控制码0FH先送W
MOVWF TRISB ;将其设为高四位输出,低四位输入
BCF STATUS,RP0 ;恢复到文件寄存器体0
MOVLW 00H ;4条行线全部输出0
MOVWF PORTB
NOP ;等待状态稳定下来
NOP
MOVF PORTB,0 ;读取列线状态
ANDLW 0FH ;屏蔽掉高四位
MOVWF KEYSCAN_VALUE ;得到的列码暂存到VALUE寄存器中
XORLW 0FH ;于0FH值对比
BTFSC STATUS,Z ;列码全部位1吗?否! 有键按下
GOTO KEYNO ;是!无键按下
BSF STATUS ,RP0 ;设置文件寄存器的体1
MOVLW 0F0H ;将端口B的方向 控制码0F0H先送W
MOVWF TRISB ;改变位低四位输出 高四位输入
BCF STATUS,RP0 ;恢复为文件寄存器体0
MOVF KEYSCAN_VALUE,0 ;读取列码
MOVWF PORTB ;在经过列线输出
NOP ;等待输出状态稳定下来
NOP
MOVF PORTB,0 ;读取行线状态
ANDLW 0F0H ;屏蔽掉低四位
IORWF KEYSCAN_VALUE,1 ;将行码和列码组合起来放入VALUE
RETURN ;子程序返回
;
KEYNO MOVLW 0FFH ;建立一个标志值, 表明无键按下
MOVWF KEYSCAN_VALUE ;
RETURN ;子程序返回
;
;********************* 按键动作处理子程序 *********
;入口参数:键值位置码保存在 KEYSCAN_VALUE
;**************************************************
KEYACTION_PROCESS NOP
CALL SOUND_1000HZ
; REAL KEY ACTION
MOVF KEYSCAN_VALUE,0
XORLW 77H
BTFSC STATUS,Z
GOTO KEY77
MOVF KEYSCAN_VALUE,0
XORLW 0B7H
BTFSC STATUS,Z
GOTO KEYB7
MOVF KEYSCAN_VALUE,0
XORLW 0D7H
BTFSC STATUS,Z
GOTO KEYD7
MOVF KEYSCAN_VALUE,0
XORLW 0E7H
BTFSC STATUS,Z
GOTO KEYE7
;
MOVF KEYSCAN_VALUE,0
XORLW 7BH
BTFSC STATUS,Z
GOTO KEY7B
MOVF KEYSCAN_VALUE,0
XORLW 0BBH
BTFSC STATUS,Z
GOTO KEYBB
MOVF KEYSCAN_VALUE,0
XORLW 0DBH
BTFSC STATUS,Z
GOTO KEYDB
MOVF KEYSCAN_VALUE,0
XORLW 0EBH
BTFSC STATUS,Z
GOTO KEYEB
;
MOVF KEYSCAN_VALUE,0
XORLW 7DH
BTFSC STATUS,Z
GOTO KEY7D
MOVF KEYSCAN_VALUE,0
XORLW 0BDH
BTFSC STATUS,Z
GOTO KEYBD
MOVF KEYSCAN_VALUE,0
XORLW 0DDH
BTFSC STATUS,Z
GOTO KEYDD
MOVF KEYSCAN_VALUE,0
XORLW 0EDH
BTFSC STATUS,Z
GOTO KEYED
;
MOVF KEYSCAN_VALUE,0
XORLW 7EH
BTFSC STATUS,Z
GOTO KEY7E
MOVF KEYSCAN_VALUE,0
XORLW 0BEH
BTFSC STATUS,Z
GOTO KEYBE
MOVF KEYSCAN_VALUE,0
XORLW 0DEH
BTFSC STATUS,Z
GOTO KEYDE
MOVF KEYSCAN_VALUE,0
XORLW 0EEH
BTFSC STATUS,Z
GOTO KEYEE
RETURN
; ------------------------------
KEY77
MOVLW 80H
MOVWF LCD1602_COM
CALL LCD1602_WRITECOM
MOVLW D80
MOVWF LCD1602_CODER
CALL LCD1602_WRITECODE
RETURN
;
KEYB7 CALL LCD1602_SHOW_L1
RETURN
;
KEYD7 CALL LCD1602_SHOW_L2
RETURN
KEYE7 RETURN
; ---------------------
KEY7B RETURN
KEYBB RETURN
KEYDB RETURN
KEYEB RETURN
; ----------------------------------
KEY7D RETURN
KEYBD RETURN
KEYDD RETURN
KEYED RETURN
KEY7E RETURN
KEYBE RETURN
KEYDE RETURN
KEYEE RETURN
; -----------------
RETURN
; ************* LCD1602 DISPLAY DS1302 **********************
; DS1302_SEC ;秒 48H
; DS1302_MIN ;分 49H
; DS1302_HOU ;小时 4AH
; DS1302_DATE ;日期 4BH
; DS1302_MON ;月 4CH
; DS1302_DAY ;日 4DH
; DS1302_YERR ;年 4EH
;
LCD1602_DISPLAY_DS1302 MOVLW 80H
MOVWF LCD1602_COM
CALL LCD1602_WRITECOM
;
;NUM2ASCII NUM2ASCII_INBYTE
MOVF DS1302_HOU,W
MOVWF NUM2ASCII_INBYTE
CALL NUM2ASCII
MOVF NUM2ASCII_INBYTE,W
MOVWF LCD1602_CODER
CALL LCD1602_WRITECODE
;
MOVF DS1302_HOU,W
MOVWF NUM2ASCII_INBYTE
SWAPF NUM2ASCII_INBYTE
CALL NUM2ASCII
MOVF NUM2ASCII_INBYTE,W
MOVWF LCD1602_CODER
CALL LCD1602_WRITECODE
;
MOVLW 3AH ; (:)
MOVWF LCD1602_CODER
CALL LCD1602_WRITECODE
;
MOVF DS1302_MIN,W
MOVWF NUM2ASCII_INBYTE
CALL NUM2ASCII
MOVF NUM2ASCII_INBYTE,W
MOVWF LCD1602_CODER
CALL LCD1602_WRITECODE
;
MOVF DS1302_MIN,W
MOVWF NUM2ASCII_INBYTE
SWAPF NUM2ASCII_INBYTE
CALL NUM2ASCII
MOVF NUM2ASCII_INBYTE,W
MOVWF LCD1602_CODER
CALL LCD1602_WRITECODE
;
MOVLW 3AH ; (:)
MOVWF LCD1602_CODER
CALL LCD1602_WRITECODE
;
MOVF DS1302_SEC,W
MOVWF NUM2ASCII_INBYTE
CALL NUM2ASCII
MOVF NUM2ASCII_INBYTE,W
MOVWF LCD1602_CODER
CALL LCD1602_WRITECODE
;
MOVF DS1302_SEC,W
MOVWF NUM2ASCII_INBYTE
SWAPF NUM2ASCII_INBYTE
CALL NUM2ASCII
MOVF NUM2ASCII_INBYTE,W
MOVWF LCD1602_CODER
CALL LCD1602_WRITECODE
;
MOVLW 20H ; ( )
MOVWF LCD1602_CODER
CALL LCD1602_WRITECODE
RETURN
; ************** LCD1602_WRTITE_LINE **************************
;
LCD1602_WRITE_LINE MOVF LCD1602_LINE_SHOWADDR,0
MOVWF LCD1602_COM
CALL LCD1602_WRITECOM
;
MOVF LCD1602_LINE_ADDRL ,0
MOVWF FLASH_READ_ADDRL
MOVF LCD1602_LINE_ADDRH ,0
MOVWF FLASH_READ_ADDRH
;
LCD1602_WRITE_LINE_LOOP CALL FLASH_READ
MOVF FLASH_READ_DATAL,0
MOVWF LCD1602_CODER
CALL LCD1602_WRITECODE
DECF LCD1602_LINE_LEN
BTFSC STATUS,Z
RETURN
MOVLW 01H
ADDWF FLASH_READ_ADDRL,1
BTFSC STATUS,C
INCF FLASH_READ_ADDRH
GOTO LCD1602_WRITE_LINE_LOOP
RETURN
; ************** LCD1602_WRTITE_LINE_EX **************************
;
LCD1602_WRITE_LINE_EX MOVF LCD1602_LINE_SHOWADDR,0
MOVWF LCD1602_COM
CALL LCD1602_WRITECOM
;
MOVF LCD1602_LINE_ADDRL ,0
MOVWF FLASH_READ_ADDRL
MOVF LCD1602_LINE_ADDRH ,0
MOVWF FLASH_READ_ADDRH
;
LCD1602_WRITE_LINE_EX_LOOP CALL FLASH_READ
MOVLW 00H
ADDWF FLASH_READ_DATAL,W
BTFSC STATUS,Z
RETURN
;
MOVF FLASH_READ_DATAL,0
MOVWF LCD1602_CODER
CALL LCD1602_WRITECODE
;
MOVLW 01H
ADDWF FLASH_READ_ADDRL,1
BTFSC STATUS,C
INCF FLASH_READ_ADDRH
GOTO LCD1602_WRITE_LINE_EX_LOOP
RETURN
; *************** 读取 EEPROM 数据 ******************
; 入口参数: 把地址放入w
; 出口参数: 把读取的数据放入w
;
EEPROM_READ BSF STATUS,RP1 ;用两条指令
BCF STATUS,RP0 ;选定体2为当前体
;MOVF ADDR,W
MOVWF EEADR
BSF STATUS,RP0 ; RAM PAGE 3
BCF EECON1,EEPGD
BSF EECON1,RD
BCF STATUS,RP0 ;RAM PAGE 2
MOVF EEDATA,W ;
NOP
BCF STATUS,RP0
BCF STATUS,RP1
RETURN
; *************** 写入 EEPROM 数据 ******************
; 入口参数: EEPROM_WRITE_ ADDR EEPROM_WRITE_DATA
;
EEPROM_WRITE BSF STATUS,RP1 ;SET RAM PAGE 3
BSF STATUS,RP0
BTFSC EECON1,WR
GOTO $-1
;
BCF STATUS,RP1
BCF STATUS,RP0
MOVF EEPROM_WRITE_ADDR,0
;
BSF STATUS,RP1
BCF STATUS,RP0 ;SET RAM PAGE 2
MOVWF EEADR
;
BCF STATUS,RP1
BCF STATUS,RP0
MOVF EEPROM_WRITE_DATA,0
;
BSF STATUS,RP1
BCF STATUS,RP0 ;SET RAM PAGE 2
MOVWF EEDATA
;
BSF STATUS,RP1
BSF STATUS,RP0 ;SET RAM PAGE 3
BCF EECON1,EEPGD
BSF EECON1,WREN
BCF INTCON,GIE
;
MOVLW 0x55
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1,WR
;
BSF INTCON,GIE
BCF EECON1,WREN
;
BTFSC EECON1,WR
GOTO $-1
BCF STATUS,RP1 ;SET RAM PAGE 0
BCF STATUS,RP0
RETURN
; *************** 读取 FLASH 数据 ******************
; 入口参数: 把地址 FLASH_READ_ADDRL , FLASH_READ_ADDRH
; 出口参数: FLASH_READ_DATAL , FLASH_READ_DATAH
;
FLASH_READ BCF STATUS,RP0
BCF STATUS,RP1
MOVF FLASH_READ_ADDRL, 0 ;Write the address bytes
;
BSF STATUS, RP1 ;
BCF STATUS, RP0 ;Bank 2
MOVWF EEADR
;
BCF STATUS,RP0
BCF STATUS,RP1
MOVF FLASH_READ_ADDRH,0 ;for the desired
;
BSF STATUS, RP1 ;
BCF STATUS, RP0 ;Bank 2
MOVWF EEADRH ;address to read
;
BSF STATUS, RP1 ;Bank 3
BSF STATUS, RP0 ;Bank 3
BSF EECON1, EEPGD ;Point to Program memory
BSF EECON1, RD ;Start read operation
NOP ;Required two NOPs
NOP ;
NOP
BSF STATUS, RP1
BCF STATUS, RP0 ;Bank 2
MOVF EEDATA, W ;DATAL = EEDATA
;
BCF STATUS,RP0
BCF STATUS,RP1
MOVWF FLASH_READ_DATAL ;
;
BSF STATUS, RP1
BCF STATUS, RP0 ;Bank 2
MOVF EEDATH,W ;DATAH = EEDATH
;
BCF STATUS,RP0
BCF STATUS,RP1
MOVWF FLASH_READ_DATAH ;
;
BCF STATUS,RP0
BCF STATUS,RP1
RETURN
;***************** SOUND_1000HZ 100MS子函数 *****************
SOUND_1000HZ CLRWDT
NOP
MOVLW D100
MOVWF DELAY_VAR_M
BCF PORTC,2
SOUND_1000HZ_1 ; 1 during 500 um
BSF PORTC,2
MOVLW D165
MOVWF DELAY_VAR_N
DECFSZ DELAY_VAR_N,1
GOTO $-1
; 0 during 500 um
BCF PORTC,2
MOVLW D165
MOVWF DELAY_VAR_N
DECFSZ DELAY_VAR_N,1
GOTO $-1
;
DECFSZ DELAY_VAR_M,1
GOTO SOUND_1000HZ_1
RETURN
;***************** 延时5ms子函数 *****************
DELAY_5MS CLRWDT
NOP
MOVLW D6
MOVWF DELAY_VAR_M
DEL5_1 MOVLW 0FFH
MOVWF DELAY_VAR_N
DECFSZ DELAY_VAR_N,1
GOTO $-1
DECFSZ DELAY_VAR_M,1
GOTO DEL5_1
NOP
NOP
RETURN
;***************** 延时10ms子函数 *****************
DELAY_10MS CLRWDT
NOP
MOVLW D13
MOVWF DELAY_VAR_M
DEL10_1 MOVLW 0FFH
MOVWF DELAY_VAR_N
DECFSZ DELAY_VAR_N,1
GOTO $-1
DECFSZ DELAY_VAR_M,1
GOTO DEL10_1
NOP
NOP
RETURN
;***************** 延时20ms子函数 *****************
DELAY_20MS CLRWDT
NOP
MOVLW D26
MOVWF DELAY_VAR_M
DEL20_1 MOVLW 0FFH
MOVWF DELAY_VAR_N
DECFSZ DELAY_VAR_N,1
GOTO $-1
DECFSZ DELAY_VAR_M,1
GOTO DEL20_1
NOP
NOP
RETURN
;***************** 延时50ms子函数 *****************
DELAY_50MS CLRWDT
NOP
MOVLW D65
MOVWF DELAY_VAR_M
DEL50_1 MOVLW 0FFH
MOVWF DELAY_VAR_N
DECFSZ DELAY_VAR_N,1
GOTO $-1
DECFSZ DELAY_VAR_M,1
GOTO DEL50_1
NOP
NOP
RETURN
;***************** 延时100ms子函数 *****************
DELAY_100MS CLRWDT
NOP
MOVLW D130
MOVWF DELAY_VAR_M
DEL100_1 MOVLW 0FFH
MOVWF DELAY_VAR_N
DECFSZ DELAY_VAR_N,1
GOTO $-1
DECFSZ DELAY_VAR_M,1
GOTO DEL100_1
NOP
NOP
RETURN
;***************** 延时500ms子函数 *****************
DELAY_500MS CALL DELAY_100MS
CALL DELAY_100MS
CALL DELAY_100MS
CALL DELAY_100MS
CALL DELAY_100MS
RETURN
;*************************** BIN2BCD *************************************
;入口: w
;出口: BIN2BCD_MSD BIN2BCD_LSD
;*******************************************************************
BIN2BCD CLRF BIN2BCD_MSD
MOVWF BIN2BCD_LSD
BIN2BCD_GTENTH MOVLW .10
SUBWF BIN2BCD_LSD,W
BTFSS STATUS, C ;CARRY
RETURN
MOVWF BIN2BCD_LSD
INCF BIN2BCD_MSD
GOTO BIN2BCD_GTENTH
RETURN
; *********************** BIN2ASCII ************************************
;BIN2ASCII
;BIN2ASCII_INBYTE 入口参数
;BIN2ASCII_LSD 出口参数低字节
;BIN2ASCII_MSD 出口参数高字节
;
BIN2ASCII MOVF BIN2ASCII_INBYTE ,0
CALL BIN2BCD
;
MOVF BIN2BCD_LSD,0
MOVWF NUM2ASCII_INBYTE
CALL NUM2ASCII
MOVF NUM2ASCII_INBYTE,0
MOVWF BIN2ASCII_LSD
;
MOVF BIN2BCD_MSD,0
MOVWF NUM2ASCII_INBYTE
CALL NUM2ASCII
MOVF NUM2ASCII_INBYTE,0
MOVWF BIN2ASCII_MSD
;
RETURN
;
; ******* NUM2ASCII (0-9)单个十六进制数字转ASCII码值 **************************
; 入口参数 NUM2ASCII NUM2ASCII_INBYTE 只运算低四位
; 出口参数 NUM2ASCII NUM2ASCII_INBYTE
;********************************************
NUM2ASCII BCF NUM2ASCII_INBYTE,7
BCF NUM2ASCII_INBYTE,6
BCF NUM2ASCII_INBYTE,5
BCF NUM2ASCII_INBYTE,4
MOVLW D48
ADDWF NUM2ASCII_INBYTE,1
RETURN
;**************************************
;入口: BCDTOBIN_X * W --> BCDTOBIN_X
BCDTOBIN MOVWF BCDTOBIN_TEMP;
;
XORLW D00
BTFSC STATUS,Z
GOTO BCDTOBINZERO
MOVF BCDTOBIN_TEMP,0 ;检查 是否已经等于00
XORLW D00
BTFSC STATUS,Z
GOTO BCDTOBINZERO
;
DECF BCDTOBIN_TEMP ,1
MOVF BCDTOBIN_TEMP,0 ;检查 是否已经等于00
XORLW D00
BTFSC STATUS,Z
RETURN
;
MOVF BCDTOBIN_X, 0
BCDTOBINLOOP ADDWF BCDTOBIN_X, 1
DECFSZ BCDTOBIN_TEMP,1
GOTO BCDTOBINLOOP
RETURN
BCDTOBINZERO CLRF BCDTOBIN_X
RETURN
;********************** DS1302_WRITE_BYTE 写一个字节程序*****************
; 作用:一次发送一个字节的数据,用于发送1302的
; 控制字或者发送一个数据
;************************************************
;入口参数:DS1302_TIME_TX
;出口参数:无
DS1302_WRITE_BYTE MOVLW D8 ;8位
MOVWF DS1302_BYTE_BITCOUNT
DS1302_WRITE_BYTE_TLOP BCF DS1302_IO ;初始值是低电平
BCF DS1302_SCLK
BTFSC DS1302_TIME_TX,0
BSF DS1302_IO
RRF DS1302_TIME_TX,F
BSF DS1302_SCLK ;上升沿发送数据
DECFSZ DS1302_BYTE_BITCOUNT,F
GOTO DS1302_WRITE_BYTE_TLOP
BCF DS1302_SCLK ;恢复
RETURN
;****************** DS1302_READ_BYTE 读取一字节程序*********************
; 作用:读取1302一个字节的数据
; 原理:在SCLK下降沿接收数据,低字节在前,根据I_O的
; 的电平的高低,采取带进位和不带进位右移.
;***********************************************
;入口参数:无
;出口参数:DS1302_TIME_RX
DS1302_READ_BYTE BSF STATUS,RP0
BSF DS1302_TRISIO ; I_O 设置为输入
BCF STATUS,RP0
MOVLW D8
MOVWF DS1302_BYTE_BITCOUNT ;读取8位
DS1302_READ_BYTE_TR1 BCF DS1302_SCLK ;下降沿读取
BCF STATUS,C
BTFSC DS1302_IO
BSF STATUS,C
RRF DS1302_TIME_RX,F
BSF DS1302_SCLK ;恢复高电平
DECFSZ DS1302_BYTE_BITCOUNT,F
GOTO DS1302_READ_BYTE_TR1
BSF STATUS,RP0
BCF DS1302_TRISIO ;I_O恢复为输出
BCF STATUS,RP0
BCF DS1302_SCLK
NOP
RETURN
;********************** DS1302_INIT 初始化程序******************
; DS1302_INIT
; 作用:初始化1302,写使能寄存器
;********************************************************
;入口参数:无
;出口参数:DS1302_TIME_TX
DS1302_INIT BCF DS1302_SCLK
BCF DS1302_RST ;先禁止
MOVLW B10001110 ;写使能寄存器
MOVWF DS1302_TIME_TX
BSF DS1302_RST ;允许1302工作
CALL DS1302_WRITE_BYTE ;调用写一个数据程序
MOVLW 00H ;允许写使能
MOVWF DS1302_TIME_TX
CALL DS1302_WRITE_BYTE ;发送一个字节的数据
BCF DS1302_RST
RETURN
;********************** DS1302_GET_TIME 读时间程序*************************
; DS1302_GET_TIME
; 作用:一次接受7个字节的时间数据,突发模式读取
; INPUT:NONE
; OUTPUT:把7个时间数据保存在TIME_RX_ADDR开始的7个寄存器里面
;*********************************************************
;入口参数:无
;出口参数:在TIME_RX_ADDR开始的7个寄存器里面
DS1302_GET_TIME MOVLW B10111111 ;多字接读取方式
MOVWF DS1302_TIME_TX
BSF DS1302_RST
CALL DS1302_WRITE_BYTE
MOVLW DS1302_TIME_RX_ADDR ;保存数据的起始地址
MOVWF FSR
MOVLW D7 ;连续读取7个数据
MOVWF DS1302_BUFFER_COUNT
DS1302_GET_TIME_TR2 CALL DS1302_READ_BYTE
MOVF DS1302_TIME_RX,W
MOVWF INDF
INCF FSR,F
DECFSZ DS1302_BUFFER_COUNT,F
GOTO DS1302_GET_TIME_TR2
BCF DS1302_RST
RETURN
;*********************** DS1302_SET_TIME 写时间程序 *************************
; DS1302_SET_TIME
; 作用:一次输入7个数据来一次性的设定时间,同时使能写寄存器
; 突发模式写入,必须写入8个数据,不是7个
; INPUT:要设定的8个数据已经写入到 DS1302_TIME_TX_ADDR 开始的8个字节里面
;********************************************************
;入口参数:20H--27H的8个RAM单元
DS1302_SET_TIME MOVLW B10111110 ;多字节写方式
MOVWF DS1302_TIME_TX
BSF DS1302_RST
CALL DS1302_WRITE_BYTE
MOVLW DS1302_TIME_TX_ADDR ;发送数据的起始地址
MOVWF FSR
MOVLW D7 ;一起发送8个数据
MOVWF DS1302_BUFFER_COUNT
DS1302_SET_TIME_TW1 MOVF INDF,W
MOVWF DS1302_TIME_TX
CALL DS1302_WRITE_BYTE
INCF FSR,F
DECFSZ DS1302_BUFFER_COUNT,F
GOTO DS1302_SET_TIME_TW1
;
MOVLW 00H
MOVWF DS1302_TIME_TX
CALL DS1302_WRITE_BYTE
BCF DS1302_RST
RETURN
; ****************************************
TABLE_LCD1602_LINE1 DE " 09:22:59",0x00
TABLE_LCD1602_LINE2 DE "WWW.YULEMAO.COM",0x00
TABLE_LCD1602_LINEHZ DE "WWW.蚂蚁.COM",0x00
TABLE_LCD1602_TEST DE "蚂蚁"
END