-
Notifications
You must be signed in to change notification settings - Fork 0
/
ssd1306.c
164 lines (130 loc) · 4.24 KB
/
ssd1306.c
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
152
153
154
155
156
157
158
159
160
161
162
163
164
#include "ssd1306.h"
#include "i2c.h"
#include <stdint.h>
#include "data.h"
#define slaveAddress 0x3c
void ssd1306_command(uint8_t c){
uint8_t control = 0x00;
char arr[2] = {control, c};
// I2CSendSingleByte(slaveAddress, control);
// I2CSendSingleByte(slaveAddress, c);
I2CSendMultipleBytes(slaveAddress, 2, arr);
}
void ssd1306_data(uint8_t c){
char arr[2] = {0x40, c};
// I2CSendSingleByte(slaveAddress, 0x40);
// I2CSendSingleByte(slaveAddress, c);
I2CSendMultipleBytes(slaveAddress, 2, arr);
}
void setColAddress(){
ssd1306_command(SSD1306_COLUMNADDR); // 0x21 COMMAND
ssd1306_command(0); // Column start address
ssd1306_command(SSD1306_LCDWIDTH-1); // Column end address
}
void setPageAddress(){
ssd1306_command(SSD1306_PAGEADDR); // 0x22 COMMAND
ssd1306_command(0); // Start Page address
ssd1306_command((SSD1306_LCDHEIGHT/8)-1);// End Page address
}
void InitializeDisplay(){
// Init sequence for 128x64 OLED module
ssd1306_command(SSD1306_DISPLAYOFF); // 0xAE
ssd1306_command(SSD1306_SETDISPLAYCLOCKDIV); // 0xD5
ssd1306_command(0x80); // the suggested ratio 0x80
ssd1306_command(SSD1306_SETMULTIPLEX); // 0xA8
ssd1306_command(0x3F);
ssd1306_command(SSD1306_SETDISPLAYOFFSET); // 0xD3
ssd1306_command(0x0); // no offset
ssd1306_command(SSD1306_SETSTARTLINE);// | 0x0); // line #0
ssd1306_command(SSD1306_CHARGEPUMP); // 0x8D
ssd1306_command(0x14); // using internal VCC
//ssd1306_command(SSD1306_MEMORYMODE); // 0x20
//ssd1306_command(0x00); // 0x00 horizontal addressing
ssd1306_command(SSD1306_SEGREMAP | 0x1); // rotate screen 180
//ssd1306_command(SSD1306_COMSCANDEC); // rotate screen 180
ssd1306_command(SSD1306_SETCOMPINS); // 0xDA
ssd1306_command(0x12);
ssd1306_command(SSD1306_SETCONTRAST); // 0x81
ssd1306_command(0xCF);
ssd1306_command(SSD1306_SETPRECHARGE); // 0xd9
ssd1306_command(0xF1);
ssd1306_command(SSD1306_SETVCOMDETECT); // 0xDB
ssd1306_command(0x40);
ssd1306_command(SSD1306_DISPLAYALLON_RESUME); // 0xA4
ssd1306_command(SSD1306_NORMALDISPLAY); // 0xA6
ssd1306_command(SSD1306_DISPLAYON); //switch on OLED
}
void displayOn(void){
ssd1306_command(0xaf); //display on
}
void displayOff(void){
ssd1306_command(0xae); //display off
}
void reset_display(void){
displayOff();
clear_display();
displayOn();
}
void clear_display(void)
{
unsigned char i,k;
for(k=0;k<8;k++)
{
setXY(k,0);
{
for(i=0;i<128;i++) //clear all COL
{
SendChar(0); //clear all COL
//delay(10);
}
}
}
}
void SendChar(unsigned char data){
char arr[2] = {0x40, data};
// I2CSendSingleByte(slaveAddress, 0x40);
// I2CSendSingleByte(slaveAddress, data);
I2CSendMultipleBytes(slaveAddress, 2, arr);
}
void setXY(unsigned char row,unsigned char col){
ssd1306_command(0xb0+row); //set page address
ssd1306_command(0x00+(8*col&0x0f)); //set low col address
ssd1306_command(0x10+((8*col>>4)&0x0f)); //set high col address
}
//==========================================================https://
// Prints a display char (not just a byte) in coordinates X Y,
// being multiples of 8. This means we have 16 COLS (0-15)
// and 8 ROWS (0-7).
void sendCharXY(unsigned char data, int X, int Y)
{
setXY(X, Y);
char arr[9];
uint8_t i;
arr[0] = 0x40;
for(i = 0; i < 8; i++)
arr[i + 1] = myFont[data - 0x20][i];
I2CSendMultipleBytes(slaveAddress, 9, arr);
}
//==========================================================https://
// Prints a display big number (96 bytes) in coordinates X Y,
// being multiples of 8. This means we have 16 COLS (0-15)
// and 8 ROWS (0-7).
void printBigNumber(char string, int X, int Y)
{
setXY(X,Y);
int salto=0;
for(int i = 0; i < 96; i++)
{
if(string == ' ') {
SendChar(0);
} else
SendChar(bigNumbers[string-0x30][i]);
if(salto == 23) {
salto = 0;
X++;
setXY(X,Y);
} else {
salto++;
}
}
}