CH32V203-I2C点亮OLED

1.userpinmux.c部分代码:


#if  cmd_status_board==4
void I2C_Init_USER(u32 bound, u16 address) //参数一时钟速度,参数二地址
{
    GPIO_InitTypeDef GPIO_INIT_3;
    I2C_InitTypeDef I2C_INIT;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);

    GPIO_INIT_3.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
    GPIO_INIT_3.GPIO_Mode = GPIO_Mode_AF_OD;
    GPIO_INIT_3.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_INIT_3);

//    GPIO_INIT_3.GPIO_Pin = GPIO_Pin_7;
//    GPIO_INIT_3.GPIO_Mode = GPIO_Mode_AF_OD;
//    GPIO_INIT_3.GPIO_Speed = GPIO_Speed_50MHz;
//    GPIO_Init(GPIOB, &GPIO_INIT_3);

    I2C_INIT.I2C_ClockSpeed = bound;
    I2C_INIT.I2C_Mode = I2C_Mode_I2C;
    I2C_INIT.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_INIT.I2C_OwnAddress1 = address;
    I2C_INIT.I2C_Ack = I2C_Ack_Enable;
    I2C_INIT.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_Init(I2C2, &I2C_INIT);

    I2C_Cmd(I2C2, ENABLE);
    I2C_AcknowledgeConfig(I2C1, ENABLE);
}

void I2C_INIT_USER_INIT(void) {
    I2C_Init_USER(400000, 0X30);
}
/**********************************************************************
 *@Note:
 READ :Start + 0xA0 + 8bit Data Address + Start + 0xA1 + Read Data + Stop.
 WRITE:Start + 0xA0 + 8bit Data Address + Write Data + Stop.
 *******************************************************************************/

//从指定地址写一字节
void I2C_WRITE_ONE_BYTE(u16 writeaddress, u8 data_write) {
    while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY)!=RESET);
    I2C_GenerateSTART(I2C2, ENABLE);
    while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
    I2C_Send7bitAddress(I2C2, 0X78, I2C_Direction_Transmitter);
    while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
    I2C_SendData(I2C2, (u8) writeaddress);
    while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
    I2C_SendData(I2C2, data_write);
    while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
    I2C_GenerateSTOP(I2C2, ENABLE);
}

void I2C_WRITE_CMD(unsigned char I2C_COMMAND) {
    I2C_WRITE_ONE_BYTE(0X00, I2C_COMMAND);
}

void I2C_WRITE_DATA(unsigned char I2C_DATA) {
    I2C_WRITE_ONE_BYTE(0X40, I2C_DATA);
}

void OLED_INIT() {
    Delay_Ms(100);
    I2C_WRITE_CMD(0XAE);
    I2C_WRITE_CMD(0X20);
    I2C_WRITE_CMD(0X10);
    I2C_WRITE_CMD(0XB0);
    I2C_WRITE_CMD(0XC8);
    I2C_WRITE_CMD(0X00);
    I2C_WRITE_CMD(0X10);
    I2C_WRITE_CMD(0X40);
    I2C_WRITE_CMD(0X81);
    I2C_WRITE_CMD(0XFF);
    I2C_WRITE_CMD(0XA1);
    I2C_WRITE_CMD(0XA6);
    I2C_WRITE_CMD(0XA8);
    I2C_WRITE_CMD(0X3F);
    I2C_WRITE_CMD(0XA4);
    I2C_WRITE_CMD(0XD3);
    I2C_WRITE_CMD(0X00);
    I2C_WRITE_CMD(0XD5);
    I2C_WRITE_CMD(0XF0);
    I2C_WRITE_CMD(0XD9);
    I2C_WRITE_CMD(0X22);
    I2C_WRITE_CMD(0XDA);
    I2C_WRITE_CMD(0X12);
    I2C_WRITE_CMD(0XDB);
    I2C_WRITE_CMD(0X20);
    I2C_WRITE_CMD(0X8D);
    I2C_WRITE_CMD(0X14);
    I2C_WRITE_CMD(0XAF);
}

void I2C_OLED_SETPOS(unsigned char X, unsigned char Y) {
    I2C_WRITE_CMD(0XB0 + Y);
    I2C_WRITE_CMD(((X & 0XF0) >> 4) | 0X10);
    I2C_WRITE_CMD((X & 0X0F) | 0X01);
}

void I2C_OLED_FILL(unsigned char FILL_DATA) //全屏
{
    unsigned char M, N;
    for (M = 0; M < 8; M++) {
        I2C_WRITE_CMD(0XB0 + M);
        I2C_WRITE_CMD(0X00);
        I2C_WRITE_CMD(0X10);
        for (N = 0; N < 128; N++) {
            I2C_WRITE_DATA(FILL_DATA);
        }
    }
}

void I2C_OLED_CLEARSCREEN() {
    I2C_OLED_FILL(0X00);
}

void I2C_OLED_ON(void) {
    I2C_WRITE_CMD(0X8D);
    I2C_WRITE_CMD(0X14);
    I2C_WRITE_CMD(0XAF);
}

