Browse Source

added 16x16 bitmaps for numbers and letters, and a display function for the power supply

HCCFISH 6 months ago
parent
commit
d198b36799
2 changed files with 439 additions and 114 deletions
  1. 271 0
      firmware/display_test/display_char.h
  2. 168 114
      firmware/display_test/display_test.ino

+ 271 - 0
firmware/display_test/display_char.h

@@ -0,0 +1,271 @@
+#ifndef DISPLAY_CHAR_H
+#define DISPLAY_CHAR_H
+#define display16X16_number { \
+    display16X16_0, \
+    display16X16_1, \
+    display16X16_2, \
+    display16X16_3, \
+    display16X16_4, \
+    display16X16_5, \
+    display16X16_6, \
+    display16X16_7, \
+    display16X16_8, \
+    display16X16_9  \
+}
+#define display16X16_0  { \
+    0b0000000000000000, \
+    0b0000011111100000, \
+    0b0000111111110000, \
+    0b0001100000011000, \
+    0b0011000000001100, \
+    0b0011000000001100, \
+    0b0110000000000110, \
+    0b0110000000000110, \
+    0b0110000000000110, \
+    0b0110000000000110, \
+    0b0011000000001100, \
+    0b0011000000001100, \
+    0b0001100000011000, \
+    0b0000111111110000, \
+    0b0000011111100000, \
+    0b0000000000000000  \
+}
+#define display16X16_1  { \
+    0b0000000000000000, \
+    0b0000000111000000, \
+    0b0000001111000000, \
+    0b0000011111000000, \
+    0b0000110111000000, \
+    0b0001100111000000, \
+    0b0000000111000000, \
+    0b0000000111000000, \
+    0b0000000111000000, \
+    0b0000000111000000, \
+    0b0000000111000000, \
+    0b0000000111000000, \
+    0b0000000111000000, \
+    0b0011111111111000, \
+    0b0011111111111000, \
+    0b0000000000000000  \
+}
+
+#define display16X16_2  { \
+    0b0000000000000000, \
+    0b0000011111110000, \
+    0b0000111111111000, \
+    0b0001110000011100, \
+    0b0011000000001100, \
+    0b0011000000011100, \
+    0b0000000000111000, \
+    0b0000000001110000, \
+    0b0000000011100000, \
+    0b0000000111000000, \
+    0b0000001110000000, \
+    0b0000011100000000, \
+    0b0000111000000000, \
+    0b0011111111111100, \
+    0b0011111111111100, \
+    0b0000000000000000  \
+}
+
+#define display16X16_3  { \
+    0b0000000000000000, \
+    0b0000011111110000, \
+    0b0000111111111000, \
+    0b0001110000011100, \
+    0b0011000000001100, \
+    0b0000000000011000, \
+    0b0000000001110000, \
+    0b0000000111110000, \
+    0b0000000111110000, \
+    0b0000000000011000, \
+    0b0000000000001100, \
+    0b0011000000001100, \
+    0b0001110000011100, \
+    0b0000111111111000, \
+    0b0000011111110000, \
+    0b0000000000000000  \
+}
+
+#define display16X16_4  { \
+    0b0000000000000000, \
+    0b0000000001110000, \
+    0b0000000011110000, \
+    0b0000000111110000, \
+    0b0000001111110000, \
+    0b0000011101110000, \
+    0b0000111001110000, \
+    0b0001110001110000, \
+    0b0011100001110000, \
+    0b0111000001110000, \
+    0b1111111111111100, \
+    0b1111111111111100, \
+    0b0000000001110000, \
+    0b0000000001110000, \
+    0b0000000001110000, \
+    0b0000000000000000  \
+}
+
+#define display16X16_5  { \
+    0b0000000000000000, \
+    0b0011111111111100, \
+    0b0011111111111100, \
+    0b0011000000000000, \
+    0b0011000000000000, \
+    0b0011000000000000, \
+    0b0011111111110000, \
+    0b0011111111111000, \
+    0b0011000000011100, \
+    0b0000000000001100, \
+    0b0000000000001100, \
+    0b0011000000011100, \
+    0b0011000000011000, \
+    0b0001111111111000, \
+    0b0000111111110000, \
+    0b0000000000000000  \
+}
+#define display16X16_6  { \
+    0b0000000000000000, \
+    0b0000001111110000, \
+    0b0000011111111000, \
+    0b0000111000011100, \
+    0b0001110000001100, \
+    0b0001100000000000, \
+    0b0011000000000000, \
+    0b0011001111110000, \
+    0b0011111000011100, \
+    0b0011100000001100, \
+    0b0011000000001100, \
+    0b0011000000001100, \
+    0b0011100000011100, \
+    0b0001111111111000, \
+    0b0000111111110000, \
+    0b0000000000000000  \
+}
+#define display16X16_7  { \
+    0b0000000000000000, \
+    0b0011111111111100, \
+    0b0011111111111100, \
+    0b0000000000011000, \
+    0b0000000000110000, \
+    0b0000000001100000, \
+    0b0000000011000000, \
+    0b0000000110000000, \
+    0b0000000110000000, \
+    0b0000001100000000, \
+    0b0000011000000000, \
+    0b0000011000000000, \
+    0b0000110000000000, \
+    0b0000110000000000, \
+    0b0000110000000000, \
+    0b0000000000000000  \
+}
+#define display16X16_8  { \
+    0b0000000000000000, \
+    0b0000011111110000, \
+    0b0000111111111000, \
+    0b0001110000011100, \
+    0b0001100000001100, \
+    0b0001100000001100, \
+    0b0000110000111000, \
+    0b0000011111110000, \
+    0b0000111111111000, \
+    0b0001100000011100, \
+    0b0011000000001100, \
+    0b0011000000001100, \
+    0b0001100000011100, \
+    0b0001111111111000, \
+    0b0000111111110000, \
+    0b0000000000000000  \
+}
+#define display16X16_9  { \
+    0b0000000000000000, \
+    0b0000011111110000, \
+    0b0000111111111000, \
+    0b0001110000011100, \
+    0b0011000000001100, \
+    0b0011000000001100, \
+    0b0011000000011100, \
+    0b0001111111111000, \
+    0b0000111111111000, \
+    0b0000000000011000, \
+    0b0000000000110000, \
+    0b0000000000110000, \
+    0b0000000001100000, \
+    0b0001111111000000, \
+    0b0001111110000000, \
+    0b0000000000000000  \
+}
+#define display16X16_A  { \
+    0b0000000000000000, \
+    0b0000000111100000, \
+    0b0000001111110000, \
+    0b0000011101111000, \
+    0b0000011000111000, \
+    0b0000110000011100, \
+    0b0000110000011100, \
+    0b0000111111111100, \
+    0b0001111111111110, \
+    0b0001100000001100, \
+    0b0001100000001100, \
+    0b0011000000000110, \
+    0b0011000000000110, \
+    0b0111000000001110, \
+    0b0110000000000110, \
+    0b0000000000000000  \
+}
+#define display16X16_C  { \
+    0b0000000000000000, \
+    0b0000001111110000, \
+    0b0000011111111000, \
+    0b0000111000011100, \
+    0b0001110000001100, \
+    0b0011100000000000, \
+    0b0011000000000000, \
+    0b0111000000000000, \
+    0b0111000000000000, \
+    0b0111000000000000, \
+    0b0011000000000000, \
+    0b0011100000000000, \
+    0b0001110000001100, \
+    0b0000111000011100, \
+    0b0000011111111000, \
+    0b0000001111110000  \
+}
+#define display16X16_V  { \
+    0b0000000000000000, \
+    0b0110000000000110, \
+    0b0110000000000110, \
+    0b0111000000001110, \
+    0b0011000000001100, \
+    0b0011000000001100, \
+    0b0011100000011100, \
+    0b0001100000011000, \
+    0b0001100000011000, \
+    0b0000110000110000, \
+    0b0000110000110000, \
+    0b0000111001110000, \
+    0b0000011011100000, \
+    0b0000011111100000, \
+    0b0000001111000000, \
+    0b0000000000000000  \
+}
+#define display16X16_blank { \
+    0b0000000000000000, \
+    0b0000000000000000, \
+    0b0000000000000000, \
+    0b0000000000000000, \
+    0b0000000000000000, \
+    0b0000000000000000, \
+    0b0000000000000000, \
+    0b0000000000000000, \
+    0b0000000000000000, \
+    0b0000000000000000, \
+    0b0000000000000000, \
+    0b0000000000000000, \
+    0b0000000000000000, \
+    0b0000000000000000, \
+    0b0000000000000000, \
+    0b0000000000000000  \
+}
+#endif

