-
Notifications
You must be signed in to change notification settings - Fork 26
/
hwlib-glcd-5510.hpp
151 lines (128 loc) · 3.53 KB
/
hwlib-glcd-5510.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// ==========================================================================
//
// File : hwlib-console.hpp
// Part of : C++ hwlib library for close-to-the-hardware OO programming
// Copyright : wouter@voti.nl 2017
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
// ==========================================================================
// this file contains Doxygen lines
/// @file
#ifndef HWLIB_GLCD_5510_H
#define HWLIB_GLCD_5510_H
#include <hwlib-graphics.hpp>
namespace hwlib {
/// \brief
/// Nokia 5510 B/W graphics LCD library
/// \details
/// This class implements an interface to the type of LCD
/// that was used in older Nokia telephones.
/// It is a 84 columns x 48 lines black-and-white LCD.
///
/// This type of LCD is cheap and available from lots of sources,
/// but the quality is often abominable.
///
/// \image html lcd5510-empty.jpg
///
class glcd_5510 : public window {
private:
pin_out & sce;
pin_out & res;
pin_out & dc;
pin_out & sdin;
pin_out & sclk;
void send_byte( unsigned char d ){
for( uint_fast8_t i = 0; i < 8; i++ ){
sdin.set( d & 0x80 );
sclk.set( 1 );
d = d << 1;
sclk.set( 0 );
}
}
void command( unsigned char d ){
dc.set( 0 );
sce.set( 0 );
send_byte( d );
sce.set( 1 );
}
void data( unsigned char d ){
dc.set( 1 );
sce.set( 0 );
send_byte( d );
sce.set( 1 );
}
void pixels(
unsigned char x,
unsigned char y,
unsigned char d
){
command( 0x80 | x );
command( 0x40 | y );
data( d );
}
public:
/// \brief
/// create a 5510 LCD
/// \details
/// This constructor creates a 5510 LCD from its interface pins.
glcd_5510(
pin_out & sce,
pin_out & res,
pin_out & dc,
pin_out & sdin,
pin_out & sclk
)
: window{ location{ 84, 48 }, black, white },
sce( sce ), res( res ), dc( dc ), sdin( sdin ), sclk( sclk )
{
sclk.set( 0 );
wait_ms( 1 );
sce.set( 1 );
wait_ms( 1 );
res.set( 0 );
wait_ms( 1 );
res.set( 1 );
wait_ms( 1 );
// initialization according to
// https://www.sparkfun.com/products/10168 - nee, andere
command( 0x21 ); // select exteded instructions
command( 0xC8 ); // Vop = 110000b
command( 0x06 ); // TCx = 00b
command( 0x13 ); // BSx = 100b
command( 0x20 ); // select basic instructions, horizontal addressing
command( 0x0C ); // normal mode
}
private:
unsigned char pixel_buffer[ 504 ];
void write_implementation(
location pos,
color col,
buffering buf
) override {
uint_fast8_t a = pos.x + ( pos.y / 8 ) * 84;
uint_fast8_t m = 1 << ( pos.y % 8 );
if( col == black ){
pixel_buffer[ a ] |= m;
} else {
pixel_buffer[ a ] &= ~m;
}
if( buf == buffering::unbuffered ){
pixels( pos.x, pos.y / 8, pixel_buffer[ a ] );
}
}
public:
void clear( buffering buf ) override {
unsigned char d = (( background == white ) ? 0 : 0xFF );
command( 0x80 | 0 );
command( 0x40 | 0 );
for( uint_fast8_t i = 0; i < 504; i++ ){
pixel_buffer[ i ] = d;
data( d );
}
}
}; // class glcd_5510
}; // namespace hwlib
#endif // HWLIB_GLCD_5510_H