;****************** 读出操作 SPI_READ ****************************
;input:SPI_ADDR
;ooutput:SPI_READ_DATAH, SPI_READ_DATAL
SPI_READ BSF SPI_CS
NOP
NOP
;BSF SSPCON,CKP
MOVLW B00000001
CALL SPI_COMM
;
MOVF SPI_ADDR , W
IORLW B10000000
CALL SPI_COMM
;
;BCF SSPCON,CKP
;
MOVLW 00H
CALL SPI_COMM
MOVWF SPI_READ_DATAH
MOVLW 00H
CALL SPI_COMM
MOVWF SPI_READ_DATAL
NOP
;
BCF SPI_CS ; 锁存命令
NOP
NOP
RETURN
;
;***************** SPI_COMM ****************************
; INOUT : W
; OUTPUT: W
SPI_COMM2 MOVWF SSPBUF
BTFSS PIR1,SSPIF
GOTO $-1
BCF PIR1,SSPIF
MOVF SSPBUF,W
NOP
RETURN
;***************** SPI_COMM ****************************
SPI_COMM MOVWF SSPBUF
SPI_COMM_LP1 BCF STATUS,RP1
BSF STATUS,RP0
BTFSS SSPSTAT,BF
GOTO SPI_COMM_LP1
BCF STATUS,RP0
MOVF SSPBUF,W
NOP
RETURN
;*************** 等待RS232发送完成上一个字节 ********
RS232_CHK_TXFREE BTFSS PIR1,TXIF
GOTO RS232_CHK_TXFREE
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 KEYBOARD_TRIS ;将其设为高四位输出,低四位输入
BCF STATUS,RP0 ;恢复到文件寄存器体0
MOVLW 00H ;4条行线全部输出0
MOVWF KEYBOARD_PORT
NOP ;等待状态稳定下来
NOP
MOVF KEYBOARD_PORT,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 KEYBOARD_TRIS ;改变位低四位输出 高四位输入
BCF STATUS,RP0 ;恢复为文件寄存器体0
MOVF KEYSCAN_VALUE,0 ;读取列码
MOVWF KEYBOARD_PORT ;在经过列线输出
NOP ;等待输出状态稳定下来
NOP
MOVF KEYBOARD_PORT,0 ;读取行线状态
ANDLW 0F0H ;屏蔽掉低四位
IORWF KEYSCAN_VALUE,1 ;将行码和列码组合起来放入VALUE
RETURN ;子程序返回
;
KEYNO MOVLW 0FFH ;建立一个标志值, 表明无键按下
MOVWF KEYSCAN_VALUE ;
RETURN ;子程序返回
;
;********************* 按键动作处理子程序 *********
;入口参数:键值位置码保存在 KEYSCAN_VALUE
;**************************************************
KEYACTION_PROCESS ; 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 15H
MOVWF SPI_ADDR
MOVLW D90
MOVWF SPI_WRITE_DATAH
MOVLW D12
MOVWF SPI_WRITE_DATAL
CALL SPI_WRITE
CALL SOUND_1000HZ
RETURN
;
KEYB7 CALL DISPLAY_EEPROM
RETURN
;
KEYD7 MOVLW 15H
MOVWF SPI_ADDR
MOVLW D12
MOVWF SPI_WRITE_DATAH
MOVLW D34
MOVWF SPI_WRITE_DATAL
CALL SPI_WRITE
CALL SOUND_1000HZ
RETURN
;
KEYE7 MOVLW 15H
MOVWF SPI_ADDR
MOVLW D56
MOVWF SPI_WRITE_DATAH
MOVLW D78
MOVWF SPI_WRITE_DATAL
CALL SPI_WRITE
CALL SOUND_1000HZ
RETURN
; ---------------------
KEY7B
RETURN
;
KEYBB
RETURN
;
KEYDB
RETURN
;
KEYEB
RETURN
; ----------------------------------
KEY7D
RETURN
;
KEYBD
RETURN
;
KEYDD
RETURN
;
KEYED
RETURN
; -----------------
KEY7E CALL LCD12864_CLEAR_P
CALL SOUND_1000HZ
NOP
MOVLW #80H
MOVWF LCD12864_LINE_SHOWADDR
MOVLW LOW(TABLE_LCD12864_LINEDAY)
MOVWF LCD12864_LINE_ADDRL
MOVLW HIGH(TABLE_LCD12864_LINEDAY)
MOVWF LCD12864_LINE_ADDRH
CALL LCD12864_WRITE_LINE_EX
;
MOVLW #90H
MOVWF LCD12864_LINE_SHOWADDR
MOVLW LOW(TABLE_LCD12864_LINESEA)
MOVWF LCD12864_LINE_ADDRL
MOVLW HIGH(TABLE_LCD12864_LINESEA)
MOVWF LCD12864_LINE_ADDRH
CALL LCD12864_WRITE_LINE_EX
;
MOVLW #88H
MOVWF LCD12864_LINE_SHOWADDR
MOVLW LOW(TABLE_LCD12864_LINEEYE)
MOVWF LCD12864_LINE_ADDRL
MOVLW HIGH(TABLE_LCD12864_LINEEYE)
MOVWF LCD12864_LINE_ADDRH
CALL LCD12864_WRITE_LINE_EX
;
MOVLW #98H
MOVWF LCD12864_LINE_SHOWADDR
MOVLW LOW(TABLE_LCD12864_LINEUP)
MOVWF LCD12864_LINE_ADDRL
MOVLW HIGH(TABLE_LCD12864_LINEUP)
MOVWF LCD12864_LINE_ADDRH
CALL LCD12864_WRITE_LINE_EX
;
RETURN
;
KEYBE RETURN
KEYDE RETURN
KEYEE RETURN
; -----------------
RETURN
; ************************ DISPLAY_EEPROM **********************************
;
DISPLAY_EEPROM MOVLW 15H
MOVWF SPI_ADDR
CLRF SPI_READ_DATAH
CLRF SPI_READ_DATAL
CALL SPI_READ
;
CALL RS232_CHK_TXFREE
MOVF SPI_READ_DATAH ,0
MOVWF TXREG
CALL RS232_CHK_TXFREE
MOVF SPI_READ_DATAL ,0
MOVWF TXREG
;
CALL LCD12864_CLEAR_P
MOVLW 92H
MOVWF LCD12864_COM
CALL LCD12864_WRITECOM
;
MOVF SPI_READ_DATAH ,W
MOVWF BIN2ASCII_INBYTE
CALL BIN2ASCII
MOVF BIN2ASCII_MSD,0
MOVWF LCD12864_CODER
CALL LCD12864_WRITECODE
MOVF BIN2ASCII_LSD,0
MOVWF LCD12864_CODER
CALL LCD12864_WRITECODE
;
MOVF SPI_READ_DATAL ,W
MOVWF BIN2ASCII_INBYTE
CALL BIN2ASCII
MOVF BIN2ASCII_MSD,0
MOVWF LCD12864_CODER
CALL LCD12864_WRITECODE
MOVF BIN2ASCII_LSD,0
MOVWF LCD12864_CODER
CALL LCD12864_WRITECODE
;
CALL SOUND_1000HZ
; *************** 读取 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
; ************** LCD12864_WRTITE_LINE **************************
;
LCD12864_WRITE_LINE MOVF LCD12864_LINE_SHOWADDR,0
MOVWF LCD12864_COM
CALL LCD12864_WRITECOM
;
MOVF LCD12864_LINE_ADDRL ,0
MOVWF FLASH_READ_ADDRL
MOVF LCD12864_LINE_ADDRH ,0
MOVWF FLASH_READ_ADDRH
;
LCD12864_WRITE_LINE_LOOP CALL FLASH_READ
MOVF FLASH_READ_DATAL,0
MOVWF LCD12864_CODER
CALL LCD12864_WRITECODE
DECF LCD12864_LINE_LEN
BTFSC STATUS,Z
RETURN
MOVLW 01H
ADDWF FLASH_READ_ADDRL,1
BTFSC STATUS,C
INCF FLASH_READ_ADDRH
GOTO LCD12864_WRITE_LINE_LOOP
RETURN
; ************** LCD12864_WRTITE_LINE_EX **************************
;
LCD12864_WRITE_LINE_EX MOVF LCD12864_LINE_SHOWADDR,0
MOVWF LCD12864_COM
CALL LCD12864_WRITECOM
;
MOVF LCD12864_LINE_ADDRL ,0
MOVWF FLASH_READ_ADDRL
MOVF LCD12864_LINE_ADDRH ,0
MOVWF FLASH_READ_ADDRH
;
LCD12864_WRITE_LINE_EX_LOOP CALL FLASH_READ
MOVLW 00H
ADDWF FLASH_READ_DATAL,W
BTFSC STATUS,Z
RETURN
;
MOVF FLASH_READ_DATAL,0
MOVWF LCD12864_CODER
CALL LCD12864_WRITECODE
;
MOVLW 01H
ADDWF FLASH_READ_ADDRL,1
BTFSC STATUS,C
INCF FLASH_READ_ADDRH
GOTO LCD12864_WRITE_LINE_EX_LOOP
RETURN
;*************** LCD初始化子程序 ****************
LCD12864_INI BCF LCD12864_RST ;复位LCD
CALL DELAY_100MS ;延时一段时间
CALL DELAY_100MS
BSF LCD12864_RST ;清除复位信号
CALL DELAY_100MS
NOP
BSF LCD12864_PSB ;并口通讯
;
BCF LCD12864_RS
BCF LCD12864_RW
BCF LCD12864_E
CALL DELAY_100MS
;
;MOVLW #30H ;基本指令,8-bit 模式,基本指令
MOVLW #20H ;基本指令,4-bit 模式,基本指令
MOVWF LCD12864_COM
CALL LCD12864_WRITECOM_48
CALL DELAY_5MS
;
MOVLW #20H
MOVWF LCD12864_COM
CALL LCD12864_WRITECOM
; ;
MOVlw #0CH ;显示开,游标关,反白关
MOVWF LCD12864_COM
CALL LCD12864_WRITECOM
MOVLW #01H ;清除显示
MOVWF LCD12864_COM
CALL LCD12864_WRITECOM
MOVLW #06H ;进入设定点,游标7 右移,画面不移动
MOVWF LCD12864_COM
CALL LCD12864_WRITECOM
RETURN
;************************送数据到LCD***********************
;写数据子程序 LCD12864_CODER
;RS=1,RW=0,E=高脉冲,D0-D7=数据
;**********************************************************
LCD12864_WRITECODE MOVLW 0FFH
MOVWF PORTD
;
CALL LCD12864_CHKBUSY ;判断总线是否忙
BSF LCD12864_RS
BCF LCD12864_RW
MOVF LCD12864_CODER , 0
MOVWF PORTD ;送出数据
BSF LCD12864_E
NOP
NOP
NOP
NOP
BCF LCD12864_E
NOP
NOP
NOP
NOP
SWAPF PORTD,F
BSF LCD12864_E
NOP
NOP
NOP
NOP
BCF LCD12864_E
NOP
NOP
NOP
NOP
SWAPF PORTD,F
RETURN
;************************送命令到LCD***********************
;写指令子程序 LCD12864_COM
;RS=0,RW=0,E=高脉冲,D0-D7=指令码
;**********************************************************
LCD12864_WRITECOM MOVLW 0FFH
MOVWF PORTD
;
CALL LCD12864_CHKBUSY ;判断总线是否忙
BCF LCD12864_RS
BCF LCD12864_RW
MOVF LCD12864_COM ,0
MOVWF PORTD ;送命令
BSF LCD12864_E
NOP
NOP
NOP
NOP
BCF LCD12864_E
NOP
NOP
NOP
NOP
SWAPF PORTD,F
BSF LCD12864_E
NOP
NOP
NOP
NOP
BCF LCD12864_E
NOP
NOP
NOP
NOP
SWAPF PORTD,F
RETURN
;************************送4线或8线选择命令到LCD***********************
;写指令子程序 LCD12864_WRITECOM_48
;RS=0,RW=0,E=高脉冲,D0-D7=指令码
;**********************************************************
LCD12864_WRITECOM_48 MOVLW 0FFH
MOVWF PORTD
;
BCF LCD12864_RS
BCF LCD12864_RW
MOVF LCD12864_COM ,0
MOVWF PORTD ;送命令
BSF LCD12864_E
NOP
NOP
NOP
NOP
BCF LCD12864_E
NOP
NOP
RETURN
;************************判断LCD总线是否忙********************
;测忙碌子程序
;RS=0,RW=1,E=H,D0-D7=状态字
;**********************************************************
LCD12864_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 LCD12864_RS
BSF LCD12864_RW
LCD12864_CHKBUSY_A CLR_WDT_COM;NOP
NOP
NOP
BSF LCD12864_E
NOP
NOP
NOP
BTFSS PORTD,7 ;D7为高表示总线忙,为低表示总线空闲
GOTO LCD12864_CHKBUSY_B;$+6
NOP
NOP
NOP
BCF LCD12864_E
NOP
NOP
NOP
BSF LCD12864_E
NOP
NOP
NOP
BCF LCD12864_E
GOTO LCD12864_CHKBUSY_A
LCD12864_CHKBUSY_B BCF LCD12864_E
NOP
NOP
NOP
BSF LCD12864_E
NOP
NOP
NOP
BCF LCD12864_E
;BANKSEL TRISD
BSF STATUS,RP0
CLRF TRISD ;恢复D口为输出
BCF STATUS,RP0
CLRF STATUS
RETURN
;
;***********************LCD清屏*******************************
LCD12864_CLEAR_P MOVLW #01H ;清除显示
MOVWF LCD12864_COM
CALL LCD12864_WRITECOM
RETURN
;***************** SOUND_1000HZ 100MS子函数 *****************
SOUND_1000HZ CLR_WDT_COM
NOP
MOVLW D100
MOVWF DELAY_VAR_M
BCF SOUND_OUT
SOUND_1000HZ_1 ; 1 during 500 um
BSF SOUND_OUT
MOVLW D165
MOVWF DELAY_VAR_N
DECFSZ DELAY_VAR_N,1
GOTO $-1
; 0 during 500 um
BCF SOUND_OUT
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 CLR_WDT_COM
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 CLR_WDT_COM
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 CLR_WDT_COM
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 CLR_WDT_COM
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 CLR_WDT_COM
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
;**************** 专门给中断程序调用的处理子程序 BIN2BCD_BYINT ******************
;目的是减少中断保护现场的处理时间,以减少引起定时误差的环节
;
BIN2BCD_BYINT CLRF BIN2BCD_BYINT_MSD
MOVWF BIN2BCD_BYINT_LSD
BIN2BCD_BYINT_GTENTH MOVLW .10
SUBWF BIN2BCD_BYINT_LSD,W
BTFSS STATUS, C ;CARRY
RETURN
MOVWF BIN2BCD_BYINT_LSD
INCF BIN2BCD_BYINT_MSD
GOTO BIN2BCD_BYINT_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
;
; ******* (0-9)单个十六进制数字转ASCII码值 **************************
; 入口参数 NUM2ASCII_INBYTE 只运算低四位
; 出口参数 NUM2ASCII_INBYTE
;********************************************
NUM2ASCII ;BCF NUM2ASCII_INBYTE,7
;BCF NUM2ASCII_INBYTE,6
;BCF NUM2ASCII_INBYTE,5
;BCF NUM2ASCII_INBYTE,4
MOVLW B00001111
ANDWF NUM2ASCII_INBYTE,F
;
MOVLW D10
SUBWF NUM2ASCII_INBYTE,W
BTFSS STATUS,C
GOTO NUM2ASCII_A48
MOVLW D55
ADDWF NUM2ASCII_INBYTE,1
RETURN
NUM2ASCII_A48 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
; ***************************************
;
TABLE_LCD12864_LINE1 DE "EEPROM TEST",0x00
TABLE_LCD12864_LINEOK DE "写入完成6789",0x00
TABLE_LCD12864_LINETEST DE "哈哈测试LCD 显示",0x00
TABLE_LCD12864_LINEDAY DE "白日依山尽,",0x00
TABLE_LCD12864_LINESEA DE "黄河入海流。",0x00
TABLE_LCD12864_LINEEYE DE "欲穷千里目,",0x00
TABLE_LCD12864_LINEUP DE "更上一层楼。",0x00
;*************************************
;ORG 0D00H ; PAGE 1
;BCF PCLATH,4
;BCF PCLATH,3
;GOTO WAITING_WDT
;
;ORG 1300H ; PAGE 2
;BCF PCLATH,4
;BCF PCLATH,3
;GOTO WAITING_WDT
;
;ORG 1D00H ; PAGE 3
;BCF PCLATH,4
;BCF PCLATH,3
;GOTO WAITING_WDT
;
;ORG 1FF0H ; END
;BCF PCLATH,4
;BCF PCLATH,3
;GOTO WAITING_WDT
END