Code:
'-------------------------------------------------------------------------------
'PIC used: 18F2620
'Pinout
' ---------
' E.3 = 1 28 B.7 =
' A.0 = 2 27 B.6 =
' A.1 = 3 26 B.5 =
' A.2 = 4 25 B.4 = LED
' A.3 = 5 24 B.3 =
' A.4 = 6 23 B.2 =
' A.5 = 7 22 B.1 = CLK
' Gnd 8 21 B.0 = DIO
' A.7 = 9 20 +5V
' A.6 = 10 19 Gnd
' C.0 = 11 18 C.7 =
' C.1 = 12 17 C.6 =
' C.2 = 13 16 C.5 =
' C.3 = 14 15 C.4 =
' ---------
'-------------------------------------------------------------------------------
#CONFIG
CONFIG OSC = INTIO67 ; CONFIG FOSC = INTIO67
CONFIG FCMEN = OFF
CONFIG IESO = OFF
CONFIG PWRT = OFF
CONFIG BOREN = SBORDIS
CONFIG BORV = 2 ; CONFIG BORV = 18
CONFIG WDT = ON ; CONFIG WDTEN = ON
CONFIG WDTPS = 512
CONFIG CCP2MX = PORTC
CONFIG PBADEN = OFF
CONFIG LPT1OSC = OFF
; CONFIG HFOFST = ON ;Not applicable to 18F2620
CONFIG MCLRE = ON
CONFIG STVREN = ON
CONFIG LVP = OFF
CONFIG XINST = OFF
CONFIG DEBUG = OFF
CONFIG CP0 = OFF
CONFIG CP1 = OFF
CONFIG CP2 = OFF
CONFIG CP3 = OFF
CONFIG CPB = OFF
CONFIG CPD = OFF
CONFIG WRT0 = OFF
CONFIG WRT1 = OFF
CONFIG WRT2 = OFF
CONFIG WRT3 = OFF
CONFIG WRTC = OFF
CONFIG WRTB = OFF
CONFIG WRTD = OFF
CONFIG EBTR0 = OFF
CONFIG EBTR1 = OFF
CONFIG EBTR2 = OFF
CONFIG EBTR3 = OFF
CONFIG EBTRB = OFF
#ENDCONFIG
OSCCON = $60 '4 mhz
OSCTUNE.6 = 1 'PLL Enabled
DEFINE OSC 16 '16MHz (4X4 = 16)
TRISB.4=0
' ANSELH=0 'Not applicable to 18F2620
ADCON1 = 15 'Disable ADC
LED VAR PORTB.4 ' Assign name "LED" to
USERCOMMAND "DISPLED" ; BUFFER{,COLON }
USERCOMMAND "STRLEN" ; BUFFER
USERCOMMAND "RJUSTBUFF" ; BUFFER
TM_BIT VAR BYTE BANK0
TM_DAT VAR BYTE BANK0
TM_NAK VAR BYTE BANK0 ;set to $80 if tx error occured
TM_DIG VAR BYTE BANK0
TM_BRIGHT VAR BYTE BANK0 ;display pwm level 0 to 7
TM_COLON VAR BYTE BANK0 ;display colon 0/1
TM_TMP VAR BYTE[2] BANK0
str_len VAR BYTE BANK0
CMD_AUTO_ADDR CON $40
START_ADDR CON $c0
NUM_DIGITS CON 4 ;number of 7seg leds
COLON_FLAG CON $80
DISPLAY_ON CON $88
;tm1637 DIO AND CLK NEED TO BE ON SAME PORT
@TM_OUT_PORT = LATB ;TM_DIO OUT
@TM_IN_PORT = PORTB ;TM_DIO IN
@TM_CLK = 1 ;PIN
@TM_DIO = 0 ;PIN
@TM_TRIS = TRISB
BLINK VAR BYTE
LEDBUFF VAR BYTE[NUM_DIGITS +1]
COUNTER VAR BYTE
GOTO OVERASM
ASM
DISPLED?B macro BUFFER
movlw low BUFFER
movwf FSR0L
movlw high BUFFER
movwf FSR0H
L?CALL _TM_DISP4
endm
DISPLED?BC macro BUFFER ,COLON
movlw low BUFFER
movwf FSR0L
movlw high BUFFER
movwf FSR0H
MOVE?CB COLON ,_TM_COLON
L?CALL _TM_DISP4
endm
DISPLED?BB macro BUFFER ,COLON
movlw low BUFFER
movwf FSR0L
movlw high BUFFER
movwf FSR0H
MOVE?BB COLON ,_TM_COLON
L?CALL _TM_DISP4
endm
STRLEN?B macro BUF
MOVE?CB high BUF, FSR0H ;load highbyte
MOVE?CB low BUF, FSR0L ;load low byte
L?CALL STRlen
endm
RJUSTBUFF?B macro BUF
MOVE?CB high BUF, FSR0H ;load highbyte
MOVE?CB low BUF, FSR0L ;load low byte
MOVE?CB low BUF, _TM_TMP ;load low byte
MOVE?CB HIGH BUF, _TM_TMP+1 ;load low byte
L?CALL STRlen
L?CALL _strpad
endm
STRlen ;get buffer usage size
CLRF _str_len
str_tok_chr
;MOVIW FSR0 ++ ; Get character
MOVF INDF0,W
INFSNZ FSR0L
incf FSR0H
btfsC STATUS,Z
goto exit_str_null ; EXIT ON Null char
INCF _str_len,F ; not null so increment index
goto str_tok_chr
exit_str_null
return
_strpad ;right justify by padding with spaces " "
BANKSEL 0
MOVLW 5
;ADDWF _str_field_size,w ;buffer size
subwf _str_len,f ;tx string size
btfsc STATUS, C ;tx string size gotcha
goto expd ;if positive difference then exit buffer overrun will occur ;tx string size gotcha
comf _str_len ;the difference is number of spaces to SHIFT in
btfsc STATUS, Z
goto expd ;if zero difference then exit
moVLW 4 ;buffer size
addwf _TM_TMP,f ;add NUM_DIGITS to addr of buffer
;btfsc STATUS, C
;INCF _STR_TMP+1,f
nxpd
movf _TM_TMP,w ;low (addr of buffer + NUM_DIGITS )
MOVWF FSR0L
movwf FSR1L
DECF FSR0L,F ;offset pointer 0
;btfsc STATUS, C
;DECF FSR0H,F
movf _TM_TMP+1,w ;high (addr of buffer + NUM_DIGITS )
MOVWF FSR0H
movwf FSR1H
MOVLW 4
movwf _TM_BIT
nxby ;buffer shift right x 1
ifdef TBLPTRL ;fsr
movf POSTDEC0, W ;[pic18]
MOVWF POSTDEC1
else
MOVIW FSR0 --
MOVWI FSR1 --
endif
DECFSZ _TM_BIT,F
GOTO nxby
movlw 0x20
ifdef TBLPTRL ;fsr
MOVWF POSTDEC1
else
MOVWI FSR1 --
endif
DECFSZ _str_len,F ;need another one ?
goto nxpd
expd ;nah!
BANKSEL 0
return
SEG_val
CHK?RP _TM_TMP
MOVWF _TM_TMP
CLRF _TM_TMP +1
SUBLW 0x21
btfsc STATUS, C
retlw 0 ;" "
MOVF _TM_TMP,W
SUBLW 0x2f
btfsc STATUS, C
retlw 64 ;"-"
MOVF _TM_TMP,W
MOVLW 0X40
SUBWF _TM_TMP,W
btfsC STATUS, C
GOTO TM_ALPHA
MOVF _TM_TMP,W
ANDLW 0X0F
GOTO TM_LU
TM_ALPHA
ANDLW 0xdf ;ucase
SUBLW 6
btfsS STATUS, C
retlw 0 ;ERROR
MOVLW 0X37
SUBWF _TM_TMP,W
ANDLW 0xdf ;ucase
TM_LU
addlw LOW TABLE_START
movwf TBLPTRL
rlcf _TM_TMP +1 ,w
addlw HIGH TABLE_START
movwf TBLPTRH
movlw UPPER TABLE_START
movwf TBLPTRU
tblrd *+
movf TABLAT,w
return
TABLE_START
db 0X3F,6,0X5B,0X4F,0X66,0X6D,0X7D,7,0X7F,0X67,0X77 ,0X7C ,0X39 ,0X5E ,0X79 ,0X71
TM_START
CHK?RP TM_OUT_PORT
BSF TM_OUT_PORT,TM_CLK
BSF TM_OUT_PORT,TM_DIO
NOP
BCF TM_OUT_PORT,TM_DIO
NOP
BCF TM_OUT_PORT,TM_CLK
NOP
RETURN
TM_STOP
CHK?RP TM_OUT_PORT
BCF TM_OUT_PORT,TM_CLK
BCF TM_OUT_PORT,TM_DIO
NOP
BSF TM_OUT_PORT,TM_CLK
NOP
BSF TM_OUT_PORT,TM_DIO
NOP
RETURN
TM_WRITE
MOVLW 8
CHK?RP _TM_BIT
MOVWF _TM_BIT
NXBT
CHK?RP TM_OUT_PORT
BCF TM_OUT_PORT,TM_CLK
CHK?RP _TM_DAT
BTFSS _TM_DAT,0
GOTO TM_0
CHK?RP TM_OUT_PORT
BSF TM_OUT_PORT,TM_DIO
GOTO TM_NB
TM_0
CHK?RP TM_OUT_PORT
BCF TM_OUT_PORT,TM_DIO
TM_NB
CHK?RP _TM_DAT
RRCF _TM_DAT,F
CHK?RP TM_OUT_PORT
BSF TM_OUT_PORT,TM_CLK
CHK?RP _TM_BIT
DECFSZ _TM_BIT,F
GOTO NXBT
CHK?RP TM_OUT_PORT
BCF TM_OUT_PORT,TM_CLK
CHK?RP TM_TRIS
BSF TM_TRIS,TM_DIO
CHK?RP TM_IN_PORT
BTFSC TM_IN_PORT,TM_DIO
BSF _TM_NAK,7
CHK?RP TM_OUT_PORT
BSF TM_OUT_PORT,TM_CLK
NOP
NOP
NOP
NOP
BCF TM_OUT_PORT,TM_CLK
CHK?RP TM_TRIS
BCF TM_TRIS ,TM_DIO
RST?RP
RETURN
_TM_INIT
CHK?RP _TM_COLON
CLRF _TM_COLON
CLRF _TM_BRIGHT
CHK?RP TM_TRIS
BCF TM_TRIS ,TM_DIO
BCF TM_TRIS ,TM_CLK
RST?RP
RETURN
_TM_DISP4
MOVLW _CMD_AUTO_ADDR
CHK?RP _TM_DAT
MOVWF _TM_DAT
CLRF _TM_NAK
CALL TM_START
CALL TM_WRITE
CALL TM_STOP
MOVLW _NUM_DIGITS
CHK?RP _TM_DIG
MOVWF _TM_DIG
MOVLW _START_ADDR
CHK?RP _TM_DAT
MOVWF _TM_DAT
CALL TM_START
CALL TM_WRITE
NXDIG
;MOVIW FSR0 ++
MOVF INDF0,W
INFSNZ FSR0L
incf FSR0H
CALL SEG_val
CHK?RP _TM_DAT
IORWF _TM_COLON ,W
movwf _TM_DAT
CALL TM_WRITE
CHK?RP _TM_DIG
DECFSZ _TM_DIG,F
GOTO NXDIG
CALL TM_STOP
CHK?RP _TM_BRIGHT
MOVF _TM_BRIGHT ,W
ANDLW 7
IORLW _DISPLAY_ON
CHK?RP _TM_DAT
MOVWF _TM_DAT
CALL TM_START
CALL TM_WRITE
CALL TM_STOP
RST?RP
RETURN
_TM_DISP1 ; WRITES TO A DISP POSN TM_TMP HOLDS DATA FOR TM_DIG IS POSN 0-3
CHK?RP _TM_DAT
MOVLW _CMD_AUTO_ADDR
MOVWF _TM_DAT
CALL TM_START
CALL TM_WRITE
CALL TM_STOP
MOVLW _START_ADDR
addwf _TM_DIG,W
CHK?RP _TM_DAT
MOVWF _TM_DAT
CALL TM_START
CALL TM_WRITE
CHK?RP _TM_TMP
MOVF _TM_TMP,W
movwf _TM_DAT
CALL TM_WRITE
CALL TM_STOP
BANKSEL 0
RETURN
ENDASM
OVERASM:
FOR COUNTER=0 TO 3
TOGGLE LED
PAUSE 500
next
CALL TM_INIT
BLINK=0
ALOOP:
TOGGLE LED
TM_BRIGHT=TM_BRIGHT-1
if TM_BRIGHT>7 then TM_BRIGHT=7
ARRAYWRITE LEDBUFF ,["B- ",#TM_BRIGHT]
DISPLED LEDBUFF,0
PAUSE 500
FOR COUNTER=0 TO 255
ARRAYWRITE LEDBUFF ,[hex COUNTER,0]
RJUSTBUFF LEDBUFF
DISPLED LEDBUFF,0
PAUSE 50
NEXT
FOR COUNTER=0 TO 255
IF !(COUNTER//20) THEN BLINK = TM_COLON ^ $80
ARRAYWRITE LEDBUFF ,[sdec COUNTER,0]
RJUSTBUFF LEDBUFF
DISPLED LEDBUFF,BLINK
PAUSE 50
NEXT
goto ALOOP
Bookmarks