提供新唐M031KG6AE用IIC写的oled的驱动
时间: 2023-09-17 16:06:30 浏览: 181
stm32f407VET6驱动IIC 0.96寸OLED.rar
5星 · 资源好评率100%
新唐M031KG6AE是一款ARM Cortex-M0处理器,其内置了I2C总线接口,可以通过该接口驱动OLED屏幕。以下是一个简单的示例代码,可以作为参考:
```c
#include <stdio.h>
#include "NuMicro.h"
#include "oled.h"
#define I2C_ADDR_OLED 0x3C /* OLED屏幕的I2C地址 */
/* 初始化I2C总线 */
void init_I2C(void)
{
/* 打开I2C0模块时钟 */
CLK_EnableModuleClock(I2C0_MODULE);
/* 配置I2C0引脚 */
SYS->PB_L_MFP &= ~(SYS_PB_L_MFP_PB2_MFP_Msk | SYS_PB_L_MFP_PB3_MFP_Msk);
SYS->PB_L_MFP |= (SYS_PB_L_MFP_PB2_MFP_I2C0_SDA | SYS_PB_L_MFP_PB3_MFP_I2C0_SCL);
SYS->GPA_MFP &= ~(SYS_GPA_MFP_PA10_MFP_Msk | SYS_GPA_MFP_PA11_MFP_Msk);
SYS->GPA_MFP |= (SYS_GPA_MFP_PA10_MFP_I2C0_SCL | SYS_GPA_MFP_PA11_MFP_I2C0_SDA);
/* 配置I2C0为标准模式 */
I2C_Open(I2C0, 100000);
/* 使能I2C0中断 */
I2C_EnableInt(I2C0);
NVIC_EnableIRQ(I2C0_IRQn);
}
/* 发送数据到OLED屏幕 */
void OLED_Write(uint8_t cmd, uint8_t *data, uint32_t len)
{
/* 发送命令 */
I2C_START(I2C0);
I2C_WAIT_READY(I2C0);
I2C_SET_DATA(I2C0, I2C_ADDR_OLED << 1);
I2C_SET_CONTROL_REG(I2C0, I2C_CTL_SI);
I2C_WAIT_READY(I2C0);
I2C_SET_DATA(I2C0, 0x00);
I2C_SET_CONTROL_REG(I2C0, I2C_CTL_SI);
I2C_WAIT_READY(I2C0);
I2C_SET_DATA(I2C0, cmd);
I2C_SET_CONTROL_REG(I2C0, I2C_CTL_SI);
I2C_WAIT_READY(I2C0);
/* 发送数据 */
for (int i = 0; i < len; i++)
{
I2C_SET_DATA(I2C0, data[i]);
I2C_SET_CONTROL_REG(I2C0, I2C_CTL_SI);
I2C_WAIT_READY(I2C0);
}
I2C_STOP(I2C0);
}
/* 初始化OLED屏幕 */
void OLED_Init(void)
{
uint8_t cmd[] = {
0xAE, //关显示
0xD5, 0x80, //设置时钟分频因子,震荡频率
0xA8, 0x3F, //设置驱动路数
0xD3, 0x00, //设置显示偏移
0x40, //设置首行显示位置
0x8D, 0x14, //设置电荷泵
0x20, 0x00, //设置内存地址模式
0xA0, 0xC8, //设置段/列正常/反向
0xDA, 0x12, //设置COM硬件引脚配置
0x81, 0xCF, //设置对比度
0xD9, 0xF1, //设置预充电周期
0xDB, 0x40, //设置VCOMH
0xA4, //全局显示开启
0xA6, //设置显示模式
0xAF //开显示
};
init_I2C();
OLED_Write(0x00, cmd, sizeof(cmd));
}
/* 在OLED屏幕上显示字符串 */
void OLED_ShowString(uint8_t x, uint8_t y, char *str)
{
static uint8_t s_oled_buf[128][8] = {0};
while (*str)
{
if (x > 126)
return;
if (y > 7)
return;
uint8_t ch = *str - ' ';
uint8_t *p = &s_oled_buf[x][y];
for (int i = 0; i < 8; i++)
{
*p++ = font_8x16[ch * 16 + i];
}
x += 8;
str++;
}
uint8_t cmd[] = {
0x21, x, 127, //设置列地址范围
0x22, y, y, //设置页地址范围
};
OLED_Write(0x00, cmd, sizeof(cmd));
OLED_Write(0x40, (uint8_t *)s_oled_buf, 128 * 8);
}
int main(void)
{
/* 初始化OLED屏幕 */
OLED_Init();
/* 在OLED屏幕上显示字符串 */
OLED_ShowString(0, 0, "Hello World!");
while (1)
{
}
}
```
在上面的示例代码中,我们通过调用`OLED_Init()`函数初始化OLED屏幕,并且通过调用`OLED_ShowString()`函数在OLED屏幕上显示字符串。其中,`OLED_Write()`函数是用来发送数据到OLED屏幕的。在该函数中,我们首先发送一个命令,然后再发送数据。具体的命令和数据可以根据OLED屏幕的型号进行调整。
阅读全文