ili9488 with tuoch screen

UTFT library doesn't work with some of these shields because it uses the first 8 digital pins (0-7) instead some shields uses pins from 2 to 9. The reason is that the first 8 pins are in the same 328P port.

Many of these shields has different chip and very often the seller doesn't know which chip are inside.
As I wrote here
http://forum.arduino.cc/index.php?topic=338835.0
I bought one with spfd5408 controller and received one with ILI9325 controller. Also the photo in eBay was different.

It is simple enough to alter the "libraries\UTFT\hardware\avr\HW_ATmega328P.h" file to match the MCUFRIEND data bus.

The less obvious task is to make the /RD pin safe. UTFT has no concept of reading a controller. It makes no provision for the /RD pin. So you need to add these lines to your UTFT sketches:

void setup()
{
    pinMode(A0, OUTPUT);
    digitalWrite(A0, HIGH);
    ...

As far as I know, there is no official UTFT release that supports the ILI9488. It is pretty easy to add the support but IMHO, you are better off with the Adafruit style of library.

Regarding "Ebay and TFT Shields". The photos and descriptions are often completely wrong. It is best to look closely at the actual Shield that you received in the mail. Then post a link to the "best or nearest photo" that you can find on Ebay. Together with a link to the actual Ebay sale item that you bought.
Has anyone ever obtained a Shield with a real SPFD5408 controller?

David.

Hi David,

I have this 3.95'' mcufriend with ili9488 from aliexpress. I've been searching and looking to make this white screen go away and in two occasions I got it to show a dark rectangle (from a modified adafruit library) and a few vertical colored lines on the leftmost column that succeded eachother (from some weird code that I got from the mcufriend website). other than that a big nada. I have been at this for a few days, tried all kinds of modified adafruit libraries and UTFT as well and still nothing. I am using an Arduino Uno, and the final idea is to have pictures show on this display with a one second delay let's say... Can you please point me in the right direction? Maybe upload a modified library that is plug and play with this screen?

Many thanks!

Mircea

Have you tried the library that I attached to message #14 in this thread?

I will upload an updated version in a few days. But the original should work ok.

If you have a problem, please refer to message #14.

David.

Thanks David, I had the first version of the Arduino IDE for a previous library to work. I have installed the latest and now your mkv library works. thanks!

thanks for the libary david, it works fine on uno, but now i want to use it on my arduino mega, on the mega the sdcard don't work, can you tell me what i can do? i don't understand how to wire.

thank you in advance, this is a big problem for me.

Hello,

I bought a mcufriend 3.6 inch TFT LCD Display Touch Screen Module Arduino UNO R3 Board Plug and Play on eBay.
http://www.ebay.com/itm/141647130960?_trksid=p2060353.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT

The description says it has a ili9488 controller, but on the back is printed:
3.5" TFT LCD fir arduino uno (9486)
After some tests using Arduino Uno, I ended up using Mcufriend_kbv_2.1.
The UTFTGLUE in the GLUE_Demo_480x320 is initialized like:
UTFTGLUE myGLCD(0x9486,A3,A2,A1,A0,A4);
And the demo works.

Thanks David.

Are you using the original UTFT library? Because it shouldn't work since your shield uses pin 2-9 and UTFT should use pin 0-7.

I do not use the UTFT library at all. The UTFTGLUE class simply uses the same class methods as the UTFT library. It is not perfect.

But it does allow you to take a sketch written for UTFT and run it on a mcufriend compatible shield. The constructor arguments are actually ignored because MCUFRIEND_kbv always uses the Shield pins.

If you edit the UTFTGLUE.h file to use a Adafruit_TFTLCD constructor, it should work with a traditional hacked Adafruit library. i.e. the constructor arguments will allow you to change control pins.

Likewise, most of the example sketches can work with a traditional Adafruut constructor e.g. graphicstest_kbv and tftpaint_kbv. Even readpixel_kbv. However, things like scroll_kbv obviously depend on a vertScroll() method that is not part of the Adafruit class.

David.

p.s. I would dearly like someone with an ILI9486 shield to test the readpixel_kbv sketch.
p.p.s. The ILI9327 clearly does not work in PORTRAIT_REV and LANDSCAPE mode. Nor does the readGRAM() or readPixel()

Somewhere, I have a KTFTGLUE.h file that will allow you to use Adafruut methods with the UTFT library.
e.g. run the Adafruit graphicstest sketch with a UTFT supported display.

Running a known sketch with the 'other' library illustrates the performance differences.

Ok, there is a processing overhead but Adafruit style is considerably faster. Of course, UTFT is considerably more flexible for adding displays, platforms, interfaces, ...

Have you ever tried hand-editing a UTFT sketch to use different library methods? Or vice-versa,

David.

I just tried the readpixel_kbv sketch as is, using the display mentioned in #26 of this thread.
The background color is either white or yellow.
The print out rotates between PORTRAIT and LANDSCAPE.
The numbers printed, however, seems random.
Hope this is of use.

The sketch should rotate between PORTRAIT, LANDSCAPE, PORTRAIT_REV, LANDSCAPE_REV
It should display a hexdump of the pixels at (x, y).

It defaults to start at (36, 0) it shows the 6th letter printed on the screen. Each 7x5 letter takes
a box: width=6 and height=8

You should see the digits 4, 0, 1, 2, ... in green. Look at your display from an angle. The 4 comes from the ID=0x9486

In the black background screen, the hexdump should just be 0000 or FFFF.
In the blue background screen, the hexdump should just be 001F or FFFF.

If the background is white or yellow, or you get random hex values, the readGRAM() function is not correct.

Thankyou very much for your help.

David.

can anyone thell me how i can use the sd card with a arduino mega?

I tried to attach a .jpg image with the result of the readpixel_kbv sketch, but got a security error on my last post.
However, adding serial output, here is a dump of the numbers on a yellow background on the display:

ID=0x9486 Background=001F LANDSCAPE_REV
 36,  0: 00E0 1803 FFE0 1803 00FF FFFF FFE0 1803 00E0 1803 00E0 1FFF 00E0 1803
 36,  1: 00E0 1FFF FFE0 1803 FFE0 1803 00FF F803 00FF F803 00FF FFFF 00E0 1FFF
 36,  2: 00FF F803 FFE0 1803 FFE0 1803 00FF F803 FFE0 1803 FFE0 1FFF 00E0 1FFF
 36,  3: FFE0 1803 FFE0 1803 00FF FFFF FFE0 1803 FFFF FFFF 00E0 1FFF 00E0 1803
 36,  4: FFFF FFFF FFFF F803 FFE0 1803 00FF F803 FFE0 1FFF FFFF FFFF FFE0 1FFF
 36,  5: 00E0 1803 FFE0 1803 FFE0 1803 00FF F803 FFE0 1803 00E0 1FFF 00E0 1FFF
 36,  6: 00E0 1803 FFE0 1803 00FF FFFF FFE0 1803 00FF F803 00E0 1FFF 00E0 1803
 36,  7: 00E0 1803 00E0 1803 00E0 1803 00E0 1803 00E0 1803 00E0 1803 00E0 1803
 36,  8: 00FF FFFF FFE0 1803 00E0 1803 00E0 1803 00E0 1803 FFFF FFFF 00E0 1803
 36,  9: FFE0 1803 00FF F803 00E0 1803 00E0 1803 00E0 1FFF 00E0 1803 FFE0 1803
 36, 10: FFE0 1803 FFFF F803 00E0 1FFF 00E0 1803 00E0 1FFF 00E0 1FFF FFE0 1803
 36, 11: FFE0 1FFF 00FF F803 00E0 1803 00E0 1803 00E0 1FFF 00FF F803 FFE0 1803
 36, 12: FFFF F803 00FF F803 00E0 1FFF 00E0 1803 00E0 1FFF FFE0 1803 FFE0 1803
 36, 13: FFE0 1803 00FF F803 00E0 1803 00E0 1803 00E0 1FFF 00E0 1803 FFE0 1803
 36, 14: 00FF FFFF FFE0 1803 00E0 1803 00E0 1803 00E0 1803 FFFF FFFF 00E0 1803
 36, 15: 00E0 1803 00E0 1803 00E0 1803 00E0 1803 00E0 1803 00E0 1803 00E0 1803
 36, 16: 00E0 1FFF 00E0 1803 00E0 1803 00E0 1803 00E0 1803 00FF F803 00E0 1803
 36, 17: 00FF FFFF 00E0 1803 00E0 1803 00E0 1803 00E0 1803 FFFF F803 00E0 1803
 36, 18: 00E0 1FFF 00E0 1803 00E0 1FFF 00E0 1803 00E0 1803 00FF F803 00E0 1803
 36, 19: 00E0 1FFF 00E0 1803 00E0 1803 00E0 1803 00E0 1803 00FF F803 00E0 1803
 36, 20: 00E0 1FFF 00E0 1803 00E0 1FFF 00E0 1803 00E0 1803 00FF F803 00E0 1803
 36, 21: 00E0 1FFF 00E0 1803 00E0 1803 00E0 1803 00E0 1803 00FF F803 00E0 1803
 36, 22: 00FF FFFF FFE0 1803 00E0 1803 00E0 1803 00E0 1803 FFFF FFFF 00E0 1803
 36, 23: 00E0 1803 00E0 1803 00E0 1803 00E0 1803 00E0 1803 00E0 1803 00E0 1803
 36, 24: 00FF FFFF FFE0 1803 00E0 1803 00E0 1803 00E0 1803 FFFF FFFF 00E0 1803
 36, 25: FFE0 1803 00FF F803 00E0 1803 00E0 1803 00E0 1FFF 00E0 1803 FFE0 1803
 36, 26: 00E0 1803 00FF F803 00E0 1FFF 00E0 1803 00E0 1803 00E0 1803 FFE0 1803
 36, 27: 00FF FFFF FFE0 1803 00E0 1803 00E0 1803 00E0 1803 FFFF FFFF 00E0 1803
 36, 28: FFE0 1803 00E0 1803 00E0 1FFF 00E0 1803 00E0 1FFF 00E0 1803 00E0 1803
 36, 29: FFE0 1803 00E0 1803 00E0 1803 00E0 1803 00E0 1FFF 00E0 1803 00E0 1803
 36, 30: FFFF FFFF FFFF F803 00E0 1803 00E0 1803 00E0 1FFF FFFF FFFF FFE0 1803
 36, 31: 00E0 1803 00E0 1803 00E0 1803 00E0 1803 00E0 1803 00E0 1803 00E0 1803
 36, 32: FFFF FFFF FFFF F803 00E0 1803 00E0 1803 00E0 1FFF FFFF FFFF FFE0 1803
 36, 33: 00E0 1803 00FF F803 00E0 1803 00E0 1803 00E0 1803 00E0 1803 FFE0 1803
 36, 34: 00E0 1803 FFE0 1803 00E0 1FFF 00E0 1803 00E0 1803 00E0 1FFF 00E0 1803
 36, 35: 00E0 1FFF FFE0 1803 00E0 1803 00E0 1803 00E0 1803 00FF FFFF 00E0 1803
 36, 36: 00E0 1803 00FF F803 00E0 1FFF 00E0 1803 00E0 1803 00E0 1803 FFE0 1803
 36, 37: FFE0 1803 00FF F803 00E0 1803 00E0 1803 00E0 1FFF 00E0 1803 FFE0 1803
 36, 38: 00FF FFFF FFE0 1803 00E0 1803 00E0 1803 00E0 1803 FFFF FFFF 00E0 1803

Yup, you have complete rubbish. Please can you force readPixel().

#if 1 && defined(MCUFRIEND_KBV_H_)        
            if (dirty) tft.readGRAM(x, y + j, pixels, wid, 1);
            dirty = 0;
            pixel = pixels[i];
#else
            pixel = tft.readPixel(x + i, y + j);
#endif

by changing it to:

            pixel = tft.readPixel(x + i, y + j);

I am horrified by a yellow background. If you do a Serial capture, it is the PORTRAIT mode with Background=0000 that is best to see.

David.

Implementing your change, the result still looks odd:

ID=0x9486 Background=0000 PORTRAIT
 36,  0: 0000 0000 0000 FFFF 0000 0000 0000 FFFF
 36,  1: 0000 0000 FFFF FFFF 0000 0000 FFFF 0000
 36,  2: 0000 FFFF 0000 FFFF 0000 0000 FFFF 0000
 36,  3: FFFF 0000 0000 FFFF 0000 0000 0000 FFFF
 36,  4: FFFF FFFF FFFF FFFF FFFF 0000 FFFF 0000
 36,  5: 0000 0000 0000 FFFF 0000 0000 FFFF 0000
 36,  6: 0000 0000 0000 FFFF 0000 0000 0000 FFFF
 36,  7: 0000 0000 0000 0000 0000 0000 0000 0000
 36,  8: 0000 FFFF FFFF FFFF 0000 0000 0000 0000
 36,  9: FFFF 0000 0000 0000 FFFF 0000 0000 0000
 36, 10: FFFF 0000 0000 FFFF FFFF 0000 0000 0000
 36, 11: FFFF 0000 FFFF 0000 FFFF 0000 0000 0000
 36, 12: FFFF FFFF 0000 0000 FFFF 0000 0000 0000
 36, 13: FFFF 0000 0000 0000 FFFF 0000 0000 0000
 36, 14: 0000 FFFF FFFF FFFF 0000 0000 0000 0000
 36, 15: 0000 0000 0000 0000 0000 0000 0000 0000
 36, 16: 0000 0000 FFFF 0000 0000 0000 0000 0000
 36, 17: 0000 FFFF FFFF 0000 0000 0000 0000 0000
 36, 18: 0000 0000 FFFF 0000 0000 0000 0000 0000
 36, 19: 0000 0000 FFFF 0000 0000 0000 0000 0000
 36, 20: 0000 0000 FFFF 0000 0000 0000 0000 0000
 36, 21: 0000 0000 FFFF 0000 0000 0000 0000 0000
 36, 22: 0000 FFFF FFFF FFFF 0000 0000 0000 0000
 36, 23: 0000 0000 0000 0000 0000 0000 0000 0000
 36, 24: 0000 FFFF FFFF FFFF 0000 0000 0000 0000
 36, 25: FFFF 0000 0000 0000 FFFF 0000 0000 0000
 36, 26: 0000 0000 0000 0000 FFFF 0000 0000 0000
 36, 27: 0000 FFFF FFFF FFFF 0000 0000 0000 0000
 36, 28: FFFF 0000 0000 0000 0000 0000 0000 0000
 36, 29: FFFF 0000 0000 0000 0000 0000 0000 0000
 36, 30: FFFF FFFF FFFF FFFF FFFF 0000 0000 0000
 36, 31: 0000 0000 0000 0000 0000 0000 0000 0000
 36, 32: FFFF FFFF FFFF FFFF FFFF 0000 0000 0000
 36, 33: 0000 0000 0000 0000 FFFF 0000 0000 0000
 36, 34: 0000 0000 0000 FFFF 0000 0000 0000 0000
 36, 35: 0000 0000 FFFF FFFF 0000 0000 0000 0000
 36, 36: 0000 0000 0000 0000 FFFF 0000 0000 0000
 36, 37: FFFF 0000 0000 0000 FFFF 0000 0000 0000
 36, 38: 0000 FFFF FFFF FFFF 0000 0000 0000 0000
 36, 39: 0000 0000 0000 0000 0000 0000 0000 0000
 36, 40: 0000 0000 0000 FFFF 0000 0000 0000 0000
 36, 41: 0000 0000 FFFF FFFF 0000 0000 0000 0000
 36, 42: 0000 FFFF 0000 FFFF 0000 0000 0000 0000
 36, 43: FFFF 0000 0000 FFFF 0000 0000 0000 0000
 36, 44: FFFF FFFF FFFF FFFF FFFF 0000 0000 0000
 36, 45: 0000 0000 0000 FFFF 0000 0000 0000 0000
 36, 46: 0000 0000 0000 FFFF 0000 0000 0000 0000
 36, 47: 0000 0000 0000 0000 0000 0000 0000 0000
 36, 48: FFFF FFFF FFFF FFFF FFFF 0000 0000 0000
 36, 49: FFFF 0000 0000 0000 0000 0000 0000 0000
 36, 50: FFFF FFFF FFFF FFFF 0000 0000 0000 0000
 36, 51: 0000 0000 0000 0000 FFFF 0000 0000 0000
 36, 52: 0000 0000 0000 0000 FFFF 0000 0000 0000
 36, 53: FFFF 0000 0000 0000 FFFF 0000 0000 0000
 36, 54: 0000 FFFF FFFF FFFF 0000 0000 0000 0000
 36, 55: 0000 0000 0000 0000 0000 0000 0000 0000
 36, 56: 0000 0000 FFFF FFFF FFFF 0000 0000 0000
 36, 57: 0000 FFFF 0000 0000 0000 0000 0000 0000
 36, 58: FFFF 0000 0000 0000 0000 0000 0000 0000

Edit: Forgot to mention that the text on the display always is black with the exception of FFFF which is shown in magenta.

Yes, the readPixel() is working ok. The FFFF should be in green. All the other text should be in white. Background=0000 means BLACK. Surely you can see that that is a 4 plotted in FFFF pixels.

I am worried about your "Magenta". Have you tried the GLUE_Demo_480x320 or graphicstest_kbv sketches?
There are plenty of YouTube videos that show these Demo programs in action. Do your colours match?

I possess a 9486 but it is write-only. The colours and Rotation work ok for me. I can't read the controller, so the readPixel_kbv sketch is not able to work.

David.

At last I figured out the color problem.
Green -> Magenta, Blue -> yellow, complementary colors of course.
Looking through the datasheet, I found the Display Inversion ON (21h) function on page 174.
It is in Adafruit_GFX, but an empty function to be subclassed.
However, for a test I just added the parameters in begin() in MCUFRIEND_kbv.cpp and now the display looks as you described :slight_smile: .

Original code:

case 0x9486:
           ...
           ...
           0x36, 1, 0x0A,      //Memory Access
           0x3A, 1, 0x55,      //Interlace Pixel
           0x11, 0,            //Sleep Out
           TFTLCD_DELAY, 50,
           0x29, 0,            //Display On

With inverted display

case 0x9486:
           ...
           ...
           0x36, 1, 0x0A,      //Memory Access
           0x3A, 1, 0x55,      //Interlace Pixel
           0x11, 0,            //Sleep Out
           TFTLCD_DELAY, 50,
           0x21, 0,            //Invert display !!!
           0x29, 0,            //Display On

Looks like a good idea to have an invert display function in case of displays with a similar problem.
Edit: I have implemented the invertDisplay function in the MCUFRIEND_kbv.cpp file like:

void MCUFRIEND_kbv::invertDisplay(boolean i) {
	switch (_lcd_ID ) {
		case 0x9486:
			CS_ACTIVE;
			if(i) {
				WriteCmd(0x21);
			} else {
				WriteCmd(0x20);
			}
			CS_IDLE;
			break;
		default:
		break;
	}
}

And added the MCUFRIEND_kbv.h:

virtual void invertDisplay(boolean i);

I have "partly" implemented the invertDisplay() method.

Most of the ILI9325-style controllers seem to use REV bit.
My 9341, 9486, 9488 displays want Inversion_OFF

I suppose that your 9486 panel requires Inversion_ON.

I will probably set a flag in begin() for the default. Then the method can use XOR to flip the state.

The readPixel screen certainly looks HORRIBLE in reverse !!

As far as I can see from the 9486 (and 9327) data sheet, readGRAM should be able to read a block of display memory. The 9486 0x2E command implies that you read 24-bits of RGB per pixel from the flowchart but says Dn[15:0] for the parameter. So it might mean 16-bits of 565 format. Since a WHITE pixel is 0xFFFFFF or 0xFFFF using readPixel() will work for WHITE or BLACK. Complex colours will be wrong.

Now that you are happier with the library, please can you try readGRAM again. This time, post a screen dump of the blue background PORTRAIT output.

Thankyou for your help.

Please edit the readGRAM method to:

        switch (_lcd_ID) {
        case 0x9327:
        case 0x9486:
            READ_8(dummy);
            while (n-- > 0) {
	            READ_16(ret);     //already in 565 format
	            *block++ = ret;
            }
            break;
        case 0x9341:
        case 0x9488:
            uint8_t r, g, b;
            READ_8(r);
            while (n-- > 0) {
                READ_8(r);
                READ_8(g);
                READ_8(b);
                *block++ = color565(r, g, b);
            }
            break;
        ...

David.

Hello David,

Yes, my 9486 panel requires Inversion_ON, strangely enough.

I have changed the readGRAM method as you suggested and made a screen dump of the blue background PORTRAIT mode:

ID=0x9486 Background=001F PORTRAIT
36,  0: 001F 001F 001F FFFF 001F 001F 001F FFFF
36,  1: 001F 001F FFFF FFFF 001F 001F FFFF 001F
36,  2: 001F FFFF 001F FFFF 001F 001F FFFF 001F
36,  3: FFFF 001F 001F FFFF 001F 001F 001F FFFF
36,  4: FFFF FFFF FFFF FFFF FFFF 001F FFFF 001F
36,  5: 001F 001F 001F FFFF 001F 001F FFFF 001F
36,  6: 001F 001F 001F FFFF 001F 001F 001F FFFF
36,  7: 001F 001F 001F 001F 001F 001F 001F 001F
36,  8: 001F FFFF FFFF FFFF 001F 001F 001F 001F
36,  9: FFFF 001F 001F 001F FFFF 001F 001F 001F
36, 10: FFFF 001F 001F FFFF FFFF 001F 001F 001F
36, 11: FFFF 001F FFFF 001F FFFF 001F 001F 001F
36, 12: FFFF FFFF 001F 001F FFFF 001F 001F 001F
36, 13: FFFF 001F 001F 001F FFFF 001F 001F 001F
36, 14: 001F FFFF FFFF FFFF 001F 001F 001F 001F
36, 15: 001F 001F 001F 001F 001F 001F 001F 001F
36, 16: 001F 001F FFFF 001F 001F 001F 001F 001F
36, 17: 001F FFFF FFFF 001F 001F 001F 001F 001F
36, 18: 001F 001F FFFF 001F 001F 001F 001F 001F
36, 19: 001F 001F FFFF 001F 001F 001F 001F 001F
36, 20: 001F 001F FFFF 001F 001F 001F 001F 001F
36, 21: 001F 001F FFFF 001F 001F 001F 001F 001F
36, 22: 001F FFFF FFFF FFFF 001F 001F 001F 001F
36, 23: 001F 001F 001F 001F 001F 001F 001F 001F
36, 24: 001F FFFF FFFF FFFF 001F 001F 001F 001F
36, 25: FFFF 001F 001F 001F FFFF 001F 001F 001F
36, 26: 001F 001F 001F 001F FFFF 001F 001F 001F
36, 27: 001F FFFF FFFF FFFF 001F 001F 001F 001F
36, 28: FFFF 001F 001F 001F 001F 001F 001F 001F
36, 29: FFFF 001F 001F 001F 001F 001F 001F 001F
36, 30: FFFF FFFF FFFF FFFF FFFF 001F 001F 001F
36, 31: 001F 001F 001F 001F 001F 001F 001F 001F
36, 32: FFFF FFFF FFFF FFFF FFFF 001F 001F 001F
36, 33: 001F 001F 001F 001F FFFF 001F 001F 001F
36, 34: 001F 001F 001F FFFF 001F 001F 001F 001F
36, 35: 001F 001F FFFF FFFF 001F 001F 001F 001F
36, 36: 001F 001F 001F 001F FFFF 001F 001F 001F
36, 37: FFFF 001F 001F 001F FFFF 001F 001F 001F
36, 38: 001F FFFF FFFF FFFF 001F 001F 001F 001F
36, 39: 001F 001F 001F 001F 001F 001F 001F 001F
36, 40: 001F 001F 001F FFFF 001F 001F 001F 001F
36, 41: 001F 001F FFFF FFFF 001F 001F 001F 001F
36, 42: 001F FFFF 001F FFFF 001F 001F 001F 001F
36, 43: FFFF 001F 001F FFFF 001F 001F 001F 001F
36, 44: FFFF FFFF FFFF FFFF FFFF 001F 001F 001F
36, 45: 001F 001F 001F FFFF 001F 001F 001F 001F
36, 46: 001F 001F 001F FFFF 001F 001F 001F 001F
36, 47: 001F 001F 001F 001F 001F 001F 001F 001F
36, 48: FFFF FFFF FFFF FFFF FFFF 001F 001F 001F
36, 49: FFFF 001F 001F 001F 001F 001F 001F 001F
36, 50: FFFF FFFF FFFF FFFF 001F 001F 001F 001F
36, 51: 001F 001F 001F 001F FFFF 001F 001F 001F
36, 52: 001F 001F 001F 001F FFFF 001F 001F 001F
36, 53: FFFF 001F 001F 001F FFFF 001F 001F 001F
36, 54: 001F FFFF FFFF FFFF 001F 001F 001F 001F
36, 55: 001F 001F 001F 001F 001F 001F 001F 001F
36, 56: 001F 001F FFFF FFFF FFFF 001F 001F 001F
36, 57: 001F FFFF 001F 001F 001F 001F 001F 001F
36, 58: FFFF 001F 001F 001F 001F 001F 001F 001F

To me the result looks much better.

Carl

BluePortrait.png