/*! * @defgroup MKII * @brief MKII boosterpack LCD
MKII LCD pins
Pin Function Description
PB9 SPI1 SCLK J1.7 LCD SPI clock (SPI)
PB6 SPI1 CS0 J2.13 LCD SPI CS (SPI)
PB8 SPI1 PICO J2.15 LCD SPI data (SPI)
PB15GPIO J2.17 LCD !RST (digital)
PA13GPIO J4.31 LCD RS (digital)
* @{*/ /** * @file LCD.h * @brief LCD on MKII boosterpack * @details Software driver functions for joystick on MKII boosterpack
* https://www.ti.com/tool/BOOSTXL-EDUMKII
* Runs with an Educational BoosterPack MKII (BOOSTXL-EDUMKII). * This file contains the function prototypes for the software interface to the MKII BoosterPack. * This board support package (BSP) is an abstraction layer, * forming a bridge between the low-level hardware and the high-level software. * The Crystalfontz CFAF128128B-0145T color 128x128-pixel TFT LCD supports display updates up to 20 frames * per second (FPS) while only requiring a few lines to control the TFT LCD module through the SPI interface. This * module has a color depth of 262K colors and a contrast ratio of 350. The reference designator for the color LCD * is LCD1. More information on the color LCD can be found at
* https://www.crystalfontz.com * @version ECE319K v1.0 * @author Daniel Valvano and Jonathan Valvano * @copyright Copyright 2023 by Jonathan W. Valvano, valvano@mail.utexas.edu, * @warning AS-IS * @note For more information see http://users.ece.utexas.edu/~valvano/ * @date August 14, 2023 * \image html MKIIBoosterPack.png width=500px
MKII LCD pins
Pin Function Description
PB9 SPI1 SCLK J1.7 LCD SPI clock (SPI)
PB6 SPI1 CS0 J2.13 LCD SPI CS (SPI)
PB8 SPI1 PICO J2.15 LCD SPI data (SPI)
PB15GPIO J2.17 LCD !RST (digital)
PA13GPIO J4.31 LCD RS (digital)
******************************************************************************/ // J1 J3 J4 J2 // [ 1] [21] [40] [20] // [ 2] [22] [39] [19] // [ 3] [23] [38] [18] // [ 4] [24] [37] [17] // [ 5] [25] [36] [16] // [ 6] [26] [35] [15] // [ 7] [27] [34] [14] // [ 8] [28] [33] [13] // [ 9] [29] [32] [12] // [10] [30] [31] [11] // Connected pins in physical order // J1.1 +3.3V (power) // J1.2 joystick horizontal (X) (analog) {TM4C123 PB5/AIN11, MSP432 P6.0} // J1.3 UART from Bluetooth to LaunchPad (UART) {TM4C123 PB0, MSP432 P3.2} // J1.4 UART from LaunchPad to Bluetooth (UART) {TM4C123 PB1, MSP432 P3.3} // J1.5 joystick Select button (digital) {TM4C123 PE4, MSP432 P4.1} // J1.6 microphone (analog) {TM4C123 PE5/AIN8, MSP432 P4.3} // J1.7 LCD SPI clock (SPI) {TM4C123 PB4, MSP432 P1.5} // J1.8 ambient light (OPT3001) interrupt (digital) {TM4C123 PA5, MSP432 P4.6} // J1.9 ambient light (OPT3001) and temperature sensor (TMP006) I2C SCL (I2C) {TM4C123 PA6, MSP432 P6.5} // J1.10 ambient light (OPT3001) and temperature sensor (TMP006) I2C SDA (I2C) {TM4C123 PA7, MSP432 P6.4} //-------------------------------------------------- // J2.11 temperature sensor (TMP006) interrupt (digital) {TM4C123 PA2, MSP432 P3.6} // J2.12 nothing {TM4C123 PA3, MSP432 P5.2} // J2.13 LCD SPI CS (SPI) {TM4C123 PA4, MSP432 P5.0} // J2.14 nothing {TM4C123 PB6, MSP432 P1.7} // J2.15 LCD SPI data (SPI) {TM4C123 PB7, MSP432 P1.6} // J2.16 nothing (reset) // J2.17 LCD !RST (digital) {TM4C123 PF0, MSP432 P5.7} // J2.18 Profile 4 {TM4C123 PE0, MSP432 P3.0} // J2.19 servo PWM {TM4C123 PB2, MSP432 P2.5} // J2.20 GND (ground) //-------------------------------------------------- // J3.21 +5V (power) // J3.22 GND (ground) // J3.23 accelerometer X (analog) {TM4C123 PD0/AIN7, MSP432 P6.1} // J3.24 accelerometer Y (analog) {TM4C123 PD1/AIN6, MSP432 P4.0} // J3.25 accelerometer Z (analog) {TM4C123 PD2/AIN5, MSP432 P4.2} // J3.26 joystick vertical (Y) (analog) {TM4C123 PD3/AIN4, MSP432 P4.4} // J3.27 Profile 0 {TM4C123 PE1, MSP432 P4.5} // J3.28 Profile 1 {TM4C123 PE2, MSP432 P4.7} // J3.29 Profile 2 {TM4C123 PE3, MSP432 P5.4} // J3.30 Profile 3 {TM4C123 PF1, MSP432 P5.5} //-------------------------------------------------- // J4.31 LCD RS (digital) {TM4C123 PF4, MSP432 P3.7} // J4.32 user Button2 (bottom) (digital) {TM4C123 PD7, MSP432 P3.5} // J4.33 user Button1 (top) (digital) {TM4C123 PD6, MSP432 P5,1} // J4.34 Profile 6/gator hole switch {TM4C123 PC7, MSP432 P2.3} // J4.35 nothing {TM4C123 PC6, MSP432 P6.7} // J4.36 Profile 5 {TM4C123 PC5, MSP432 P6.6} // J4.37 RGB LED blue (PWM) {TM4C123 PC4, MSP432 P5.6} // J4.38 RGB LED green (PWM) {TM4C123 PB3, MSP432 P2.4} // J4.39 RGB LED red (jumper up) or LCD backlight (jumper down) (PWM) {TM4C123 PF3, MSP432 P2.6} // J4.40 buzzer (PWM) {TM4C123 PF2, MSP432 P2.7} //-------------------------------------------------- // Connected pins in logic order // power and reset // J1.1 +3.3V (power) // J3.21 +5V (power) // J3.22 GND (ground) // J2.20 GND (ground) // J2.16 nothing (reset) //-------------------------------------------------- // LCD graphics // J1.7 LCD SPI clock (SPI) {TM4C123 PB4, MSP432 P1.5} // J2.13 LCD SPI CS (SPI) {TM4C123 PA4, MSP432 P5.0} // J2.15 LCD SPI data (SPI) {TM4C123 PB7, MSP432 P1.6} // J2.17 LCD !RST (digital) {TM4C123 PF0, MSP432 P5.7} // J4.31 LCD RS (digital) {TM4C123 PF4, MSP432 P3.7} //-------------------------------------------------- // 3-color LED // J4.37 RGB LED blue (PWM) {TM4C123 PC4, MSP432 P5.6} // J4.38 RGB LED green (PWM) {TM4C123 PB3, MSP432 P2.4} // J4.39 RGB LED red (jumper up) or LCD backlight (jumper down) (PWM) {TM4C123 PF3, MSP432 P2.6} //-------------------------------------------------- // user buttons // J4.32 user Button2 (bottom) (digital) {TM4C123 PD7, MSP432 P3.5} // J4.33 user Button1 (top) (digital) {TM4C123 PD6, MSP432 P5.1} //-------------------------------------------------- // buzzer output // J4.40 buzzer (PWM) {TM4C123 PF2, MSP432 P2.7} //-------------------------------------------------- // Joystick // J1.5 joystick Select button (digital) {TM4C123 PE4, MSP432 P4.1} // J1.2 joystick horizontal (X) (analog) {TM4C123 PB5/AIN11, MSP432 P6.0} // J3.26 joystick vertical (Y) (analog) {TM4C123 PD3/AIN4, MSP432 P4.4} //-------------------------------------------------- // accelerometer // J3.23 accelerometer X (analog) {TM4C123 PD0/AIN7, MSP432 P6.1} // J3.24 accelerometer Y (analog) {TM4C123 PD1/AIN6, MSP432 P4.0} // J3.25 accelerometer Z (analog) {TM4C123 PD2/AIN5, MSP432 P4.2} //-------------------------------------------------- // microphone // J1.6 microphone (analog) {TM4C123 PE5/AIN8, MSP432 P4.3} //-------------------------------------------------- // light and temperature sensors (I2C) // J1.8 ambient light (OPT3001) interrupt (digital) {TM4C123 PA5, MSP432 P4.6} // J1.9 ambient light (OPT3001) and temperature sensor (TMP006) I2C SCL (I2C) {TM4C123 PA6, MSP432 P6.5} // J1.10 ambient light (OPT3001) and temperature sensor (TMP006) I2C SDA (I2C) {TM4C123 PA7, MSP432 P6.4} // J2.11 temperature sensor (TMP006) interrupt (digital) {TM4C123 PA2, MSP432 P3.6} //-------------------------------------------------- // Bluetooth booster // J1.3 UART from Bluetooth to LaunchPad (UART) {TM4C123 PB0, MSP432 P3.2} // J1.4 UART from LaunchPad to Bluetooth (UART) {TM4C123 PB1, MSP432 P3.3} //-------------------------------------------------- // profile pins // J3.27 Profile 0 {TM4C123 PE1, MSP432 P4.5} // J3.28 Profile 1 {TM4C123 PE2, MSP432 P4.7} // J3.29 Profile 2 {TM4C123 PE3, MSP432 P5.4} // J3.30 Profile 3 {TM4C123 PF1, MSP432 P5.5} // J2.18 Profile 4 {TM4C123 PE0, MSP432 P3.0} // J4.36 Profile 5 {TM4C123 PC5, MSP432 P6.6} // J4.34 Profile 6 {TM4C123 PC7, MSP432 P2.3} //-------------------------------------------------- // unconnected pins // J2.12 nothing {TM4C123 PA3, MSP432 P5.2} // J2.14 nothing {TM4C123 PB6, MSP432 P1.7} // J2.19 servo PWM {TM4C123 PB2, MSP432 P2.5} // J4.35 nothing {TM4C123 PC6, MSP432 P6.7} #ifndef __LCD_H__ #define __LCD_H__ /** * \brief The following constants are possible colors for the LCD in RGB format */ //color constants red grn blu #define LCD_BLACK 0x0000 // 0, 0, 0 #define LCD_BLUE 0x001F // 0, 0, 255 #define LCD_DARKBLUE 0x34BF // 50, 150, 255 #define LCD_RED 0xF800 // 255, 0, 0 #define LCD_GREEN 0x07E0 // 0, 255, 0 #define LCD_LIGHTGREEN 0x07EF // 0, 255, 120 #define LCD_ORANGE 0xFD60 // 255, 175, 0 #define LCD_CYAN 0x07FF // 0, 255, 255 #define LCD_MAGENTA 0xF81F // 255, 0, 255 #define LCD_YELLOW 0xFFE0 // 255, 255, 0 #define LCD_WHITE 0xFFFF // 255, 255, 255 #define LCD_GREY 0x8410 // 128, 128, 128 /** * \brief Set STANDARD_GALACTIC_ALPHABET to 1 for Commander Keen alphabet */ #define STANDARD_GALACTIC_ALPHABET 0 /** * Initialize Crystalfontz CFAF128128B-0145T color 128x128-pixel TFT LCD * BoosterPack pins * - J1.7 PB9 (SPI CLK) * - J2.13 PB6 (SPI CS) * - J2.15 PB8 (SPI MOSI) * - J2.17 PB15(LCD ~RST) and * - J4.31 PA13(LCD DC) * @param none * @return none * @brief Initialize MKII LCD * @note assumes GPIOA and GPIOB are reset and powered previously */ void LCD_Init(void); /** * Color the pixel at the given coordinates with the given color.
* Requires 13 bytes of transmission
* x must be less than 128
* x 0 is on the left, 126 is near the right
* y must be less than 128 * y 126 is near the wires, 0 is the side opposite the wires * @param x horizontal position of the pixel, columns from the left edge * @param y vertical position of the pixel, rows from the top edge * @param color 16-bit color, which can be produced by LCD_Color565() * @return none * @brief Color one pixel */ void LCD_DrawPixel(int16_t x, int16_t y, uint16_t color); /** * Draw a vertical line at the given coordinates with the given height and color.
* A vertical line is parallel to the longer side of the rectangular display
* Requires (11 + 2*h) bytes of transmission (assuming image fully on screen) * @param x horizontal position of the start of the line, columns from the left edge * @param y vertical position of the start of the line, rows from the top edge * @param h vertical height of the line * @param color 16-bit color, which can be produced by LCD_Color565() * @return none * @brief Draw a vertical line */ void LCD_DrawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color); /** * Draw a horizontal line at the given coordinates with the given width and color. * A horizontal line is parallel to the shorter side of the rectangular display
* Requires (11 + 2*w) bytes of transmission (assuming image fully on screen) * @param x horizontal position of the start of the line, columns from the left edge * @param y vertical position of the start of the line, rows from the top edge * @param w horizontal width of the line * @param color 16-bit color, which can be produced by LCD_Color565() * @return none * @brief Draw a horizontal line */ void LCD_DrawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color); /** * Fill the screen with the given color.
* Requires 33,293 bytes of transmission * @param color 16-bit color, which can be produced by LCD_Color565() * @return none * @brief Fill the screen */ void LCD_FillScreen(uint16_t color); /** * Draw a filled rectangle at the given coordinates with the given width, height, and color.
* Requires (11 + 2*w*h) bytes of transmission (assuming image fully on screen) * @param x horizontal position of the top left corner of the rectangle, columns from the left edge * @param y vertical position of the top left corner of the rectangle, rows from the top edge * @param w horizontal width of the rectangle * @param h vertical height of the rectangle * @param color 16-bit color, which can be produced by LCD_Color565() * @return none * @brief Draw a filled rectangle */ void LCD_FillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color); /** * Pass 8-bit (each) R,G,B and get back 16-bit packed color. * @param r red value * @param g green value * @param b blue value * @return 16-bit color * @brief RGB to color creation */ uint16_t LCD_Color565(uint8_t r, uint8_t g, uint8_t b); /** * Swaps the red and blue values of the given 16-bit packed color; * green is unchanged. * @param x 16-bit color in format B, G, R * @return 16-bit color in format R, G, B * @brief Swaps red and blue */ uint16_t LCD_SwapColor(uint16_t x); /** * Displays a 16-bit color BMP image. A bitmap file that is created * by a PC image processing program has a header and may be padded * with dummy columns so the data have four byte alignment. This * function assumes that all of that has been stripped out, and the * array image[] has one 16-bit halfword for each pixel to be * displayed on the screen (encoded in reverse order, which is * standard for bitmap files). An array can be created in this * format from a 24-bit-per-pixel .bmp file using the associated * BmpConvert16.exe converter program. * (x,y) is the screen location of the lower left corner of BMP image
* Requires (11 + 2*w*h) bytes of transmission (assuming image fully on screen) * @param x horizontal position of the bottom left corner of the image, columns from the left edge * @param y vertical position of the bottom left corner of the image, rows from the top edge * @param image pointer to a 16-bit color BMP image * @param w number of pixels wide * @param h number of pixels tall * @note Must be less than or equal to 128 pixels wide by 128 pixels high * @return none * @brief Displays a BMP image */ void LCD_DrawBitmap(int16_t x, int16_t y, const uint16_t *image, int16_t w, int16_t h); /** * Simple character draw function. This is the same function from * Adafruit_GFX.c but adapted for this processor. However, each call * to LCD_DrawPixel() calls setAddrWindow(), which needs to send * many extra data and commands. If the background color is the same * as the text color, no background will be printed, and text can be * drawn right over existing images without covering them with a box.
* Requires (11 + 2*size*size)*6*8 bytes of transmission (image fully on screen; textcolor != bgColor) * @param x horizontal position of the top left corner of the character, columns from the left edge * @param y vertical position of the top left corner of the character, rows from the top edge * @param c character to be printed * @param textColor 16-bit color of the character * @param bgColor 16-bit color of the background * @param size number of pixels per character pixel (e.g. size==2 prints each pixel of font as 2x2 square) * @return none * @brief Draw a character */ void LCD_DrawCharS(int16_t x, int16_t y, char c, int16_t textColor, int16_t bgColor, uint8_t size); /** * Advanced character draw function. This is similar to the function * from Adafruit_GFX.c but adapted for this processor. However, this * function only uses one call to setAddrWindow(), which allows it to * run at least twice as fast.
* Requires (11 + size*size*6*8) bytes of transmission (assuming image fully on screen) * @param x horizontal position of the top left corner of the character, columns from the left edge * @param y vertical position of the top left corner of the character, rows from the top edge * @param c character to be printed * @param textColor 16-bit color of the character * @param bgColor 16-bit color of the background * @param size number of pixels per character pixel (e.g. size==2 prints each pixel of font as 2x2 square) * @return none * @brief Draw a character */ void LCD_DrawChar(int16_t x, int16_t y, char c, int16_t textColor, int16_t bgColor, uint8_t size); /** * String draw function. * 13 rows (0 to 12) and 21 characters (0 to 20)
* Requires (11 + size*size*6*8) bytes of transmission for each character * @param x columns from the left edge (0 to 20) * @param y rows from the top edge (0 to 12) * @param pt pointer to a null terminated string to be printed * @param textColor 16-bit color of the characters * @return number of characters printed * @note bgColor is Black and size is 1 * @brief Draw a string */ uint32_t LCD_DrawString(uint16_t x, uint16_t y, char *pt, int16_t textColor); /** * Move the cursor to the desired X- and Y-position. The * next character of the next unsigned decimal will be * printed here. X=0 is the leftmost column. Y=0 is the top row. * The cursor is used by the "Out" functions, but not the "Draw" functions * @param newX new X-position of the cursor (0<=newX<=20) * @param newY new Y-position of the cursor (0<=newY<=12) * @return none * @brief Move the cursor */ void LCD_SetCursor(uint32_t newX, uint32_t newY); /** * Output a 32-bit number in unsigned decimal format * Position determined by LCD_SetCursor command * @param n 32-bit number to be transferred * @param textColor 16-bit color of the numbers * @return none * @note Variable format 1-10 digits with no space before or after * @brief Output an unsigned decimal */ void LCD_OutUDec(uint32_t n, int16_t textColor); /** * Output a 32-bit number in unsigned 4-digit decimal format * with no space before or after. * Position determined by LCD_SetCursor command * @param n 32-bit number to be transferred * @param textColor 16-bit color of the numbers * @return none * @note Fixed format 4 digits with no space before or after * @brief Output a 4-digit unsigned decimal */ void LCD_OutUDec4(uint32_t n, int16_t textColor); /** * Output a 32-bit number in unsigned 5-digit decimal format * Position determined by LCD_SetCursor command * @param n 32-bit number to be transferred * @param textColor 16-bit color of the numbers * @return none * @note Fixed format 5 digits with no space before or after * @brief Output a 5-digit unsigned decimal */ void LCD_OutUDec5(uint32_t n, int16_t textColor); /** * Output a 32-bit number in unsigned 3-digit fixed point, 0.1 resolution * numbers 0 to 999 printed as " 0.0" to "99.9" * Position determined by LCD_SetCursor command * @param n 32-bit number to be transferred * @param textColor 16-bit color of the numbers * @return none * @note Fixed format 4 characters with no space before or after * @brief Output a 2-digit fixed-point decimal */ void LCD_OutUFix2_1(uint32_t n, int16_t textColor); /** * Output a 32-bit number in unsigned 2-digit hexadecimal format * numbers 0 to 255 printed as "00," to "FF," * Position determined by LCD_SetCursor command * @param n 32-bit number to be transferred * @param textColor 16-bit color of the numbers * @return none * @note Fixed format 3 characters with comma after * @brief Output a 2-digit hexadecimal number */ void LCD_OutUHex2(uint32_t n, int16_t textColor); /** * Output one character to the LCD * Position determined by LCD_SetCursor command * Color set by LCD_SetTextColor * @param ch 8-bit ASCII character * @return none * @brief Output a character */ void LCD_OutChar(char ch); /** * Print a string of characters to the ST7735 LCD. * Position determined by LCD_SetCursor command * Color set by LCD_SetTextColor * The string will not automatically wrap. * @param ptr pointer to NULL-terminated ASCII string * @return none * @brief Output a string */ void LCD_OutString(char *ptr); /** * Sets the color in which the characters will be printed * Background color is fixed at black * @param color 16-bit packed color * @return none * @brief sets the text color */ void LCD_SetTextColor(uint16_t color); /** * Set up the axes, labels, and other variables to * allow data to be plotted in a chart using the * functions LCD_PlotPoint() and * LCD_PlotIncrement(). * If yLabel2 is empty string, no yLabel2 is printed, and yLabel1 is centered * @param axisColor 16-bit color for axes, which can be produced by LCD_Color565() * @param bgColor 16-bit color for plot background, which can be produced by LCD_Color565() * @param xLabel pointer to a null terminated string for x-axis (~4 character space) * @param yLabel1 pointer to a null terminated string for top of y-axis (~3-5 character space) * @param label1Color 16-bit color for y-axis label1, which can be produced by LCD_Color565() * @param yLabel2 pointer to a null terminated string for bottom of y-axis (~3 character space) * @param label2Color 16-bit color for y-axis label2, which can be produced by LCD_Color565() * @param ymax maximum value to be printed * @param ymin minimum value to be printed * @return none * @note Assumes: LCD_Init() has been called * @brief Initializes a plot */ void LCD_Drawaxes(uint16_t axisColor, uint16_t bgColor, char *xLabel, char *yLabel1, uint16_t label1Color, char *yLabel2, uint16_t label2Color, int32_t ymax, int32_t ymin); /** * Plot a point on the chart. To plot several points in the * same column, call this function repeatedly before calling * LCD_PlotIncrement(). The units of the data are the * same as the ymax and ymin values specified in the * initialization function. * @param data1 value to be plotted (units not specified) * @param color1 16-bit color for the point, which can be produced by LCD_Color565() * @return none * @note Assumes: LCD_Init() and LCD_Drawaxes() have been called * @brief Plot one point */ void LCD_PlotPoint(int32_t data1, uint16_t color1); /** * Increment the plot between subsequent calls to // LCD_PlotPoint(). Automatically wrap and clear the // column to be printed to. * @param none * @return none * @note Assumes: LCD_Init() and LCD_Drawaxes() have been called * @brief Moves the plot cursor in time */ void LCD_PlotIncrement(void); #endif /** @}*/