void I2C_OLED_SLEEP(void) {
    I2C_WRITE_CMD(0X8D);
    I2C_WRITE_CMD(0X10);
    I2C_WRITE_CMD(0XAE);
}

/*****************************
 *函数说明:
 *
 ******************************/
void I2C_OLED_SHOW_STRING(unsigned char X, unsigned char Y,
        unsigned char OLED_Str[], unsigned char T_Size) {
    unsigned char c = 0, i = 0, j = 0;
    switch (T_Size) {
    case 1: {
        while (OLED_Str[j]!='\0')
        {
            c=OLED_Str[j]-32;
            if(X>126)
            {
                X=0;Y++;
            }
            I2C_OLED_SETPOS(X, Y);
            for(i=0;i<6;i++)
            {
                I2C_WRITE_DATA(F6X8[c][i]);}
            X+=6;
            j++;
        }
    }
        break;
    case 2: {
        while(OLED_Str[j]!='\0')
        {
            c=OLED_Str[j]-32;
            if(X>120)
            {
                X=0;Y++;
            }
            I2C_OLED_SETPOS(X, Y);
            for (i = 0; i < 8; i++)
            {
                I2C_WRITE_DATA(F8X16[c*16+i]);}
            I2C_OLED_SETPOS(X, Y+1);
            for (i = 0; i < 8; i++)
            {
                I2C_WRITE_DATA(F8X16[c*16+i+8]);}
            X+=8;
            j++;
        }
    }
    }
}

void I2C_OLED_SHOW_CHINESE(unsigned char X, unsigned char Y, unsigned char N) {
    unsigned char apix = 0;
    unsigned int address_ch = 32 * N;
    I2C_OLED_SETPOS(X, Y);
    for (apix = 0; apix < 16; apix++) {
        I2C_WRITE_DATA(F16X16[address_ch]);
        address_ch += 1;
    }
    I2C_OLED_SETPOS(X, Y + 1);
    for (apix = 0; apix < 16; apix++) {
        I2C_WRITE_DATA(F16X16[address_ch]);
        address_ch += 1;
    }
}

void I2C_OLED_DRAW(unsigned char X, unsigned char Y, unsigned char Z,
        unsigned char Q, unsigned char picture_BMP[]) {
    unsigned int j = 0;
    unsigned char A, B;
    if (Q % 8 == 0) {
        B = Q / 8;
    } else {
        B = Q / 8 + 1;
    }
    for (B = Y; B < Q; B++) {
        I2C_OLED_SETPOS(X, B);
        for (A = X; A < Z; A++) {
            I2C_WRITE_DATA(picture_BMP[j++]);
        }
    }
}
#endif

void pinmux_init() {
    GPIO_InitTypeDef GPIO_INIT_1;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_INIT_1.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
    GPIO_INIT_1.GPIO_Mode = GPIO_Mode_Out_PP; //设置成推挽输出
    GPIO_INIT_1.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_INIT_1);
    GPIO_SetBits(GPIOB, GPIO_Pin_4);
}

2.userpinmux.h

void I2C_Init_USER(u32 bound, u16 address); //I2C初始化设置
void I2C_INIT_USER_INIT(void); //I2C初始化
void I2C_WRITE_ONE_BYTE(u16 writeaddress, u8 data_write); //I2C写一个字
void I2C_WRITE_CMD(unsigned char I2C_COMMAND); //I2C写指令
void I2C_WRITE_DATA(unsigned char I2C_DATA); //I2C写数据
void OLED_INIT(); //oled初始化
void I2C_OLED_SETPOS(unsigned char X, unsigned char Y); //oled光标设置
void I2C_OLED_FILL(unsigned char FILL_DATA); //oled全屏
void I2C_OLED_CLEARSCREEN(); //OLED清屏
void I2C_OLED_ON(void); //OLED开机
void I2C_OLED_SLEEP(void); //oled休眠
void I2C_OLED_SHOW_STRING(unsigned char X, unsigned char Y,
        unsigned char OLED_Str[], unsigned char T_Size); //OLED显示字符串
void I2C_OLED_SHOW_CHINESE(unsigned char X, unsigned char Y, unsigned char N); //显示中文
void I2C_OLED_DRAW(unsigned char X, unsigned char Y, unsigned char Z,
        unsigned char Q, unsigned char picture_BMP[]); //显示位图

3.setup()

void setup() {
    //*******系统默认**********//
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    USART_Printf_Init(115200);
    printf("start to OLED display by the way IIC");
    //************************//
    pinmux_init();
    I2C_INIT_USER_INIT(); //I2C初始化
    OLED_INIT(); //oled初始化
    void I2C_OLED_ON(); //OLED开机
    I2C_OLED_CLEARSCREEN();
    Delay_Ms(1000);
//    I2C_OLED_ON(); //OLED开机
    I2C_OLED_SHOW_STRING(0, 0, "hello!", 1); //OLED显示字符串

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值