Hello,
with the idea from this WebSide http://www.romanblack.com/shift1.htm, using the Darrel Taylor LCD_AnyPin.pbp + HighJack as a template and the willing to drive the LCD with only one Pin and to use the LCDOUT Command with all features, i wrote a routine for the 74HC595 controlling.
and here is the Code:
Code:@ DEVICE pic16F628A, intOSC_osc_noclkout, WDT_OFF, PWRT_OFF, BOD_OFF, MCLR_OFF define osc 8 INTCON = 0 PortA = 0 PortB = 0 TRISA = 0 ' CATODES TO PORTA TRISB = 0 ' ANODES TO PORTB CMCON = 7 Serial_Pin var PortA.3 B0 var byte B1 VAR Byte B2 VAR Byte B3 VAR Byte B4 var Byte B5 VAR Byte B6 VAR Byte B7 VAR Byte B0 = 0 B1 = 255 ;----[ Change these to match your LCD ]--------------------------------------- INCLUDE "One_Wire_74HC595.pbp" ; *** Include MUST be AFTER LCD Pin assignments * ;----[ Your Main program starts here ]---------------------------------------- LCDOUT $FE, 1 LCDOUT $FE, 1, IHex 255 Pause 2000 Start: Repeat B0 = B0 + 1 B1 = B1 - 1 B2 = B0 DIG 2 B3 = B0 DIG 1 B4 = B0 Dig 0 B5 = B1 DIG 2 B6 = B1 DIG 1 B7 = B1 Dig 0 LCDOUT $FE,$80,"Counter = ",#B2,#B3,#B4 LCDOUT $FE,$C0,"Counter = ",#B5,#B6,#B7 Pause 1000 Until B0 > 254 OR B1 < 1 SWAP B0, B1 goto Start END
Code:A var byte B var byte C var byte D var bit E VAR byte INCLUDE "VirtualPort.bas" LCD_DATAUS CON 2000 LCD_COMMANDUS CON 50 'PAUSE 100 : LCDOUT $FE,1 : PAUSE 100 ; Initialize LCD Goto Over_One_Wire_74HC595 ;===============( DO NOT Change anything below this line )==================== ASM ; Make sure HighJack has been installed in PBP's .LIB file ifndef LCDOUT_HIGHJACKED error "HighJacked-LCDOUT Not found in PBPPIC??.LIB" endif ENDASM DEFINE HJ_LCDOUT _LCDsend ; Redirect PBP's LCDOUT to LCDsend: Subroutine ;----[Send a byte to the Virtual LCD PORT]------------(DO NOT Change)--------- TempChar var byte Char VAR Byte LCD_Initialized VAR FLAGS.1 RSS VAR FLAGS.0 ; LCD RS State ;----[ This routine is called once for every character sent by LCDOUT ]------- LCDsend: @ MOVE?AB _TempChar ; Get char sent by LCDOUT, in WREG if !LCD_Initialized then LCD_Init ; Make sure LCD was Initialized LCDAfterInit: if TempChar = $FE then RSS=0 : goto LCDsendDone ; next char is Command Char = TempChar LCDsendCOM: Gosub Toggle_Nibble IF RSS = 0 then ; Is a Command IF Char = 1 then CommandDelay ; Long delay for Clear Screen IF Char = 2 then CommandDelay ; Long delay for Home @ DelayUS _LCD_DATAUS ; Short delay for everything else goto DelayDone else @ DelayUS _LCD_DATAUS ; Short delay for Data goto DelayDone endif CommandDelay: @ DelayUS _LCD_COMMANDUS DelayDone: if LCD_Initialized then RSS = 1 ; Set RS to Data next time LCDsendDone: return ;----[Initialize the LCD]-------------------(DO NOT Change)------------------- LCD_Init: A = 2 Char = $33 : gosub LCDsendCOM : @ DelayUS 5000 gosub LCDsendCOM : @ DelayUS 100 gosub LCDsendCOM : @ DelayUS 100 Char = $22 : gosub LCDsendCOM ; Start 4-bit mode A = 5 Char = $28 : gosub LCDsendCOM ; Function Set, 4-bit, 2-line, 5x7 Char = $0C : gosub LCDsendCOM ; Display ON Char = $06 : gosub LCDsendCOM ; Entry Mode LCD_Initialized = 1 ; LCD has been Initialized goto LCDAfterInit Toggle_Nibble: For C = 0 to A SELECT CASE c CASE 0 B = Char & %11110000 ' Upper 4 Bits If RSS = 1 Then B = B | %00000100 ' Set RS Bit Endif CASE 1, 4 B = B | %00001000 ' Set Enable Bit CASE 2, 5 B = B ^ %00001000 ' Enable Toggel Case 3 B = Char * 16 ' Lower 4 Bits Shift If RSS = 1 Then B = B | %00000100 ' Set RS Bit Endif END SELECT '******************************Shift_74HC595*********************************** E = 7 Repeat D = B >> E E = E - 1 SELECT CASE D CASE 1 Serial_Pin = 0 @ nop ' min 1 µs for 1 Serial_Pin = 1 Pauseus 15 ' min 15 µs Case 0 Serial_Pin = 0 Pauseus 15 ' min 15 µs for 0 Serial_Pin = 1 Pauseus 30 ' min 30 µs danach END SELECT Until E = 0 'Latch Serial_Pin = 0 Pauseus 200 ' min 200 µs for Latch Serial_Pin = 1 Pauseus 300 ' min 300 µs Next Return Over_One_Wire_74HC595:
As long as Strings will be send, all runs pretty good
Example:
LCDOUT $FE, 1, "Hello"
But I can do what I want, everytime I want to use the HEX, BIN, DEC, REP or STR commands i get Errors in displaying the correct Data.
Example:
LCDOUT, $FE, 1 IHex 255
I get F0 as answer and not $FF
Without I the answer is $220
What I also found out is, when I wrote a simple loop that show me the Hex Characters from 1 to 20....
Till 16 all is Displayed correct. After 16 till 20, 10 is displaying.
I hope somebody can help me.
Thanks
P.S. Sorry for my Bad English










Bookmarks