Here I'm again.
Again to my last post:
I think over it again and C Flag is also an System Variable.
Also too unsuitable.
What have I done:
I rewrite the code once again.
I change the Variable Name's an insert your code from Statement 2.
Could it be, that there is an small mistake.
Code:
F var byte
G var byte
;D = B >> E
F = E
G = B
ShiftLoop
;G = G >> 1
G = G << 1
F = F - 1
IF F != 0 THEN ShiftLoop
;D = G.0
D = G.7
Once Again here is the code
Code:
Char_Temp var byte
ShiftOut_Steps var byte
Count_ShiftOut_Steps var byte
ShiftLoop_Steps Var byte
Bit_Shift Var byte
Readout_Bit var bit
INCLUDE "VirtualPort.bas"
LCD_DATAUS CON 2000
LCD_COMMANDUS CON 50
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:
Goto ShiftLoop_Char
After_ShiftLoop_Char:
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:
ShiftOut_Steps = 2
Char = $33 : gosub LCDsendCOM : @ DelayUS 5000
gosub LCDsendCOM : @ DelayUS 100
gosub LCDsendCOM : @ DelayUS 100
Char = $22 : gosub LCDsendCOM ; Start 4-bit mode
ShiftOut_Steps = 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
;----[Send it to 74HC595]-------------------(DO NOT Change)-------------------
ShiftLoop_Char:
For Count_ShiftOut_Steps = 0 to ShiftOut_Steps ' For To Loop
SELECT CASE Count_ShiftOut_Steps
CASE 0
Char_Temp = Char & %11110000 ; Isolate Upper 4 Bits
If RSS = 1 Then : Char_Temp = Char_Temp | %00000100 ; Set RS Bit
CASE 1, 4
Char_Temp = Char_Temp | %00001000 ; Set Enable Bit
CASE 2, 5
Char_Temp = Char_Temp ^ %00001000 ; Toggel Enable
Case 3
Char_Temp = Char << 1 ; Shift Up Lower 4 Bits
Char_Temp = Char_Temp << 1
Char_Temp = Char_Temp << 1
Char_Temp = Char_Temp << 1
If RSS = 1 Then : Char_Temp = Char_Temp | %00000100 ; Set RS Bit
END SELECT
Bit_Shift = Char_Temp
;----[Shift_Routine_74HC595 ]---------------(DO NOT Change)-------------------
ShiftLoop_Steps = 7
ShiftLoop:
Readout_Bit = Bit_Shift.7
SELECT CASE Readout_Bit
CASE 1
Serial_Pin = 0 : @ DelayUS 1 ; min 1 µs for 1
Serial_Pin = 1 : @ DelayUS 15 ; min 15 µs
Case 0
Serial_Pin = 0 : @ DelayUS 15 ; min 15 µs for 0
Serial_Pin = 1 : @ DelayUS 30 ; min 30 µs
END SELECT
Bit_Shift = Bit_Shift << 1
ShiftLoop_Steps = ShiftLoop_Steps - 1
IF ShiftLoop_Steps != 0 THEN : Goto ShiftLoop
;Latch
Serial_Pin = 0 : @ DelayUS 200 ; min 200 µs for Latch
Serial_Pin = 1 : @ DelayUS 300 ; min 300 µs
'Count_ShiftOut_Steps = Count_ShiftOut_Steps + 1 ' for If Then Request
'IF Count_ShiftOut_Steps != ShiftOut_Steps Then : goto ShiftLoop_Char ' for If Then Request
Next ' For To Loop
Goto After_ShiftLoop_Char
Over_One_Wire_74HC595:
I also wanted to replace the For To Loop with an normal If - Then request, because of the Usage of System Variables; or is there neither.
It also works well but when I simulate it, it takes too much CPU Usage and Runs very slow.
Using an Repeat Until Loop also.
With an For To Loop the simulation is better.
But which Loop is the best, when one think only about the Usage in an Microcontroller?
What did you say. Is it OK or is there something which one can also improve.
Thanks in advance!
Bookmarks