The easiest way is probably to use the L?CALL macro. That way, no matter where the destination is, the correct page bits will be set.would you happen to have an idea on how to convert the absolute call?
L?CALL destination.
The easiest way is probably to use the L?CALL macro. That way, no matter where the destination is, the correct page bits will be set.would you happen to have an idea on how to convert the absolute call?
L?CALL destination.
DT
Luciano, I have that document. That is the one I am using to manage the 4-wire touch screen circuit.
I am using the schematic for the Optrex demo board from Apollo Display as a base for the LCD circuit. The charge pump circuitry is probably identical, I didn't bother comparing. Since I got the gLCDs from Apollo, I'm going to use their schematic, I also find it a bit easier to read.
I have no doubt that writing a library for a gLCD is complex, but I'm not doing that, I'm just modifying a working example. If I was able to progam software for banks, credit cards and utility companies for 20 years, it's not unrealistic to believe that I can convert an assembler program. As it is, I understand 90% of what is happening within this code.
As for the complexity of using all the functions of a graphic LCD, I never said I was going to use them.
Thanks for answering my question Darrel, much appreciated!
My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.
Not as dumb as yesterday, but stupider than tomorrow!
I've Googled, but I can't find a place with nice PM assembler code. I'm particularly interested in how the I/O pins are addressed.
How to move a byte to a port:
mov P1,a ;set output data
How to reset a particular pin:
clr P3.2 ;CS = 0
Robert
![]()
My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.
Not as dumb as yesterday, but stupider than tomorrow!
I finally found a nice example here:
http://picbasic.com/resources/articles/brainart.htm
setb rp0 ;change to register page 1
mov trisb,#00001111b ;make the bottom 4 bits on PortB inputs and the top 4 outputs
clrb rp0 ;change back to register page 0
;
clrb portb.4 ;start with output low and LED off
;
loop jnb portb.0,loop ;jump to loop if switch on PortB.0 is low
jnb portb.1,loop ;jump to loop if switch on PortB.1 is low
;
; if we got here then both switches are high
;
setb portb.4 ;set output high to turn on LED
Robert
![]()
My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.
Not as dumb as yesterday, but stupider than tomorrow!
Ok, I've researched each instruction and these 5 have no direct translations:
PUSH, push direct byte onto stack
POP, pop direct byte from stack
MUL, multiply
ADDC, add into accumulator
MOVC, move code byte to accumulator
I wouldn't be surprised if the equivalent PIC Macro instructions are staring me in the face, but I don't want to start guessing. Here is some code to show the context the commands are used in:
; write an ASCII character to the display
; The font file starts at ascii 32 (blank). The default font is 8x8 pixels
; INPUTS - character in register A
write_char:
push dph
push dpl
clr c
subb a,#32 ;ascii font with blank
mov b,#8 ;multiply by 8 (8 bytes/char)
mul ab
add a,#low(font) ;add to font table address
mov dpl,a
mov a,b
addc a,#high(font)
mov dph,a
mov r0,#8 ;8 bytes/char
wbyte: clr a
movc a,@a+dptr
acall write_data
inc dptr
djnz r0,wbyte
pop dpl
pop dph
ret
8051 assembler reference here:
http://www.ece.umr.edu/computing/uni...e/tasking/asm/
PIC Macro assembler reference:
Robert
![]()
My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.
Not as dumb as yesterday, but stupider than tomorrow!
Robert,
The PUSH and POP were apparently used to save 2 variables that were used in the write_char: routine. You can just use separate variables to temporarily store the two bytes, instead of trying to use the stack.
MUL can be replaced with the MUL?BBB or MUL?BBW macro.
For the addc and movc, you can either manipulate the EEADDR, EECON and EEDATA registers manually, or you could break out of ASM and use the READCODE statement to get the byte first, then do the ADDWF or MOVWF.
HTH,
Darrel
Last edited by Darrel Taylor; - 24th December 2005 at 19:36.
Like this?
dph data 42h <--- add this line with existing DATA statement
dpl data 43h <--- add this line with existing DATA statement
write_char:
push dph <--- delete this line
push dpl <--- delete this line
...
mov dpl,a
...
mov dph,a
...
pop dpl <--- delete this line
pop dph <--- delete this line
ret
Robert
![]()
My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.
Not as dumb as yesterday, but stupider than tomorrow!
Bookmarks