+ 168 - 114
firmware/display_test/display_test.ino

@@ -1,114 +1,168 @@
-#include <SoftI2C.h>
-
-// Address of the I2C OLED 
-#define OLED_I2C_ADDRESS 0x3C
-
-// Commands for SSD1306
-#define SSD1306_DISPLAYOFF          0xAE
-#define SSD1306_SETDISPLAYCLOCKDIV  0xD5
-#define SSD1306_SETMULTIPLEX        0xA8
-#define SSD1306_SETDISPLAYOFFSET    0xD3
-#define SSD1306_SETSTARTLINE        0x40
-#define SSD1306_CHARGEPUMP          0x8D
-#define SSD1306_MEMORYMODE          0x20
-#define SSD1306_SEGREMAP            0xA1
-#define SSD1306_COMSCANDEC          0xC8
-#define SSD1306_SETCOMPINS          0xDA
-#define SSD1306_SETCONTRAST         0x81
-#define SSD1306_SETPRECHARGE        0xD9
-#define SSD1306_SETVCOMDETECT       0xDB
-#define SSD1306_DISPLAYALLON_RESUME 0xA4
-#define SSD1306_NORMALDISPLAY       0xA6
-#define SSD1306_DISPLAYON           0xAF
-
-void I2CWriteCommand(uint8_t command) {
-  I2CStart();
-  I2CSend(OLED_I2C_ADDRESS << 1); // I2C address + Write bit
-  I2CSend(0x00); // Co = 0, D/C# = 0
-  I2CSend(command);
-  I2CStop();
-}
-
-void I2CWriteData(uint8_t data) {
-  I2CStart();
-  I2CSend(OLED_I2C_ADDRESS << 1); // I2C address + Write bit
-  I2CSend(0x40); // Co = 0, D/C# = 1
-  I2CSend(data);
-  I2CStop();
-}
-
-void initializeOLED() {
-  I2CWriteCommand(SSD1306_DISPLAYOFF);
-  I2CWriteCommand(SSD1306_SETDISPLAYCLOCKDIV);
-  I2CWriteCommand(0x80); // Suggested value
-  I2CWriteCommand(SSD1306_SETMULTIPLEX);
-  I2CWriteCommand(0x3F);
-  I2CWriteCommand(SSD1306_SETDISPLAYOFFSET);
-  I2CWriteCommand(0x00);
-  I2CWriteCommand(SSD1306_SETSTARTLINE | 0x0);
-  I2CWriteCommand(SSD1306_CHARGEPUMP);
-  I2CWriteCommand(0x14);
-  I2CWriteCommand(SSD1306_MEMORYMODE);
-  I2CWriteCommand(0x00);
-  I2CWriteCommand(SSD1306_SEGREMAP | 0x1);
-  I2CWriteCommand(SSD1306_COMSCANDEC);
-  I2CWriteCommand(SSD1306_SETCOMPINS);
-  I2CWriteCommand(0x12);
-  I2CWriteCommand(SSD1306_SETCONTRAST);
-  I2CWriteCommand(0xCF);
-  I2CWriteCommand(SSD1306_SETPRECHARGE);
-  I2CWriteCommand(0xF1);
-  I2CWriteCommand(SSD1306_SETVCOMDETECT);
-  I2CWriteCommand(0x40);
-  I2CWriteCommand(SSD1306_DISPLAYALLON_RESUME);
-  I2CWriteCommand(SSD1306_NORMALDISPLAY);
-  I2CWriteCommand(SSD1306_DISPLAYON);
-}
-
-void clearScreen(){
-  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++) {
-      I2CWriteData(0x00);
-    }
-  }
-}
-
-void nextRow(){
-
-}
-
-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%8==0){
-        I2CWriteData(0xFF);
-      }else{
-        I2CWriteData(0x80);
-      }
-    }
-  }
-}
-
-void drawRectangle(uint8_t, uint8_t, uint8_t, uint8_t, bool);
-
-void setup() {
-  // Initialize I2C pins
-  scl_pin = 30; // P3.0
-  sda_pin = 31; // P3.1
-  I2CInit();
-  initializeOLED();
-}
-
-void loop() {
-  // Clear the display
-  clearScreen();
-  delay(1000);
-  lightScreen();
-  delay(1000);
-}
+#include <SoftI2C.h>
+#include "display_char.h" 
+
+// Address of the I2C OLED 
+#define OLED_I2C_ADDRESS 0x3C
+
+// Commands for SSD1306
+#define SSD1306_DISPLAYOFF          0xAE
+#define SSD1306_SETDISPLAYCLOCKDIV  0xD5
+#define SSD1306_SETMULTIPLEX        0xA8
+#define SSD1306_SETDISPLAYOFFSET    0xD3
+#define SSD1306_SETSTARTLINE        0x40
+#define SSD1306_CHARGEPUMP          0x8D
+#define SSD1306_MEMORYMODE          0x20
+#define SSD1306_SEGREMAP            0xA1
+#define SSD1306_COMSCANDEC          0xC8
+#define SSD1306_SETCOMPINS          0xDA
+#define SSD1306_SETCONTRAST         0x81
+#define SSD1306_SETPRECHARGE        0xD9
+#define SSD1306_SETVCOMDETECT       0xDB
+#define SSD1306_DISPLAYALLON_RESUME 0xA4
+#define SSD1306_NORMALDISPLAY       0xA6
+#define SSD1306_DISPLAYON           0xAF
+
+void I2CWriteCommand(uint8_t command) {
+  I2CStart();
+  I2CSend(OLED_I2C_ADDRESS << 1); // I2C address + Write bit
+  I2CSend(0x00); // Co = 0, D/C# = 0
+  I2CSend(command);
+  I2CStop();
+}
+
+void I2CWriteData(uint8_t data) {
+  I2CStart();
+  I2CSend(OLED_I2C_ADDRESS << 1); // I2C address + Write bit
+  I2CSend(0x40); // Co = 0, D/C# = 1
+  I2CSend(data);
+  I2CStop();
+}
+
+void initializeOLED() {
+  I2CWriteCommand(SSD1306_DISPLAYOFF);
+  I2CWriteCommand(SSD1306_SETDISPLAYCLOCKDIV);
+  I2CWriteCommand(0x80); // Suggested value
+  I2CWriteCommand(SSD1306_SETMULTIPLEX);
+  I2CWriteCommand(0x3F);
+  I2CWriteCommand(SSD1306_SETDISPLAYOFFSET);
+  I2CWriteCommand(0x00);
+  I2CWriteCommand(SSD1306_SETSTARTLINE | 0x0);
+  I2CWriteCommand(SSD1306_CHARGEPUMP);
+  I2CWriteCommand(0x14);
+  I2CWriteCommand(SSD1306_MEMORYMODE);
+  I2CWriteCommand(0x00);
+  I2CWriteCommand(SSD1306_SEGREMAP | 0x1);
+  I2CWriteCommand(SSD1306_COMSCANDEC);
+  I2CWriteCommand(SSD1306_SETCOMPINS);
+  I2CWriteCommand(0x12);
+  I2CWriteCommand(SSD1306_SETCONTRAST);
+  I2CWriteCommand(0xCF);
+  I2CWriteCommand(SSD1306_SETPRECHARGE);
+  I2CWriteCommand(0xF1);
+  I2CWriteCommand(SSD1306_SETVCOMDETECT);
+  I2CWriteCommand(0x40);
+  I2CWriteCommand(SSD1306_DISPLAYALLON_RESUME);
+  I2CWriteCommand(SSD1306_NORMALDISPLAY);
+  I2CWriteCommand(SSD1306_DISPLAYON);
+}
+
+void clearScreen(){
+  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++) {
+      I2CWriteData(0x00);
+    }
+  }
+}
+
+void nextRow(){
+
+}
+
+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){
+        I2CWriteData(0xAA);
+      }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];
+  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;
+  display_addr_list[3] = display_num[voltage_dec_3];
+  display_addr_list[4] = display_num[voltage_dec_2];
+  display_addr_list[5] = display_num[voltage_dec_1];
+  display_addr_list[6] = display_num[voltage_dec_0];
+  display_addr_list[7] = display_V;
+  display_addr_list[8] = (CC_mode) ? display_blank : display_C;
+  display_addr_list[9] = (CC_mode) ? display_blank : display_C;
+  display_addr_list[10] = display_blank;
+  display_addr_list[11] = display_blank;
+  display_addr_list[12] = display_num[current_dec_2];
+  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)){
+        I2CWriteData(0xA0);
+      }
+      else{
+        uint16_t push_temp = 0;
+        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));
+        }
+        I2CWriteData(push_temp);
+      }
+    }
+  }
+}
+
+void drawRectangle(uint8_t, uint8_t, uint8_t, uint8_t, bool);
+
+void setup() {
+  // Initialize I2C pins
+  scl_pin = 30; // P3.0
+  sda_pin = 31; // P3.1
+  I2CInit();
+  initializeOLED();
+}
+
+void loop() {
+  // Clear the display
+  clearScreen();
+  delay(1000);
+  PS_Screen(8888,888,0);
+  delay(1000);
+}