INCLUDE<P16F877.INC>
#INCLUDE"MAIN.INC"
#INCLUDE"LEDSN.INC"
#INCLUDE"DEL.INC"
#INCLUDE"KEYS.INC"
#INCLUDE"EEPROM.INC"
EADR EQU 31H
COUNT EQU 32H
ORG 00H
NOP
MAIN:
CALL MAINIT
MLP:
CALL DEL
BTFSS 2FH,0
GOTO MLP
CALL KEYS
CALL DISP
BCF 2FH,0
GOTO MLP
DELA
LEDNS
KEYFS
KEYSA
EPFLASH
KEYS:
MOVF KID,0
ADDWF PCL,1
KTAB:GOTO KEYEN
GOTO KEYDEL
GOTO KEYSCAN
GOTO KEYUP
GOTO KEYPROC
CLRF KID
RETLW 0
KEYPROC:
CLRF KID
MOVLW 0AH
SUBWF VAL,0
BTFSS STATUS,C
GOTO KEYNUM
ADDWF PCL,F
GOTO KEYA ;读数据并比较
GOTO KEYB ;清0
GOTO KEYC ;修改地址
GOTO KEYD ;写入新数据
GOTO KEYE ;--
GOTO KEYF ;--
CLRF VAL
RETLW 0
KEYA: ;AFUN
; MOVLW 0AH
; MOVWF DAT1
BTFSC 2FH,3
GOTO KAEXT
MOVLW DAT1
MOVWF FSR
MOVLW 6
MOVWF R0
KAL:CALL EPREAD
MOVF DAT,W
XORWF INDF,W
BNZ KAEXT
INCF ADR,F
DECFSZ R0,F
GOTO KAL
BSF 2EH,0
KAEXT:
RETLW 0
KEYB: ;BFUN
; MOVLW 0BH
; MOVWF DAT1
MOVLW 6
MOVWF R0
MOVLW DAT1
MOVWF FSR
CLRW
KBL:CLRF INDF
;MOVWF INDF,1
INCF FSR,F
DECFSZ R0,1
GOTO KBL
RETLW 0
KEYC: ;CFUN
; MOVLW 0CH
; MOVWF DAT1
BSF 2EH,1
MOVF EADR,0
MOVWF ADR
CALL EPREAD
XORLW .200
BNZ KCEXT
; CLRF EADR
MOVLW 7
ADDWF EADR,F
ADDWF ADR,F
KCEXT:
RETLW 0
KEYD:
; MOVLW 0DH
; MOVWF DAT1
BTFSS 2EH,1
GOTO KCEXT
MOVLW DAT1
MOVWF FSR
MOVLW 6
MOVWF R0
KDL:MOVF INDF,0
MOVWF DAT
CALL EPWRITE
INCF FSR,F
INCF ADR,F
DECFSZ R0,F
GOTO KDL
MOVF EADR,0
MOVWF ADR
MOVF COUNT,W
MOVWF DAT
CALL EPWRITE
INCF COUNT,F
BCF 2EH,1
RETLW 0
KEYE:
RETLW 0
KEYF:
RETLW 0
KEYNUM:
MOVLW DAT1
MOVWF FSR
MOVLW 2
MOVWF R1
MOVF VAL,0
MOVWF R0
KPL:
MOVF INDF,0
MOVWF KTMP
MOVF R0,0
MOVWF INDF
INCF FSR,1
MOVF INDF,0
MOVWF R0
MOVF KTMP,0
MOVWF INDF
INCF FSR,1
DECFSZ R1,1
GOTO KPL
KNEXT:
RETLW 0
MAINIT:
BANK1
MOVLW 0FH
MOVWF TD
CLRF TC
CLRF TB
BANK0
CLRF ADR
CLRF DAT
CLRF COUNT
MOVLW 7
MOVWF EADR
MOVLW 04H
MOVWF DAT1
MOVLW 6H
MOVWF DAT2
CLRF DAT3
CLRF DAT4
MOVLW 0FFH
MOVWF PB
MOVLW 0FFH
MOVWF PC
RETLW 0
END
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
;功能:数码管显示N位数
;初始化:POUT=PDIG=0XFF
;输入:LEDS=1 DAT1为要显示的数
; LEDS=2 DAT1,DAT2为要显示的数
; LEDS=3 DAT1,DAT2,DAT3为要显示的数
; LEDS=4或5 4<=N<=8 DAT1[N]为要显示的数
;应用:改变LEDS 的赋值可选择编译调用不同的程序
;DEFINE LEDS 1
;在主程序文件中加入LEDNS宏
;在主程序中直接调用DISP
;**********************************
POUT EQU PB
PDIG EQU PC
;DAT1 EQU VAL
;NBYT 为4,5子程序用
;NBYT为要显示的位数
#DEFINE NBYT 6
;LEDS 为要调用的显示程序
#DEFINE LEDS 4
;#DEFINE LEDAC 2
IF LEDS==3||4
DID EQU 29H
ENDIF
IF LEDS==5
DID EQU 29H
DIG EQU 28H
ENDIF
;************************
IF LEDS==1
LEDNS MACRO
;1BYTE LED DISPLAY
;功能:数码管显示1位数
;初始化:POUT=PDIG=0XFF
;输入:DAT1为要显示的数
;应用:在程序中声明
;DEFINE LEDS 1
;在主程序文件中加入LEDNS宏
;在主程序中直接调用DISP
DISP:
MOVF DAT1,0
CALL TAB
MOVWF POUT
; MOVLW 02H
; MOVWF PDIG
COMF POUT,1 ;共阴极,共阳可略
BCF PDIG,0
RETLW 0
LEDTAB
ENDM
ENDIF
;**********************
IF LEDS==2
LEDNS MACRO
;2BYTE LED DISPLAY
;功能:数码管显示2位数
;初始化:POUT=PDIG=0XFF
;输入:DAT1,DAT2为要显示的数
;应用:在程序中声明
;DEFINE LEDS 2
;在主程序文件中加入LEDNS宏
;在主程序中直接调用DISP
DISP:
MOVLW 0FFH
MOVWF POUT
BTFSC PDIG,1
GOTO DPS1
MOVF DAT1,0
CALL TAB
MOVWF POUT
COMF POUT,1
BCF PDIG,0
BSF PDIG,1
RETLW 0
DPS1:MOVF DAT2,0
CALL TAB
MOVWF POUT
COMF POUT,1
BSF PDIG,0
BCF PDIG,1
RETLW 0
LEDTAB
ENDM
ENDIF
;**********************
IF LEDS==3
LEDNS MACRO
;功能:数码管显示3位数
;初始化:POUT=PDIG=0XFF
; DID=0
;输入:DAT1,DAT2为要显示的数
;应用:在程序中声明
;DEFINE LEDS 3
;在主程序文件中加入LEDNS宏
;在主程序中直接调用DISP
DISP: ; 3-4BYTE
MOVLW 0H
MOVWF POUT
MOVF DID,0
ADDWF PCL,1
DSP:GOTO DSP1
GOTO DSP2
GOTO DSP3
CLRF DID
RETLW 0
DSP1:
MOVF DAT1,0
CALL TAB
MOVWF POUT
COMF POUT,1
MOVLW 0FEH
MOVWF PDIG
INCF DID,1
RETLW 0
DSP2:MOVF DAT2,0
CALL TAB
MOVWF POUT
COMF POUT,1
SETC
RLF PDIG,1
INCF DID,1
RETLW 0
DSP3:MOVF DAT3,0
CALL TAB
MOVWF POUT
COMF POUT,1
SETC
RLF PDIG,1
INCF DID,1
RETLW 0
LEDTAB
ENDM
ENDIF
;************************
IF LEDS==4
LEDNS MACRO
;功能:数码管显示N位数
;初始化:POUT=PDIG=0XFF
; DID=0
;输入:DAT1[N]为要显示的数
;应用:在程序中声明
;DEFINE NBYT N 4<=NBYT<=8
;DEFINE LEDS 4
;在主程序文件中加入LEDNS宏
;在主程序中直接调用DISP
DISP:MOVF DID,0
XORLW NBYT
BTFSS STATUS,Z
GOTO DNEX
CLRF DID
MOVLW 0FEH
MOVWF PDIG
DNEX:
MOVF DID,0
BZ DNEX1
SETC
RLF PDIG,1
DNEX1:MOVLW DAT1
MOVWF FSR
MOVF DID,0
ADDWF FSR,1
MOVF INDF,0
CALL TAB
MOVWF POUT
COMF POUT,1
INCF DID,1
RETLW 0
LEDTAB
ENDM
ENDIF
;************************
IF LEDS==5
LEDNS MACRO
;功能:数码管显示N位数,同上
;初始化:POUT=PDIG=0XFF
; DID=0 ,DIG=0XFE
;输入:DAT1[N]为要显示的数
;应用:在程序中声明
;DEFINE NBYT N N位要显示的数
;DEFINE LEDS N 5
;在主程序文件中加入LEDNS宏
;在主程序中直接调用DISP
DISP:
MOVLW 0H
MOVWF POUT
MOVLW DAT1
MOVWF FSR
MOVF DID,0
ADDWF FSR,1
DSLP:MOVF INDF,0
CALL TAB
MOVWF POUT
COMF POUT,1
MOVF DIG,0
MOVWF PDIG
SETC
RLF DIG,1
DSEXT:
INCF DID,1
MOVF DID,0
XORLW NBYT
BTFSS STATUS,Z
RETLW 0
CLRF DID
MOVLW 0FEH
MOVWF DIG
RETLW 0
LEDTAB
ENDM
ENDIF
LEDTAB MACRO
TAB:;ANDLW 0FH
ADDWF PCL
TAB1:RETLW 0XC0 ;0
RETLW 0XF9 ;
RETLW 0XA4
RETLW 0XB0
RETLW 0X99
RETLW 0X92
RETLW 0X82
RETLW 0XF8
RETLW 0X80
RETLW 0X90
RETLW 0X88
RETLW 0X83
RETLW 0XC6
RETLW 0XA1
RETLW 0X86
RETLW 0X8E ;F
RETLW 0XBF ;- 10H
RETLW 0X89 ;H 11H
RETLW 0X8F ;K
RETLW 0XC7 ;L
RETLW 0XAB ;N 14H
RETLW 0X8C ;P
RETLW 0X0
ENDM
一周热门 更多>