|
@@ -1,9 +1,11 @@
|
|
|
#include <SoftI2C.h>
|
|
|
-#include "display_char.h"
|
|
|
+#include "display_char.h"
|
|
|
|
|
|
-// Address of the I2C OLED
|
|
|
+// Address of the I2C OLED
|
|
|
#define OLED_I2C_ADDRESS 0x3C
|
|
|
|
|
|
+
|
|
|
+
|
|
|
// Commands for SSD1306
|
|
|
#define SSD1306_DISPLAYOFF 0xAE
|
|
|
#define SSD1306_SETDISPLAYCLOCKDIV 0xD5
|
|
@@ -22,6 +24,19 @@
|
|
|
#define SSD1306_NORMALDISPLAY 0xA6
|
|
|
#define SSD1306_DISPLAYON 0xAF
|
|
|
|
|
|
+static uint16_t display_num[10][16] = display16X16_number;
|
|
|
+static uint16_t display_A[16] = display16X16_A;
|
|
|
+static uint16_t display_C[16] = display16X16_C;
|
|
|
+static uint16_t display_V[16] = display16X16_V;
|
|
|
+static uint16_t display_blank[16] = display16X16_blank;
|
|
|
+uint8_t voltage_dec_3;
|
|
|
+uint8_t voltage_dec_2;
|
|
|
+uint8_t voltage_dec_1;
|
|
|
+uint8_t voltage_dec_0;
|
|
|
+uint8_t current_dec_2;
|
|
|
+uint8_t current_dec_1;
|
|
|
+uint8_t current_dec_0;
|
|
|
+uint16_t* display_addr_list[16];
|
|
|
void I2CWriteCommand(uint8_t command) {
|
|
|
I2CStart();
|
|
|
I2CSend(OLED_I2C_ADDRESS << 1); // I2C address + Write bit
|
|
@@ -66,7 +81,7 @@ void initializeOLED() {
|
|
|
I2CWriteCommand(SSD1306_DISPLAYON);
|
|
|
}
|
|
|
|
|
|
-void clearScreen(){
|
|
|
+void clearScreen() {
|
|
|
for (uint8_t i = 0; i < 8; i++) {
|
|
|
I2CWriteCommand(0xB0 + i); // Set page address
|
|
|
I2CWriteCommand(0x00); // Set lower column address
|
|
@@ -77,39 +92,33 @@ void clearScreen(){
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void nextRow(){
|
|
|
+void nextRow() {
|
|
|
|
|
|
}
|
|
|
|
|
|
-void lightScreen(){
|
|
|
+void lightScreen() {
|
|
|
for (uint8_t i = 0; i < 8; i++) {
|
|
|
I2CWriteCommand(0xB0 + i); // Set page address
|
|
|
I2CWriteCommand(0x00); // Set lower column address
|
|
|
I2CWriteCommand(0x10); // Set higher column address
|
|
|
for (uint8_t j = 0; j < 128; j++) {
|
|
|
- if (j%4==0){
|
|
|
+ if (j % 4 == 0) {
|
|
|
I2CWriteData(0xAA);
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
I2CWriteData(0x80);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void PS_Screen(uint16_t voltage_num, uint16_t current_num, bool CC_mode){
|
|
|
- static uint16_t display_num[10][16] = display16X16_number;
|
|
|
- static uint16_t display_A[16] = display16X16_A;
|
|
|
- static uint16_t display_C[16] = display16X16_C;
|
|
|
- static uint16_t display_V[16] = display16X16_V;
|
|
|
- static uint16_t display_blank[16] = display16X16_blank;
|
|
|
- uint8_t voltage_dec_3 = (voltage_num / 1000) % 10;
|
|
|
- uint8_t voltage_dec_2 = (voltage_num / 100) % 10;
|
|
|
- uint8_t voltage_dec_1 = (voltage_num / 10) % 10;
|
|
|
- uint8_t voltage_dec_0 = voltage_num % 10;
|
|
|
- uint8_t current_dec_2 = (current_num / 100) % 10;
|
|
|
- uint8_t current_dec_1 = (current_num / 10) % 10;
|
|
|
- uint8_t current_dec_0 = current_num % 10;
|
|
|
- uint16_t* display_addr_list[16];
|
|
|
+void PS_Screen(uint16_t voltage_num, uint16_t current_num, bool CC_mode) {
|
|
|
+ voltage_dec_3 = (voltage_num / 1000) % 10;
|
|
|
+ voltage_dec_2 = (voltage_num / 100) % 10;
|
|
|
+ voltage_dec_1 = (voltage_num / 10) % 10;
|
|
|
+ voltage_dec_0 = voltage_num % 10;
|
|
|
+ current_dec_2 = (current_num / 100) % 10;
|
|
|
+ current_dec_1 = (current_num / 10) % 10;
|
|
|
+ current_dec_0 = current_num % 10;
|
|
|
display_addr_list[0] = (!CC_mode) ? display_C : display_blank;
|
|
|
display_addr_list[1] = (!CC_mode) ? display_V : display_blank;
|
|
|
display_addr_list[2] = display_blank;
|
|
@@ -126,22 +135,22 @@ void PS_Screen(uint16_t voltage_num, uint16_t current_num, bool CC_mode){
|
|
|
display_addr_list[13] = display_num[current_dec_1];
|
|
|
display_addr_list[14] = display_num[current_dec_0];
|
|
|
display_addr_list[15] = display_A;
|
|
|
-
|
|
|
+
|
|
|
for (uint8_t i = 0; i < 8; i++) {
|
|
|
I2CWriteCommand(0xB0 + i); // Set page address
|
|
|
I2CWriteCommand(0x00); // Set lower column address
|
|
|
I2CWriteCommand(0x10); // Set higher column address
|
|
|
for (uint8_t j = 0; j < 128; j++) {
|
|
|
|
|
|
- if(i%4 == 3 && (j == 79||j==80)){
|
|
|
+ if (i % 4 == 3 && (j == 79 || j == 80)) {
|
|
|
I2CWriteData(0xA0);
|
|
|
}
|
|
|
- else{
|
|
|
+ else {
|
|
|
uint16_t push_temp = 0;
|
|
|
- uint8_t sel_col = 15-j%16;
|
|
|
+ uint8_t sel_col = 15 - j % 16;
|
|
|
for (uint8_t k = 0; k < 4; k++) {
|
|
|
- uint8_t bit = ((display_addr_list[(j>>4)+(i/4*8)])[((i%4)<<2)+k]>>(sel_col)) & 0x0001;
|
|
|
- push_temp |= (bit << (2*k+1));
|
|
|
+ uint8_t bit = ((display_addr_list[(j >> 4) + (i / 4 * 8)])[((i % 4) << 2) + k] >> (sel_col)) & 0x0001;
|
|
|
+ push_temp |= (bit << (2 * k + 1));
|
|
|
}
|
|
|
I2CWriteData(push_temp);
|
|
|
}
|
|
@@ -162,7 +171,7 @@ void setup() {
|
|
|
void loop() {
|
|
|
// Clear the display
|
|
|
clearScreen();
|
|
|
- delay(1000);
|
|
|
- PS_Screen(8888,888,0);
|
|
|
- delay(1000);
|
|
|
+ delay(500);
|
|
|
+ PS_Screen(8888, 888, 1);
|
|
|
+ delay(500);
|
|
|
}
|