Skip to content

Instantly share code, notes, and snippets.

@tmeissner
Last active December 27, 2015 17:39
Show Gist options
  • Save tmeissner/7363439 to your computer and use it in GitHub Desktop.
Save tmeissner/7363439 to your computer and use it in GitHub Desktop.
C tool to use a ST7565-LCD with Raspberry Pi
#include <stdio.h>
#include <bcm2835.h>
// pin defines
#define LCD_CS 24
#define LCD_RST 23
#define LCD_A0 22
#define LCD_CLK 27
#define LCD_SI 17
// character set
const unsigned char font_5x7[][5] = {
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, /* - 0x20 - 32 */
{ 0x00, 0x00, 0x5f, 0x00, 0x00 }, /* ! - 0x21 - 33 */
{ 0x00, 0x07, 0x00, 0x07, 0x00 }, /* " - 0x22 - 34 */
{ 0x14, 0x7f, 0x14, 0x7f, 0x14 }, /* # - 0x23 - 35 */
{ 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, /* $ - 0x24 - 36 */
{ 0x23, 0x13, 0x08, 0x64, 0x62 }, /* % - 0x25 - 37 */
{ 0x36, 0x49, 0x55, 0x22, 0x50 }, /* & - 0x26 - 38 */
{ 0x00, 0x05, 0x03, 0x00, 0x00 }, /* ' - 0x27 - 39 */
{ 0x00, 0x1c, 0x22, 0x41, 0x00 }, /* ( - 0x28 - 40 */
{ 0x00, 0x41, 0x22, 0x1c, 0x00 }, /* ) - 0x29 - 41 */
{ 0x14, 0x08, 0x3e, 0x08, 0x14 }, /* * - 0x2a - 42 */
{ 0x08, 0x08, 0x3e, 0x08, 0x08 }, /* + - 0x2b - 43 */
{ 0x00, 0x50, 0x30, 0x00, 0x00 }, /* , - 0x2c - 44 */
{ 0x08, 0x08, 0x08, 0x08, 0x08 }, /* - - 0x2d - 45 */
{ 0x00, 0x60, 0x60, 0x00, 0x00 }, /* . - 0x2e - 46 */
{ 0x20, 0x10, 0x08, 0x04, 0x02 }, /* / - 0x2f - 47 */
{ 0x3e, 0x51, 0x49, 0x45, 0x3e }, /* 0 - 0x30 - 48 */
{ 0x00, 0x42, 0x7f, 0x40, 0x00 }, /* 1 - 0x31 - 49 */
{ 0x42, 0x61, 0x51, 0x49, 0x46 }, /* 2 - 0x32 - 50 */
{ 0x21, 0x41, 0x45, 0x4b, 0x31 }, /* 3 - 0x33 - 51 */
{ 0x18, 0x14, 0x12, 0x7f, 0x10 }, /* 4 - 0x34 - 52 */
{ 0x27, 0x45, 0x45, 0x45, 0x39 }, /* 5 - 0x35 - 53 */
{ 0x3c, 0x4a, 0x49, 0x49, 0x30 }, /* 6 - 0x36 - 54 */
{ 0x01, 0x71, 0x09, 0x05, 0x03 }, /* 7 - 0x37 - 55 */
{ 0x36, 0x49, 0x49, 0x49, 0x36 }, /* 8 - 0x38 - 56 */
{ 0x06, 0x49, 0x49, 0x29, 0x1e }, /* 9 - 0x39 - 57 */
{ 0x00, 0x36, 0x36, 0x00, 0x00 }, /* : - 0x3a - 58 */
{ 0x00, 0x56, 0x36, 0x00, 0x00 }, /* ; - 0x3b - 59 */
{ 0x08, 0x14, 0x22, 0x41, 0x00 }, /* < - 0x3c - 60 */
{ 0x14, 0x14, 0x14, 0x14, 0x14 }, /* = - 0x3d - 61 */
{ 0x00, 0x41, 0x22, 0x14, 0x08 }, /* > - 0x3e - 62 */
{ 0x02, 0x01, 0x51, 0x09, 0x06 }, /* ? - 0x3f - 63 */
{ 0x32, 0x49, 0x79, 0x41, 0x3e }, /* @ - 0x40 - 64 */
{ 0x7e, 0x11, 0x11, 0x11, 0x7e }, /* A - 0x41 - 65 */
{ 0x7f, 0x49, 0x49, 0x49, 0x36 }, /* B - 0x42 - 66 */
{ 0x3e, 0x41, 0x41, 0x41, 0x22 }, /* C - 0x43 - 67 */
{ 0x7f, 0x41, 0x41, 0x22, 0x1c }, /* D - 0x44 - 68 */
{ 0x7f, 0x49, 0x49, 0x49, 0x41 }, /* E - 0x45 - 69 */
{ 0x7f, 0x09, 0x09, 0x09, 0x01 }, /* F - 0x46 - 70 */
{ 0x3e, 0x41, 0x49, 0x49, 0x7a }, /* G - 0x47 - 71 */
{ 0x7f, 0x08, 0x08, 0x08, 0x7f }, /* H - 0x48 - 72 */
{ 0x00, 0x41, 0x7f, 0x41, 0x00 }, /* I - 0x49 - 73 */
{ 0x20, 0x40, 0x41, 0x3f, 0x01 }, /* J - 0x4a - 74 */
{ 0x7f, 0x08, 0x14, 0x22, 0x41 }, /* K - 0x4b - 75 */
{ 0x7f, 0x40, 0x40, 0x40, 0x40 }, /* L - 0x4c - 76 */
{ 0x7f, 0x02, 0x0c, 0x02, 0x7f }, /* M - 0x4d - 77 */
{ 0x7f, 0x04, 0x08, 0x10, 0x7f }, /* N - 0x4e - 78 */
{ 0x3e, 0x41, 0x41, 0x41, 0x3e }, /* O - 0x4f - 79 */
{ 0x7f, 0x09, 0x09, 0x09, 0x06 }, /* P - 0x50 - 80 */
{ 0x3e, 0x41, 0x51, 0x21, 0x5e }, /* Q - 0x51 - 81 */
{ 0x7f, 0x09, 0x19, 0x29, 0x46 }, /* R - 0x52 - 82 */
{ 0x46, 0x49, 0x49, 0x49, 0x31 }, /* S - 0x53 - 83 */
{ 0x01, 0x01, 0x7f, 0x01, 0x01 }, /* T - 0x54 - 84 */
{ 0x3f, 0x40, 0x40, 0x40, 0x3f }, /* U - 0x55 - 85 */
{ 0x1f, 0x20, 0x40, 0x20, 0x1f }, /* V - 0x56 - 86 */
{ 0x3f, 0x40, 0x38, 0x40, 0x3f }, /* W - 0x57 - 87 */
{ 0x63, 0x14, 0x08, 0x14, 0x63 }, /* X - 0x58 - 88 */
{ 0x07, 0x08, 0x70, 0x08, 0x07 }, /* Y - 0x59 - 89 */
{ 0x61, 0x51, 0x49, 0x45, 0x43 }, /* Z - 0x5a - 90 */
{ 0x00, 0x7f, 0x41, 0x41, 0x00 }, /* [ - 0x5b - 91 */
{ 0x02, 0x04, 0x08, 0x10, 0x20 }, /* \ - 0x5c - 92 */
{ 0x00, 0x41, 0x41, 0x7f, 0x00 }, /* ] - 0x5d - 93 */
{ 0x04, 0x02, 0x01, 0x02, 0x04 }, /* ^ - 0x5e - 94 */
{ 0x40, 0x40, 0x40, 0x40, 0x40 }, /* _ - 0x5f - 95 */
{ 0x00, 0x01, 0x02, 0x04, 0x00 }, /* ` - 0x60 - 96 */
{ 0x20, 0x54, 0x54, 0x54, 0x78 }, /* a - 0x61 - 97 */
{ 0x7f, 0x48, 0x44, 0x44, 0x38 }, /* b - 0x62 - 98 */
{ 0x38, 0x44, 0x44, 0x44, 0x20 }, /* c - 0x63 - 99 */
{ 0x38, 0x44, 0x44, 0x48, 0x7f }, /* d - 0x64 - 100 */
{ 0x38, 0x54, 0x54, 0x54, 0x18 }, /* e - 0x65 - 101 */
{ 0x08, 0x7e, 0x09, 0x01, 0x02 }, /* f - 0x66 - 102 */
{ 0x38, 0x44, 0x44, 0x54, 0x34 }, /* g - 0x67 - 103 */
{ 0x7f, 0x08, 0x04, 0x04, 0x78 }, /* h - 0x68 - 104 */
{ 0x00, 0x44, 0x7d, 0x40, 0x00 }, /* i - 0x69 - 105 */
{ 0x20, 0x40, 0x44, 0x3d, 0x00 }, /* j - 0x6a - 106 */
{ 0x7f, 0x10, 0x28, 0x44, 0x00 }, /* k - 0x6b - 107 */
{ 0x00, 0x41, 0x7f, 0x40, 0x00 }, /* l - 0x6c - 108 */
{ 0x7c, 0x04, 0x18, 0x04, 0x78 }, /* m - 0x6d - 109 */
{ 0x7c, 0x08, 0x04, 0x04, 0x78 }, /* n - 0x6e - 110 */
{ 0x38, 0x44, 0x44, 0x44, 0x38 }, /* o - 0x6f - 111 */
{ 0x7c, 0x14, 0x14, 0x14, 0x08 }, /* p - 0x70 - 112 */
{ 0x08, 0x14, 0x14, 0x18, 0x7c }, /* q - 0x71 - 113 */
{ 0x7c, 0x08, 0x04, 0x04, 0x08 }, /* r - 0x72 - 114 */
{ 0x48, 0x54, 0x54, 0x54, 0x20 }, /* s - 0x73 - 115 */
{ 0x04, 0x3f, 0x44, 0x40, 0x20 }, /* t - 0x74 - 116 */
{ 0x3c, 0x40, 0x40, 0x20, 0x7c }, /* u - 0x75 - 117 */
{ 0x1c, 0x20, 0x40, 0x20, 0x1c }, /* v - 0x76 - 118 */
{ 0x3c, 0x40, 0x30, 0x40, 0x3c }, /* w - 0x77 - 119 */
{ 0x44, 0x28, 0x10, 0x28, 0x44 }, /* x - 0x78 - 120 */
{ 0x0c, 0x50, 0x50, 0x50, 0x3c }, /* y - 0x79 - 121 */
{ 0x44, 0x64, 0x54, 0x4c, 0x44 }, /* z - 0x7a - 122 */
{ 0x00, 0x08, 0x36, 0x41, 0x00 }, /* { - 0x7b - 123 */
{ 0x00, 0x00, 0x7f, 0x00, 0x00 }, /* | - 0x7c - 124 */
{ 0x00, 0x41, 0x36, 0x08, 0x00 }, /* } - 0x7d - 125 */
{ 0x10, 0x08, 0x08, 0x10, 0x08 }, /* ~ - 0x7e - 126 */
};
// raspberry picture
const unsigned char picture[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xF0,0xF8,0x58,0x1C,0x1C,0x0C,0x0C,0x06,0x86,0x86,0x86,0x0E,
0x0E,0x06,0x0E,0x1E,0x1C,0x1C,0x0C,0x3C,0x38,0x78,0xF0,0xE0,0xC0,0xC0,0xE0,0x70,
0x38,0x18,0x1C,0x1C,0x0C,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x86,0x86,0x06,0x04,0x0C,
0x0C,0x18,0xF8,0xF8,0xF8,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x03,0x0F,0x3F,0x7C,0xF0,0xC0,0xC0,0xC0,0xC0,0x00,0x01,0x01,
0x03,0x02,0x06,0x04,0x04,0x1C,0xB8,0xF0,0xE0,0x70,0x30,0x1F,0x0F,0x0F,0x3F,0x30,
0xF0,0xE0,0xB0,0x18,0x08,0x0C,0x04,0x06,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0xC0,
0xF0,0xF8,0x7F,0x1F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0xF3,0x33,0x3F,0x1F,0x1E,0x0E,0x0E,
0x0C,0x0C,0xEC,0xEC,0xEE,0xBE,0x0F,0x0F,0x07,0x06,0x02,0x02,0x02,0x02,0x02,0x06,
0x06,0x0F,0x0F,0xBE,0xEE,0xCC,0x8C,0x0C,0x0C,0x0C,0x0E,0x1E,0x1E,0x3F,0x73,0xE1,
0xC1,0x00,0x36,0x25,0x55,0x5D,0x49,0x6D,0x32,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x80,0xC0,0xE0,0x70,0x7F,0x7F,0x3F,0xFC,0xFC,0xFC,0x3C,0x1C,0x0E,
0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x02,0x06,0x0E,0x1C,0xFC,0xFC,0xFC,0x3C,0x0E,
0x06,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x07,0x06,0x0C,0x18,0x78,0xF0,0xF0,0x33,
0x7F,0x7F,0x70,0xF0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0x83,0x00,0x00,0x00,0x00,0xC0,0xFF,0xFF,0xF0,0xF0,0xF0,0x80,
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0x60,0x78,0x7F,0x7F,0x7F,0x7C,0x70,
0xE0,0xC0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0xE0,0xFF,0xFF,0xC0,
0x00,0x00,0x00,0x00,0xC3,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x03,0x0F,0x3E,0xFC,0xFC,0x0E,0x03,0x03,0x03,0x03,0x07,0x07,0x0F,
0x1F,0x3F,0x7F,0xFF,0xFF,0x07,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x01,0x03,0xFF,0xFF,0x7F,0x1F,0x0F,0x07,0x07,0x03,0x01,0x01,0x01,0x01,
0x03,0xFE,0xFE,0x7E,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0x1F,0x3C,0x78,0x70,0xE0,0xE0,0xE0,0xC0,
0xC0,0xC0,0xC0,0xE1,0xFF,0x7F,0x7F,0x3C,0x3C,0x3C,0x38,0x30,0x30,0x30,0x30,0x38,
0x38,0x3C,0x3C,0x7F,0xFF,0xE1,0xC0,0xC0,0xC0,0xC0,0xC0,0xE0,0x60,0x70,0x38,0x38,
0x1E,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,
0x01,0x03,0x03,0x07,0x07,0x0E,0x18,0x18,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
0x38,0x18,0x1C,0x1E,0x0F,0x07,0x03,0x03,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
// lcd init values
const unsigned char lcd_init_data[] = {
0xa0, // cmd8: adc select
0xc0, // cmd15: shl select
0xa3, // cmd11: lcd bias set
0x2c, // cmd16: power control set (vc=1, vr=0, vf=0)
0x2e, // cmd16: power control set (vc=1, vr=1, vf=0)
0x2f, // cmd16: power control set (vc=1, vr=1, vf=1)
0x26, // cmd17: regulator resistor select
0x60, // cmd2: display start line
0xa6, // cmd6: display normal
0xc8, // cmd15: common output mode select (reversed)
0xaf, // cmd1: display on
0xa4, // cmd10: all points off
0x81, // cmd18: set volume 1st
0x18 // cmd18: set volume 2nd (brightness)
};
// function declarations
void io_init ();
void lcd_init ();
void lcd_ascii57_string (int xpos, int ypos, unsigned char data[], int length);
void lcd_ascii57 (int xpos, int ypos, unsigned char data);
void lcd_picture (int xpos, int ypos);
void lcd_clear ();
void lcd_set_page (int page, int column);
void lcd_transfer_data (unsigned char value, int si);
void lcd_byte (unsigned char data);
// initialise the raspberry pi gpios
void io_init () {
bcm2835_gpio_fsel(LCD_CS, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_fsel(LCD_RST, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_fsel(LCD_A0, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_fsel(LCD_CLK, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_fsel(LCD_SI, BCM2835_GPIO_FSEL_OUTP);
}
// initialise the lcd controller
void lcd_init () {
// reset
bcm2835_gpio_write(LCD_CS, HIGH);
bcm2835_delayMicroseconds(1);
bcm2835_gpio_write(LCD_RST, LOW);
bcm2835_delayMicroseconds(1);
bcm2835_gpio_write(LCD_RST, HIGH);
bcm2835_delayMicroseconds(1);
// init routine
for (int i = 0; i <= sizeof(lcd_init_data) / sizeof(unsigned char); i++) {
lcd_transfer_data(lcd_init_data[i], 0);
}
lcd_clear();
}
// transfer one ascii string at a given position in the lcd ram
void lcd_ascii57_string (int xpos, int ypos, unsigned char data[], int length) {
for (int i= 0; i <= length; i++) {
lcd_ascii57(xpos + i * 6, ypos, data[i] - 32);
}
}
// transfer one ascii char a a given position in the lcd ram
void lcd_ascii57 (int xpos, int ypos, unsigned char data) {
lcd_set_page(ypos, xpos);
// write one 5x7 char
for (int i = 0; i <= 4; i++) {
lcd_transfer_data(font_5x7[data][i], 1);
}
// one free column between chars
lcd_transfer_data(0x00, 1);
}
// transfer a picture by writing all lcd ram cells
void lcd_picture (int xpos, int ypos) {
for (int i = 0; i <= 7; i++) {
lcd_set_page(ypos + i, xpos);
for (int j = 128 * i; j <= 128 * (i + 1) - 1; j++) {
lcd_transfer_data(picture[j], 1);
}
}
}
// clear all lcd ram cells
void lcd_clear () {
bcm2835_gpio_write(LCD_CS, LOW);
for (int i = 0; i <= 7; i++) {
lcd_set_page(i, 0);
for (int j = 0; j <= 128; j++) {
lcd_transfer_data(0x00, 1);
}
}
bcm2835_gpio_write(LCD_CS, HIGH);
}
// set lcd ram page / column
void lcd_set_page (int page, int column) {
unsigned char lsb = column & 0x0f;
unsigned char msb = column & 0xf0;
msb = msb >> 4;
msb = msb | 0x10;
page = page | 0xb0;
lcd_transfer_data(page, 0);
lcd_transfer_data(msb, 0);
lcd_transfer_data(lsb, 0);
}
// transfer one byte to lcd ram
void lcd_transfer_data (unsigned char value, int si) {
bcm2835_gpio_write(LCD_CS, LOW);
bcm2835_gpio_write(LCD_CLK, HIGH);
if (si) {
bcm2835_gpio_write(LCD_A0, HIGH);
} else {
bcm2835_gpio_write(LCD_A0, LOW);
}
lcd_byte(value);
bcm2835_gpio_write(LCD_CS, HIGH);
}
// write one byte
void lcd_byte (unsigned char data) {
for (int i = 0; i <= 7; i++) {
bcm2835_delayMicroseconds(1);
bcm2835_gpio_write(LCD_CLK, LOW);
if (data & 0x80) {
bcm2835_gpio_write(LCD_SI, HIGH);
} else {
bcm2835_gpio_write(LCD_SI, LOW);
}
data = data << 1;
bcm2835_delayMicroseconds(1);
bcm2835_gpio_write(LCD_CLK, HIGH);
}
}
int main(int argc, char **argv) {
unsigned char hello[] = "raspiFPGA 0.1";
unsigned char world[] = "(c) raspiDEV 2013";
unsigned char cpu[] = "cpu: ";
unsigned char point[] = ".";
unsigned char na[] = "n/a";
if (!bcm2835_init()) {
printf("Could not initialise BCM2835 lib\n");
return 1;
}
io_init();
lcd_init();
lcd_picture(0, 0);
bcm2835_delay(2000);
lcd_clear();
lcd_ascii57_string(1, 0, hello, sizeof(hello) / sizeof(unsigned char)-1);
lcd_ascii57_string(1, 1, world, sizeof(world) / sizeof(unsigned char)-1);
lcd_ascii57_string(1, 2, cpu, sizeof(cpu) / sizeof(unsigned char)-1);
// open cpu temp file
FILE *file = fopen("/sys/class/thermal/thermal_zone0/temp", "r" );
// read cpu temp file and print temp value on lcd
if (file == 0) {
printf("Could not open file\n");
lcd_ascii57_string(30, 2, na, sizeof(na) / sizeof(unsigned char)-1);
} else {
int x;
int i = 5;
while ((x = fgetc(file)) != EOF) {
lcd_ascii57(1 + i * 6, 2, x - 32);
i = i + 1;
if (i == 7) {
lcd_ascii57_string(1 + i * 6, 2, point, sizeof(point) / sizeof(unsigned char)-1);
i = i + 1;
}
}
fclose( file );
}
bcm2835_close();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment