📄 drv.asm
字号:
XS_DRV_SC
IF USE_595==0
CLRF DCOM ;清位码
MOVF DS_S1,W
MOVWF DOUT ;段码输出
MOVF DS_S2,W
MOVWF DCOM ;位码输出
RETURN
ENDIF
;******************************************************************************
IF USE_595
;驱动595,显示
DR_595 MOVLW D'16'
MOVWF DS_CNT ;16位数据
BCF DSTR
DS_RATE
BCF DSSK ;CLR CLK
BTFSS DS_S1,0
BCF DSSE
BTFSC DS_S1,0
BSF DSSE ;SET DATA
CALL DS_DEL
BSF DSSK ;SLK-->1
CALL DS_DEL
BCF STATUS,C
RRF DS_S2,1
RRF DS_S1,1 ;指向下一位
DECFSZ DS_CNT,1
GOTO DS_RATE
BSF DSTR
CALL DS_DEL ;数据输出有效
CALL DS_DEL
BCF DSTR
RETURN
;*************************************************************************************
DS_DEL NOP ;中间延时
NOP
NOP
RETURN
ENDIF
;**************************************************************************************
;******************************************************
IF USE_EEROM
;读93C46
RD_EE_BYTE
CALL EE_BEG_B ;发送起始位
MOVLW 80H
ADDWF EE_ADD ,0 ;6位地址加上两位操作码,10XXXXXX 读指令
CALL SDT46 ;写入操作码与地址
CALL RDT46 ;读低位地址
MOVWF PAR_VAL ;存入EE_VAH
CALL RDT46 ;读高位地址
MOVWF PAR_VAH ;存入EE_VAL
GOTO EX9346
;**************************
;写93C46
WR_EE_BYTE
CALL EE_BEG_B ;发送起始位
MOVLW 40H
ADDWF EE_ADD ,0 ;6位地址加上两位操作码01XXXXXX 写指令
CALL SDT46 ;写入操作码及地址
MOVF PAR_VAL,0 ;载入数据
CALL SDT46 ;写入数据
MOVF PAR_VAH,0 ;载入数据
CALL SDT46 ;写入数据
GOTO EX9346
;******************************
SEWEN
CALL EE_BEG_B
MOVLW 30H ;写入操作码0011XXXX 写使能指令
CALL SDT46
GOTO EX9346
;******************************
SEWDS
CALL EE_BEG_B
MOVLW 00H ;写入0000XXXX写禁止指令
CALL SDT46
;******************************
EX9346
BCF EECS ;结束时清CS为0
CALL DELAY
RETURN
;******************************
SDT46:
MOVWF EE_SER ;将要写的数据送EE_SER
MOVLW 08H ;写入8位数据
MOVWF EE_CNT
SD1:
RLF EE_SER ,1
BSF EEDI
BTFSS STATUS ,C
BCF EEDI ;设置数据线
BSF EESK
CALL DELAY
BCF EESK
CALL DELAY ;CLK 上跳
DECFSZ EE_CNT ,1
GOTO SD1
RETURN
;******************************
RDT46
MOVLW 08H ;读出8位数据
MOVWF EE_CNT
RD1
BSF EESK
CALL DELAY
BCF EESK
CALL DELAY
BSF STATUS ,C
BTFSS EEDO ;读数据线
BCF STATUS ,C
RLF EE_SER,1
DECFSZ EE_CNT ,1
GOTO RD1
MOVF EE_SER,W ;读得的数据送W
RETURN
;********************************
DELAY
MOVLW 0FFH ;CLK时序廷时
MOVWF EE_CON
DECFSZ EE_CON ,1
GOTO $-1
RETURN
;*****************************************************************************************
EE_BEG_B
BSF EECS ;写入起始位1
BSF EEDI ;data--1
BSF EESK ;CLK 上跳
CALL DELAY
BCF EESK ;CLK 下跳
CALL DELAY
RETURN
ENDIF
IF USE_H2D==0
HEXTOBCD
CLRF DS_S2
CLRF DS_S1
BH2D MOVWF DS_S1
MOVLW D'10'
SUBWF DS_S1,W
BTFSS STATUS,C
RETURN
INCF DS_S2,1
GOTO BH2D
ENDIF
IF USE_H2D
;*******************************************************************************************
;双字节16进制转换成10进制
;本程序实现双字节二进制数转化为3字节压缩BCD码。
;入口参数:W所指向的2个单元。
;出口参数:W所指向的2个单元。
HEXTOBCD
MOVWF FSR ;数据起始地址
MOVF INDF,W
MOVWF 60H
INCF FSR,1
MOVF INDF,W
MOVWF 61H ;取需要转换的数据
MOVLW 60H
MOVWF FSR
CLRF 64H
CLRF 63H
CLRF 62H
BCF STATUS,C
MOVLW .16
MOVWF 65H
LOOPC1 RLF 60H,F
RLF 61H,F
RLF 64H,F
RLF 63H,F
RLF 62H,F
DECFSZ 65H,F
GOTO ADJDEC1
RETLW 63H ;整个子程序结束
ADJDEC1 MOVLW 64H
MOVWF FSR
CALL ADJBCD1 ;调整RLT
MOVLW 63H
MOVWF FSR
CALL ADJBCD1 ;调整RLTH
MOVLW 62H
MOVWF FSR
CALL ADJBCD1 ;调整TEMP1
GOTO LOOPC1
;********************调整BCD********************
ADJBCD1 MOVLW 03H
ADDWF INDF,W ;低四位加3
MOVWF 66H ;暂存
BTFSC 66H,3 ;结果大于7,
MOVWF INDF ;则存起来
MOVLW 30H
ADDWF INDF,W ;高四位加3
MOVWF 66H
BTFSC 66H,7 ;结果大于7,
MOVWF INDF ;则存起来
RETLW 0
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -