msp432使用硬件i2c使用0.96寸oled屏的示例代码
时间: 2023-07-30 16:07:04 浏览: 52
下面是使用MSP432的硬件I2C控制0.96寸OLED屏幕的示例代码,需要使用MSP432P401R LaunchPad进行测试。
```c
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include "driverlib.h"
#define I2C_MASTER_BASE EUSCI_B0_BASE
#define I2C_SLAVE_ADDRESS 0x3C
#define OLED_WIDTH 128
#define OLED_HEIGHT 64
static const uint8_t init_sequence[] = {
0xAE, // Display OFF
0xD5, 0x80, // Set Display Clock Divide Ratio/Oscillator Frequency
0xA8, 0x3F, // Set Multiplex Ratio(1 to 64)
0xD3, 0x00, // Set Display Offset
0x40, // Set Display Start Line
0x8D, 0x14, // Enable charge pump regulator
0x20, 0x00, // Set Memory Addressing Mode to Horizontal
0xA0 | 0x01,// Set Segment Re-map
0xC8, // Set COM Output Scan Direction
0xDA, 0x12, // Set COM Pins Hardware Configuration
0x81, 0xCF, // Set Contrast Control
0xD9, 0xF1, // Set Precharge Period
0xDB, 0x30, // Set VCOMH Deselect Level
0xA4, // Entire Display ON
0xA6, // Set Normal Display
0xAF // Display ON
};
void oled_write_cmd(uint8_t cmd) {
uint8_t tx_data[2] = { 0x00, cmd };
I2C_masterSendMultiByteStart(I2C_MASTER_BASE, I2C_SLAVE_ADDRESS);
I2C_masterSendMultiByteNext(I2C_MASTER_BASE, tx_data[0]);
I2C_masterSendMultiByteFinish(I2C_MASTER_BASE, tx_data[1]);
while (I2C_masterIsStopSent(I2C_MASTER_BASE)) ;
}
void oled_write_data(const uint8_t *data, size_t len) {
I2C_masterSendMultiByteStart(I2C_MASTER_BASE, I2C_SLAVE_ADDRESS);
for (size_t i = 0; i < len; ++i) {
I2C_masterSendMultiByteNext(I2C_MASTER_BASE, data[i]);
}
I2C_masterSendMultiByteFinish(I2C_MASTER_BASE, 0x00);
while (I2C_masterIsStopSent(I2C_MASTER_BASE)) ;
}
void oled_init() {
oled_write_cmd(0xAE); // Display OFF
for (size_t i = 0; i < sizeof(init_sequence); ++i) {
oled_write_cmd(init_sequence[i]);
}
}
void oled_clear() {
uint8_t data[OLED_WIDTH / 8] = { 0 };
for (int page = 0; page < OLED_HEIGHT / 8; ++page) {
oled_set_page_address(page);
oled_set_col_address(0);
oled_write_data(data, sizeof(data));
}
}
void oled_set_page_address(uint8_t page) {
oled_write_cmd(0xB0 | page);
}
void oled_set_col_address(uint8_t col) {
uint8_t high_nibble = col >> 4;
uint8_t low_nibble = col & 0x0F;
oled_write_cmd(0x10 | high_nibble);
oled_write_cmd(0x00 | low_nibble);
}
void oled_set_pixel(uint8_t x, uint8_t y, bool value) {
uint8_t page = y / 8;
uint8_t bit_mask = 1 << (y % 8);
uint8_t data[1] = { value ? bit_mask : 0 };
oled_set_page_address(page);
oled_set_col_address(x);
oled_write_data(data, sizeof(data));
}
void oled_draw_bitmap(const uint8_t *bitmap, uint8_t x, uint8_t y, uint8_t width, uint8_t height) {
for (int i = 0; i < height; ++i) {
for (int j = 0; j < width; ++j) {
uint8_t byte_index = (i * width + j) / 8;
uint8_t bit_mask = 1 << ((i * width + j) % 8);
bool value = bitmap[byte_index] & bit_mask;
oled_set_pixel(x + j, y + i, value);
}
}
}
int main(void) {
WDT_A_hold(WDT_A_BASE);
GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1, GPIO_PIN3 | GPIO_PIN2, GPIO_PRIMARY_MODULE_FUNCTION);
I2C_initMaster(I2C_MASTER_BASE, &eUSCI_B_I2C_initMasterParam);
I2C_setMode(I2C_MASTER_BASE, EUSCI_B_I2C_TRANSMIT_MODE);
I2C_masterEnable(I2C_MASTER_BASE);
oled_init();
oled_clear();
const uint8_t bitmap[] = {
// Bitmap data goes here
};
oled_draw_bitmap(bitmap, 0, 0, OLED_WIDTH, OLED_HEIGHT);
while (1) ;
}
```
注意,这只是一个示例代码,并不保证能够直接运行。您需要根据自己的硬件和需求进行修改和调整。