Simple demo for the Raio RA8875 Based Display with a 4-wire SPI interface.

Dependencies:   mbed RA8875

RA8875 Based Display Controller

This page shows a simple demo program for a graphics library supporting a low cost display from buydisplay.com. While the module can be configured for support via I2C, 3-Wire SPI, 4-Wire SPI, 8-bit Parallel or 16-bit Parallel, the companion library only supports the 4-Wire SPI.

You can also find this display on the Components | RA8875 page.

Library

RA8875 Library

Display Pictures

While this image is sharp, the camera/lighting washed out the colors somewhat. /media/uploads/WiredHome/ra8875display.640x380.png

With careful study of the image below, you can see a number of solder-blob jumpers. These jumpers are described quite well in the manual, and configure the many different options. The specific unit shown here is the "entry point" model, it does not have touchscreen, SD card, extra Font memory, or the key pad interface. As you see in the top left, it is wired with an 8-signal ribbon cable (but note in the schematic that it only needs 6 as the two power and two ground are internally connected together in the module).

/media/uploads/WiredHome/ra8875displaymodulerr.jpg

Also note, that some configuration changes go beyond the jumpers. I decided to switch my configuration to 4-Wire SPI and had to remove R1, R2, and R3 (which were zero-ohm that shorted the SPI input pins to +v!). I also changed some of the solder-blob jumpers, but that was easy. Had I ordered the display with the support for 4-Wire SPI, that would not have been necessary.

Schematic

The library should be able to work with any SPI port, and the Chip Select pin is a simple DigitalOut pin, chosen from the unused pins on my baseboard.

/media/uploads/WiredHome/ra8875_display_schematic.png

Sample Program

#include "mbed.h"
#include "RA8875.h"

Serial pc(USBTX, USBRX);

int main()
{
    pc.baud(460800);    // I like a snappy terminal, so crank it up!
    pc.printf("\r\nRA8875 Test - Build " __DATE__ " " __TIME__ "\r\n");

    RA8875 lcd(p5, p6, p7, p12, NC, "tft");    // MOSI, MISO, SCK, /ChipSelect, /reset, name

    lcd.puts(0,0,
        "RA8875 lcd(p5, p6, p7, p12, NC, \"tft\");\r\n\r\n"
        "lcd.circle(       400,25,  25,  BrightRed);\r\n"
        "lcd.fillcircle(   400,25,  15,  RGB(128,255,128));\r\n"
        "lcd.ellipse(      440,75,  35,20, BrightBlue);\r\n"
        "lcd.fillellipse(  440,75,  25,10, Blue);\r\n"
        "lcd.triangle(     440,100, 475,110, 450,125, Magenta);\r\n"
        "lcd.filltriangle( 445,105, 467,111, 452,120, Cyan);\r\n"
        "lcd.rect(         400,130, 475,155,    Brown);\r\n"
        "lcd.fillrect(     405,135, 470,150,    Pink);\r\n"
        "lcd.roundrect(    410,160, 475,190, 10,8, Yellow);\r\n"
        "lcd.fillroundrect(415,165, 470,185,  5,3, Orange);\r\n"
        "lcd.line(         430,200, 460,230, RGB(0,255,0));\r\n"
        "for (i=0; i<=30; i+=5)\r\n"
        "    lcd.pixel(435+i,200+i, White);");

    lcd.circle(       400,25,  25,               BrightRed);
    lcd.fillcircle(   400,25,  15,               RGB(128,255,128));
    lcd.ellipse(      440,75,  35,20,            BrightBlue);
    lcd.fillellipse(  440,75,  25,10,            Blue);
    lcd.triangle(     440,100, 475,110, 450,125, Magenta);
    lcd.filltriangle( 445,105, 467,111, 452,120, Cyan);
    lcd.rect(         400,130, 475,155,          Brown);
    lcd.fillrect(     405,135, 470,150,          Pink);
    lcd.roundrect(    410,160, 475,190, 10,8,    Yellow);
    lcd.fillroundrect(415,165, 470,185,  5,3,    Orange);
    lcd.line(         430,200, 460,230,          RGB(0,255,0));
    for (i=0; i<=30; i+=5) 
        lcd.pixel(435+i,200+i, White);
    while (1)
        ;
}

main.cpp

Committer:
WiredHome
Date:
2019-03-04
Revision:
18:307303d9c8f6
Parent:
17:c8ef96a6e43b
Child:
19:222ca90808c4

File content as of revision 18:307303d9c8f6:

