Last active
December 27, 2015 17:39
-
-
Save tmeissner/7363439 to your computer and use it in GitHub Desktop.
C tool to use a ST7565-LCD with Raspberry Pi
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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