#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