//
// Demo Program
//  mbed version   Graphics Working   PrintScreen Working? "/local/file.bmp"
//  v148           Yes                No,   FILE *Image = fopen(Name_BMP, "wb"); fails
//  v142           Yes                No,   FILE *Image = fopen(Name_BMP, "wb"); fails
//  v140           Yes                No,   FILE *Image = fopen(Name_BMP, "wb"); fails
//  v138           Yes                No,   FILE *Image = fopen(Name_BMP, "wb"); fails
//  v137           Yes                Yes
//  v136           Yes                Yes
//  v128           Yes                Yes
//
#include "mbed.h"           // testing: v147 - working: v146, v145, v142, v136, v128, fails: v148
#include "RA8875.h"         // v138 - tested working
#include "MyFont18x32.h"
#include "BPG_Arial08x08.h"
#include "BPG_Arial10x10.h"
#include "BPG_Arial20x20.h"
#include "BPG_Arial31x32.h"
#include "BPG_Arial63x63.h"

// These two defines can be enabled, or commented out
#define BIG_SCREEN
//#define CAP_TOUCH
#define LCD_C 16         // color - bits per pixel

#ifdef CAP_TOUCH
RA8875 lcd(p5, p6, p7, p12, NC, p9,p10,p13, "tft"); // MOSI,MISO,SCK,/ChipSelect,/reset, SDA,SCL,/IRQ, name
#else
RA8875 lcd(p5, p6, p7, p12, NC, "tft");             //MOSI, MISO, SCK, /ChipSelect, /reset, name
#endif
LocalFileSystem local("local");                     // access to calibration file for resistive touch and printscreen

#ifdef BIG_SCREEN
#define LCD_W 800
#define LCD_H 480
#else
#define LCD_W 480
#define LCD_H 272
#endif

Serial pc(USBTX, USBRX);            // And a little feedback
Timer measurement;

RetCode_t callback(RA8875::filecmd_t cmd, uint8_t * buffer, uint16_t size)
{
    static FILE * fh = NULL;
    static unsigned int bytesDone = 0;
    static unsigned int totalBytes = 0;
    
    switch(cmd) {
        case RA8875::OPEN:
            bytesDone = 0;
            totalBytes = *(uint32_t *)buffer;
            pc.printf("PrintScreen callback to write %u bytes\r\n", totalBytes);
            fh = fopen("/local/file.bmp", "w+b");
            if (!fh)
                return(file_not_found);
            break;
        case RA8875::WRITE:
            bytesDone += size;
            pc.printf("  Write %d bytes => %d of %d\r\n", size, bytesDone, totalBytes);
            fwrite(buffer, 1, size, fh);
            pc.printf("  %3d %% complete\r\n", ((100 * bytesDone)/totalBytes));
            break;
        case RA8875::CLOSE:
            fclose(fh);
            pc.printf("PrintScreen Closed.\r\n");
            break;
        default:
            pc.printf("Unexpected callback %d\r\n", cmd);
            break;
    }
    return noerror;
}


int main()
{
    pc.baud(460800);                            // I like a snappy terminal, so crank it up!
    pc.printf("\r\nRA8875 Soft Fonts - Build " __DATE__ " " __TIME__ "\r\n");

    measurement.start();
    lcd.frequency(500000);
    lcd.Reset();
    lcd.init(LCD_W, LCD_H, LCD_C, 40);

    // **************************
    //RunTestSet(lcd, pc);  // If the library was compiled for test mode...

    lcd.foreground(RGB(255,255,0));
    lcd.puts(0,100, "RA8875 Soft Fonts - Build " __DATE__ " " __TIME__ "\r\n");

    lcd.SelectUserFont(Dave_Smart18x32);
    lcd.puts("**** ! Soft Fonts ! **** 0123456789\r\n");
    lcd.puts("ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    //lcd.puts("abcdefghijklmnopqrstuvwxyz\r\n");
    lcd.SelectUserFont();
    lcd.puts("Back to normal\r\n");
    lcd.SelectUserFont(BPG_Arial08x08);
    lcd.puts("BPG_Arial08x08 ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    //lcd.puts("BPG_Arial08x08 abcdefghijklmnopqrstuvwxyz\r\n");
    lcd.SelectUserFont(BPG_Arial10x10);
    lcd.puts("BPG_Arial10x10 ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n");
    //lcd.puts("BPG_Arial10x10 abcdefghijklmnopqrstuvwxyz\r\n");
    lcd.SelectUserFont(BPG_Arial20x20);
    lcd.puts("BPG_Arial20x20  ");
    lcd.SelectUserFont(BPG_Arial31x32);
    lcd.puts("BPG_Arial31x32\r\n");
    lcd.SelectUserFont(BPG_Arial63x63);
    lcd.puts("BPG_Arial63x63");
    pc.printf("Time trial completed in %d uSec\r\n", measurement.read_us());

    lcd.rect(0,0, 10,10, BrightRed);

    pc.printf("PrintScreen activated ...\r\n");
    RetCode_t r = lcd.PrintScreen(0,0,LCD_W,LCD_H,"/local/file.bmp", 8);
    pc.printf("  PrintScreen returned %d - %s\r\n", r, lcd.GetErrorMessage(r));

    //lcd.AttachPrintHandler(callback);
    //lcd.PrintScreen(0,0,LCD_W,LCD_H,8);


    while(1) {
        ;       // end
    }
}