Code:
;----[16F88 Hardware Configuration]---------------------------------------------
#IF __PROCESSOR__ = "16F88"
#DEFINE MCU_FOUND 1
#CONFIG
cfg1 = _INTRC_IO ; INTRC oscillator; port I/O function on both RA6/OSC2/CLKO pin and RA7/OSC1/CLKI pin
cfg1&= _WDT_OFF ; WDT disabled
cfg1&= _PWRTE_OFF ; PWRT disabled
cfg1&= _MCLR_ON ; RA5/MCLR/VPP pin function is MCLR
cfg1&= _BODEN_OFF ; BOR disabled
cfg1&= _LVP_OFF ; RB3 is digital I/O, HV on MCLR must be used for programming
cfg1&= _CPD_OFF ; Code protection off
cfg1&= _WRT_PROTECT_OFF ; Write protection off
cfg1&= _DEBUG_OFF ; In-Circuit Debugger disabled, RB6 and RB7 are general purpose I/O pins
cfg1&= _CCP1_RB0 ; CCP1 function on RB0
cfg1&= _CP_OFF ; Code protection off
__CONFIG _CONFIG1, cfg1
cfg2 = _FCMEN_ON ; Fail-Safe Clock Monitor enabled
cfg2&= _IESO_ON ; Internal External Switchover mode enabled
__CONFIG _CONFIG2, cfg2
#ENDCONFIG
#ENDIF
;----[Verify Configs have been specified for Selected Processor]----------------
; Note: Only include this routine once, after all #CONFIG blocks
#IFNDEF MCU_FOUND
#ERROR "No CONFIGs found for [" + __PROCESSOR__ +"]"
#ENDIF
INCLUDE "Elapsed.bas"
'=============================== MCU SETUP =====================================
DEFINE OSC 8 ' define fosc
define I2C_HOLD 1 ' define I2C type
TrisB = %00000000 ' Set all port B pins as outputs
TrisA = %00001100 ' Set portA.2 & portA.3 as inputs
CMCON = 7 ' Turn Off Comparators
ADCON1 = 7 ' Disable A/D converter
ANSEL = %00000000 ' set all analog pins to digital
OSCCON = %01110000 ' Set PIC16F88 to 8 MHz = %01110000
' or set to 4 MHz = %01100000
'===============================================================================
LED var PortB.3
SDA var PortA.2 ' I2C Data PortA.2
SCL var PortA.3 ' I2C Clock PortA.3
Res var PortB.0
'===============================================================================
False con 0
True con 1
Flag_Text var bit
I2CDevice var byte
LENGTH VAR BYTE[2]
DC VAR Byte ' DATA OR COMMAND: $40=DATA or $0=COMMAND
LCD_DATA VAR BYTE
COM VAR BYTE ' COMMAND
PAGE VAR BYTE ' LCD PAGE(B0 TO B7)
I VAR BYTE
J VAR BYTE
X VAR BYTE ' LCD POSITION X(0 TO 127)
Y VAR BYTE ' LCD POSITION Y(0 TO 7)
say var byte ' counter
text_reg var byte ' index for text
letter_reg var byte ' data carrier for text chars
letter_count var byte ' count of letters in your text
Text_Buff var byte[27]
Text_String var byte
Old_Seconds var byte
Counter var word
charset var word ' Char codes index
chartmp var word ' char codes index temp
letter_temp var word ' working copy
'===============================================================================
CLEAR
I2CDevice = $78 ' Display = $78 (SA0 pin = 0)
DC = $00 ' value for commands
for I = 0 to 10
pause 100
led = !Led
next I
led = 0
'====================== lcd initialization for (SH1106 & SSD1306 driver) ===========================
INIT:
I2CWrite SDA,SCL,I2CDevice,[DC,$AE] ' Display Off
I2CWrite SDA,SCL,DC,I2CDevice,[$20]
I2CWrite SDA,SCL,I2CDevice,[DC,$10]
I2CWrite SDA,SCL,I2CDevice,[DC,$B0]
I2CWrite SDA,SCL,I2CDevice,[DC,$C8]
I2CWrite SDA,SCL,I2CDevice,[DC,$00]
I2CWrite SDA,SCL,I2CDevice,[DC,$10]
I2CWrite SDA,SCL,I2CDevice,[DC,$40]
i2cwrite sda,scl,I2CDevice,[DC,$81]
i2cwrite sda,scl,I2CDevice,[DC,$7F]
i2cwrite sda,scl,I2CDevice,[DC,$A1]
i2cwrite sda,scl,I2CDevice,[DC,$A6]
I2CWrite SDA,SCL,I2CDevice,[DC,$A8]
I2CWrite SDA,SCL,I2CDevice,[DC,$3F]
I2CWrite SDA,SCL,I2CDevice,[DC,$A4]
I2CWrite SDA,SCL,I2CDevice,[DC,$D3]
I2CWrite SDA,SCL,I2CDevice,[DC,$00]
I2CWrite SDA,SCL,I2CDevice,[DC,$D5]
I2CWrite SDA,SCL,I2CDevice,[DC,$F0]
I2CWrite SDA,SCL,I2CDevice,[DC,$D9]
I2CWrite SDA,SCL,I2CDevice,[DC,$22]
I2CWrite SDA,SCL,I2CDevice,[DC,$DA]
I2CWrite SDA,SCL,I2CDevice,[DC,$12]
I2CWrite SDA,SCL,I2CDevice,[DC,$DB]
I2CWrite SDA,SCL,I2CDevice,[DC,$20]
I2CWrite SDA,SCL,I2CDevice,[DC,$8D]
I2CWrite SDA,SCL,I2CDevice,[DC,$14]
I2CWrite SDA,SCL,I2CDevice,[DC,$AF] ' Display On
PAUSE 100
'===============================================================================
GOSUB CLEAR_LCD
pause 5
Gosub ResetTime ' Reset Time to 0d-00:00:00.00
Gosub StartTimer ' Start the Elapsed Timer
'-------------------------------------------------------------------------------
'First byte is the column number (2-129)
'Second byte is the page number (0-7)
'Third byte on is text (max 21 characters)
'First byte after text must be a NULL
'-------------------------------------------------------------------------------
arraywrite Text_Buff,[2,1,"ELAPSED TIME:",0]
gosub Print_XY
arraywrite Text_Buff,[30,6,"Test C(30);R(6)",0]
gosub Print_XY
Main:
Pause 1
IF MinutesChanged THEN MinutesChanged = 0
if Old_Seconds <> Seconds then
Old_Seconds = Seconds
arraywrite Text_Buff,[2,3, DEC Days,"d-",DEC2 Hours,":",DEC2 Minutes,":",DEC2 Seconds,0]
gosub Print_XY
ENDIF
Counter = Counter + 1
if Counter > 50 then Led = False
if Counter > 1000 then
Led = True
Counter = 0
endif
GOTO MAIN
'============================== Print Lines ====================================
Print_XY
X = Text_Buff[0] ' Column in first position
Y = Text_Buff[1] ' Page (Row) in second
gosub Set_XY ' set cursor position
Text_String = 2 ' point to 1st character to print
DO while Text_Buff[Text_String] <> 0
letter_reg = Text_Buff[Text_String]
gosub Find_Char
Text_String = Text_String + 1
loop
return
'=============================== Send data =====================================
SEND_DATA:
DC = $40
I2CWrite SDA,SCL,I2CDevice,[DC,LCD_DATA]
RETURN
'============================== Send Command ===================================
SEND_COMMAND:
DC = $00
I2CWrite SDA,SCL,I2CDevice,[DC,COM]
RETURN
'============================== clear lcd ======================================
CLEAR_LCD:
X = 2
Y = 0
LCD_DATA = $00
FOR Y = 0 TO 7
gosub SET_XY
FOR I = 0 TO 131
GOSUB SEND_DATA
NEXT I
NEXT Y
X = 2
Y = 0
gosub SET_XY
RETURN
'======================= Set Page & Column position ============================
SET_XY:
COM = 176 + y :GOSUB SEND_COMMAND ' PAGE (ROW) SELECTION
COM = x//15 :GOSUB SEND_COMMAND ' LOW NIBBLE COLUMN SELECTION
COM = (x/15) + 16 :GOSUB SEND_COMMAND ' HIGH NIBBLE COLUMN SELECTION
RETURN
'================================ Find Char ====================================
Find_Char:
letter_temp = letter_reg - 32 ' Space is now at index 0 all other characters are 32 less into index
letter_temp = letter_temp * 5 ' Every character is made of 5 bytes
for charset=letter_temp to letter_temp+4
IF letter_reg < "A" then
chartmp = charset - 0 ' lookup variable must be 8 bits
lookup chartmp,[$00,$00,$00,$00,$00,$00,$00,$5F,$00,$00,$14,$7F,$14,$7F,$14,$00,$08,$07,$03,$00,_ 'sp,!,#,"
$24,$2A,$7F,$2A,$12,$23,$13,$08,$64,$62,$36,$49,$56,$20,$50,_ '$,%,&
$00,$08,$07,$03,$00,$00,$1C,$22,$41,$00,$00,$41,$22,$1C,$00,_ '',(,)
$2A,$1C,$7F,$1C,$2A,$08,$08,$3E,$08,$08,$00,$00,$70,$30,$00,_ '*,+,,
$08,$08,$08,$08,$08,$00,$00,$60,$60,$00,$20,$10,$08,$04,$02,_ '-,.,/
$3E,$51,$49,$45,$3E,$00,$42,$7F,$40,$00,$72,$49,$49,$49,$46,_ '0,1,2
$21,$41,$49,$4D,$33,$18,$14,$12,$7F,$10,$27,$45,$45,$45,$39,_ '3,4,5
$3C,$4A,$49,$49,$31,$41,$21,$11,$09,$07,$36,$49,$49,$49,$36,_ '6,7,8
$46,$49,$49,$29,$1E,$00,$00,$14,$00,$00,$00,$40,$34,$00,$00,_ '9,:,;
$00,$08,$14,$22,$41,$14,$14,$14,$14,$14,$00,$41,$22,$14,$08,_ '<,=,>
$02,$01,$59,$09,$06,$3E,$41,$5D,$59,$4E],LCD_DATA '?,@
elseif (letter_reg < "[") then
chartmp = charset - 165 ' subtract previous table length so "A" = zero
lookup chartmp,[$7C,$12,$11,$12,$7C,_ 'A
$7F,$49,$49,$49,$36,$3E,$41,$41,$41,$22,$7F,$41,$41,$41,$3E,_ 'B,C,D
$7F,$49,$49,$49,$41,$7F,$09,$09,$09,$01,$3E,$41,$41,$51,$73,_ 'E,F,G
$7F,$08,$08,$08,$7F,$00,$41,$7F,$41,$00,$20,$40,$41,$3F,$01,_ 'H,I,J
$7F,$08,$14,$22,$41,$7F,$40,$40,$40,$40,$7F,$02,$1C,$02,$7F,_ 'K,L,M
$7F,$04,$08,$10,$7F,$3E,$41,$41,$41,$3E,$7F,$09,$09,$09,$06,_ 'N,O,P
$3E,$41,$51,$21,$5E,$7F,$09,$19,$29,$46,$26,$49,$49,$49,$32,_ 'Q,R,S
$03,$01,$7F,$01,$03,$3F,$40,$40,$40,$3F,$1F,$20,$40,$20,$1F,_ 'T,U,V
$3F,$40,$38,$40,$3F,$63,$14,$08,$14,$63,$03,$04,$78,$04,$03,_ 'W,X,Y
$61,$59,$49,$4D,$43],LCD_DATA 'Z
else
chartmp = charset - 295 ' subtract previous tables length so "[" = zero
lookup chartmp,[$00,$7F,$41,$41,$41,$02,$04,$08,$10,$20,_ '[,\
$00,$41,$41,$41,$7F,$04,$02,$01,$02,$04,$40,$40,$40,$40,$40,_ '],^,_
$00,$03,$07,$08,$00,$20,$54,$54,$38,$40,$7F,$28,$44,$44,$38,_ '`,a,b
$38,$44,$44,$44,$28,$38,$44,$44,$28,$7F,$38,$54,$54,$54,$18,_ 'c,d,e
$00,$08,$7E,$09,$02,$0C,$52,$52,$4A,$3C,$7F,$08,$04,$04,$78,_ 'f,g,h
$00,$44,$7D,$40,$00,$20,$40,$40,$3D,$00,$7F,$10,$28,$44,$00,_ 'i,j,k
$00,$41,$7F,$40,$00,$7C,$04,$78,$04,$78,$7C,$08,$04,$04,$78,_ 'l,m,n
$38,$44,$44,$44,$38,$7C,$18,$24,$24,$18,$18,$24,$24,$18,$7C,_ 'o,p,q
$7C,$08,$04,$04,$08,$48,$54,$54,$54,$24,$04,$04,$3F,$44,$24,_ 'r,s,t
$3C,$40,$40,$20,$7C,$1C,$20,$40,$20,$1C,$3C,$40,$30,$40,$3C,_ 'u,v,w
$44,$28,$10,$28,$44,$4C,$50,$50,$50,$3C,$44,$64,$54,$4C,$44,_ 'x,y,z
$00,$08,$36,$41,$00,$00,$00,$77,$00,$00,$00,$41,$36,$08,$00,_ '{,|,}
$02,$01,$02,$04,$02],LCD_DATA '~
endif
gosub SEND_DATA
next charset
LCD_DATA = $00 ' space between characters always $00
gosub SEND_DATA
return
'===============================================================================
END
Bookmarks