stm32f767 stm32l010 oled hal
Dependents: HAL_oled_16x24_767_1 HAL_oled_16x24_010_2 HAL_oled_16x24_031_1
SSD1308.cpp@2:9b41b26677a2, 2022-08-11 (annotated)
- Committer:
- caa45040
- Date:
- Thu Aug 11 00:15:50 2022 +0000
- Revision:
- 2:9b41b26677a2
- Parent:
- 1:4ec114ea55dc
stm32l010 stm32f767 stm32g031 oled wait_ms not
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
caa45040 | 0:896a43c93cd9 | 1 | |
caa45040 | 0:896a43c93cd9 | 2 | #include "mbed.h" |
caa45040 | 0:896a43c93cd9 | 3 | #include "SSD1308.h" |
caa45040 | 0:896a43c93cd9 | 4 | |
caa45040 | 0:896a43c93cd9 | 5 | //#include "font_8x8.h" |
caa45040 | 0:896a43c93cd9 | 6 | #include "font_16x24.h" |
caa45040 | 0:896a43c93cd9 | 7 | |
caa45040 | 1:4ec114ea55dc | 8 | //最初に呼ばれるプログラム |
caa45040 | 1:4ec114ea55dc | 9 | SSD1308::SSD1308(I2C_HandleTypeDef* hi2c, uint8_t deviceAddress ) |
caa45040 | 1:4ec114ea55dc | 10 | { |
caa45040 | 1:4ec114ea55dc | 11 | _hi2c = hi2c; |
caa45040 | 0:896a43c93cd9 | 12 | |
caa45040 | 1:4ec114ea55dc | 13 | _writeOpcode = deviceAddress & 0xFE; // low order bit = 0 for write |
caa45040 | 1:4ec114ea55dc | 14 | _readOpcode = deviceAddress | 0x01; // low order bit = 1 for read |
caa45040 | 0:896a43c93cd9 | 15 | |
caa45040 | 1:4ec114ea55dc | 16 | initialize(); |
caa45040 | 0:896a43c93cd9 | 17 | }//SSD1308 |
caa45040 | 0:896a43c93cd9 | 18 | |
caa45040 | 2:9b41b26677a2 | 19 | int ran1; |
caa45040 | 2:9b41b26677a2 | 20 | #define WAIT2() for(int ii=0;ii<1000;ii++){ran1=ran1+(int)(rand()*10);} |
caa45040 | 2:9b41b26677a2 | 21 | |
caa45040 | 2:9b41b26677a2 | 22 | |
caa45040 | 0:896a43c93cd9 | 23 | //イニシャライズ |
caa45040 | 0:896a43c93cd9 | 24 | void SSD1308::initialize() |
caa45040 | 0:896a43c93cd9 | 25 | { |
caa45040 | 1:4ec114ea55dc | 26 | //リセット対策 |
caa45040 | 2:9b41b26677a2 | 27 | //wait_ms(100); |
caa45040 | 2:9b41b26677a2 | 28 | WAIT2(); |
caa45040 | 1:4ec114ea55dc | 29 | HAL_I2C_Master_Transmit(_hi2c,_writeOpcode,(uint8_t*)"\200\215\200\024\200\257", 6, 3000); |
caa45040 | 2:9b41b26677a2 | 30 | //wait_ms(100); |
caa45040 | 2:9b41b26677a2 | 31 | WAIT2(); |
caa45040 | 1:4ec114ea55dc | 32 | HAL_I2C_Master_Transmit(_hi2c,_writeOpcode,(uint8_t*)"\200\215\200\024\200\257", 6, 3000); |
caa45040 | 2:9b41b26677a2 | 33 | //wait_ms(100); |
caa45040 | 2:9b41b26677a2 | 34 | WAIT2(); |
caa45040 | 1:4ec114ea55dc | 35 | HAL_I2C_Master_Transmit(_hi2c,_writeOpcode,(uint8_t*)"\200\215\200\024\200\257", 6, 3000); |
caa45040 | 2:9b41b26677a2 | 36 | //wait_ms(100); |
caa45040 | 2:9b41b26677a2 | 37 | WAIT2(); |
caa45040 | 0:896a43c93cd9 | 38 | |
caa45040 | 0:896a43c93cd9 | 39 | setHorizontalAddressingMode(); //メモリーアクセスモード |
caa45040 | 0:896a43c93cd9 | 40 | |
caa45040 | 0:896a43c93cd9 | 41 | clearDisplay(); |
caa45040 | 0:896a43c93cd9 | 42 | |
caa45040 | 1:4ec114ea55dc | 43 | setDisplayOn(); |
caa45040 | 0:896a43c93cd9 | 44 | |
caa45040 | 0:896a43c93cd9 | 45 | //charge pump add=>ca45040 |
caa45040 | 1:4ec114ea55dc | 46 | //0x80,0x8d,0x80,0x14 |
caa45040 | 1:4ec114ea55dc | 47 | HAL_I2C_Master_Transmit(_hi2c,_writeOpcode,(uint8_t*)"\200\215\200\024", 4, 3000); |
caa45040 | 0:896a43c93cd9 | 48 | //set access |
caa45040 | 0:896a43c93cd9 | 49 | //setDisplayFlip(false, false); |
caa45040 | 0:896a43c93cd9 | 50 | }//initialize |
caa45040 | 0:896a43c93cd9 | 51 | |
caa45040 | 0:896a43c93cd9 | 52 | //クリアディスプレー |
caa45040 | 0:896a43c93cd9 | 53 | void SSD1308::clearDisplay() |
caa45040 | 0:896a43c93cd9 | 54 | { |
caa45040 | 0:896a43c93cd9 | 55 | setPageAddress(0, MAX_PAGE); // all pages |
caa45040 | 0:896a43c93cd9 | 56 | setColumnAddress(0, MAX_COL); // all columns |
caa45040 | 0:896a43c93cd9 | 57 | |
caa45040 | 1:4ec114ea55dc | 58 | //128*64/8=1024 |
caa45040 | 1:4ec114ea55dc | 59 | uint8_t databytes[2] = {DATA_MODE,0x00}; |
caa45040 | 1:4ec114ea55dc | 60 | for (int icount = 0; icount < 1024; icount++) { |
caa45040 | 1:4ec114ea55dc | 61 | HAL_I2C_Master_Transmit(_hi2c, _writeOpcode, databytes, 2, 3000); |
caa45040 | 0:896a43c93cd9 | 62 | } |
caa45040 | 0:896a43c93cd9 | 63 | }//clearDisplay |
caa45040 | 0:896a43c93cd9 | 64 | |
caa45040 | 0:896a43c93cd9 | 65 | //ライトビットマップ |
caa45040 | 0:896a43c93cd9 | 66 | void SSD1308::writeBitmap(uint8_t* data, |
caa45040 | 0:896a43c93cd9 | 67 | uint8_t start_page, uint8_t end_page, |
caa45040 | 0:896a43c93cd9 | 68 | uint8_t start_col, uint8_t end_col) |
caa45040 | 0:896a43c93cd9 | 69 | { |
caa45040 | 0:896a43c93cd9 | 70 | int count = (end_page - start_page + 1) * (end_col - start_col + 1); |
caa45040 | 0:896a43c93cd9 | 71 | |
caa45040 | 0:896a43c93cd9 | 72 | setPageAddress(start_page, end_page); // set page window |
caa45040 | 0:896a43c93cd9 | 73 | setColumnAddress(start_col, end_col); // set column window |
caa45040 | 0:896a43c93cd9 | 74 | |
caa45040 | 1:4ec114ea55dc | 75 | uint8_t databytes[2] = {DATA_MODE,0x00}; |
caa45040 | 0:896a43c93cd9 | 76 | for (int i=0; i<count; i++) { |
caa45040 | 0:896a43c93cd9 | 77 | databytes[1] = data[i]; |
caa45040 | 1:4ec114ea55dc | 78 | HAL_I2C_Master_Transmit(_hi2c,_writeOpcode, databytes, 2, 3000); |
caa45040 | 0:896a43c93cd9 | 79 | } |
caa45040 | 0:896a43c93cd9 | 80 | }//writeBitmap |
caa45040 | 0:896a43c93cd9 | 81 | |
caa45040 | 0:896a43c93cd9 | 82 | //ライトビッグキャラ |
caa45040 | 0:896a43c93cd9 | 83 | void SSD1308::writeBigChar(uint8_t row, uint8_t col, char chr) |
caa45040 | 0:896a43c93cd9 | 84 | { |
caa45040 | 0:896a43c93cd9 | 85 | writeBitmap((uint8_t*) font_16x24[int(chr) - FONT16x24_START], |
caa45040 | 0:896a43c93cd9 | 86 | row, (row + FONT16x24_BYTES - 1), |
caa45040 | 0:896a43c93cd9 | 87 | col, (col + FONT16x24_WIDTH - 1)); |
caa45040 | 0:896a43c93cd9 | 88 | }//writeBigChar |
caa45040 | 0:896a43c93cd9 | 89 | |
caa45040 | 1:4ec114ea55dc | 90 | //セットホリゾンタルアドレシングモード(水平) |
caa45040 | 0:896a43c93cd9 | 91 | void SSD1308::setHorizontalAddressingMode() |
caa45040 | 0:896a43c93cd9 | 92 | { |
caa45040 | 0:896a43c93cd9 | 93 | setMemoryAddressingMode(HORIZONTAL_ADDRESSING_MODE); |
caa45040 | 0:896a43c93cd9 | 94 | }//setHorizontalAddressingMode |
caa45040 | 0:896a43c93cd9 | 95 | |
caa45040 | 0:896a43c93cd9 | 96 | //セットメモリーアドレシングモード |
caa45040 | 0:896a43c93cd9 | 97 | void SSD1308::setMemoryAddressingMode(uint8_t mode) |
caa45040 | 0:896a43c93cd9 | 98 | { |
caa45040 | 1:4ec114ea55dc | 99 | uint8_t databytes[4] = {COMMAND_MODE,SET_MEMORY_ADDRESSING_MODE,COMMAND_MODE,mode}; |
caa45040 | 1:4ec114ea55dc | 100 | HAL_I2C_Master_Transmit(_hi2c,_writeOpcode,databytes, 4, 3000); |
caa45040 | 0:896a43c93cd9 | 101 | }//setMemoryAddressingMode |
caa45040 | 0:896a43c93cd9 | 102 | |
caa45040 | 0:896a43c93cd9 | 103 | //セットページアドレス |
caa45040 | 0:896a43c93cd9 | 104 | void SSD1308::setPageAddress(uint8_t start, uint8_t end) |
caa45040 | 0:896a43c93cd9 | 105 | { |
caa45040 | 1:4ec114ea55dc | 106 | uint8_t databytes[6] = {COMMAND_MODE,SET_PAGE_ADDRESS,COMMAND_MODE,start,COMMAND_MODE,end}; |
caa45040 | 1:4ec114ea55dc | 107 | HAL_I2C_Master_Transmit(_hi2c,_writeOpcode, databytes, 6, 3000); |
caa45040 | 0:896a43c93cd9 | 108 | }//setPageAddress |
caa45040 | 0:896a43c93cd9 | 109 | |
caa45040 | 1:4ec114ea55dc | 110 | //セットカラムアドレス |
caa45040 | 0:896a43c93cd9 | 111 | void SSD1308::setColumnAddress(uint8_t start, uint8_t end) |
caa45040 | 0:896a43c93cd9 | 112 | { |
caa45040 | 1:4ec114ea55dc | 113 | uint8_t databytes[6] = {COMMAND_MODE,SET_COLUMN_ADDRESS,COMMAND_MODE,start,COMMAND_MODE,end}; |
caa45040 | 1:4ec114ea55dc | 114 | HAL_I2C_Master_Transmit(_hi2c,_writeOpcode, databytes, 6, 3000); |
caa45040 | 0:896a43c93cd9 | 115 | }//setColumnAddress |
caa45040 | 0:896a43c93cd9 | 116 | |
caa45040 | 0:896a43c93cd9 | 117 | //セットディスプレーオン |
caa45040 | 0:896a43c93cd9 | 118 | void SSD1308::setDisplayOn() |
caa45040 | 0:896a43c93cd9 | 119 | { |
caa45040 | 1:4ec114ea55dc | 120 | uint8_t databytes[2] = {COMMAND_MODE,SET_DISPLAY_POWER_ON}; |
caa45040 | 1:4ec114ea55dc | 121 | HAL_I2C_Master_Transmit(_hi2c,_writeOpcode, databytes, 2, 3000); |
caa45040 | 0:896a43c93cd9 | 122 | }//setDisplayOn |
caa45040 | 0:896a43c93cd9 | 123 | |
caa45040 | 0:896a43c93cd9 | 124 | /* |
caa45040 | 0:896a43c93cd9 | 125 | //セットディスプレーオフ |
caa45040 | 0:896a43c93cd9 | 126 | void SSD1308::setDisplayOff() |
caa45040 | 0:896a43c93cd9 | 127 | { |
caa45040 | 0:896a43c93cd9 | 128 | _sendCommand(SET_DISPLAY_POWER_OFF); |
caa45040 | 0:896a43c93cd9 | 129 | }//setDisplayOff |
caa45040 | 0:896a43c93cd9 | 130 | */ |
caa45040 | 0:896a43c93cd9 | 131 | |
caa45040 | 0:896a43c93cd9 | 132 | /* |
caa45040 | 0:896a43c93cd9 | 133 | //セットディスプレー Flip |
caa45040 | 0:896a43c93cd9 | 134 | void SSD1308::setDisplayFlip(bool left, bool down) |
caa45040 | 0:896a43c93cd9 | 135 | { |
caa45040 | 0:896a43c93cd9 | 136 | if (left) { |
caa45040 | 0:896a43c93cd9 | 137 | // column address 0 is mapped to SEG0 (Reset) |
caa45040 | 0:896a43c93cd9 | 138 | _sendCommand(SET_SEGMENT_REMAP_0); |
caa45040 | 0:896a43c93cd9 | 139 | } else { |
caa45040 | 0:896a43c93cd9 | 140 | // column address 127 is mapped to SEG0 |
caa45040 | 0:896a43c93cd9 | 141 | _sendCommand(SET_SEGMENT_REMAP_127); |
caa45040 | 0:896a43c93cd9 | 142 | } |
caa45040 | 0:896a43c93cd9 | 143 | |
caa45040 | 0:896a43c93cd9 | 144 | if (down) { |
caa45040 | 0:896a43c93cd9 | 145 | // Reset mode |
caa45040 | 0:896a43c93cd9 | 146 | _sendCommand(SET_COMMON_REMAP_0); |
caa45040 | 0:896a43c93cd9 | 147 | } else { |
caa45040 | 0:896a43c93cd9 | 148 | // Flip Up/Down (Need to rewrite display before H effect shows) |
caa45040 | 0:896a43c93cd9 | 149 | _sendCommand(SET_COMMON_REMAP_63); |
caa45040 | 0:896a43c93cd9 | 150 | } |
caa45040 | 0:896a43c93cd9 | 151 | |
caa45040 | 0:896a43c93cd9 | 152 | }//setDisplayFlip |
caa45040 | 1:4ec114ea55dc | 153 | */ |