390|4

94

帖子

0

资源

一粒金砂(中级)

【RISC-V MCU CH32V103测评】驱动OLED屏显示 [复制链接]

OLED屏是一种小巧的显示器件,其面对LCD1602等液晶显示屏也毫不逊色,显示的内容也并不少。此外,它按接口方式可分为I2C接口和SPI接口等,所占用的引脚也不多于LCD1602等。

这里选用的是I2C接口的OLED屏,它最有特点,用2I/O口就能完成显示任务。

在掌握GPIO口使用的基础上,就可十分轻松地实现驱动OLED屏显示的目标。

这里的OLED屏与MCU的连接关系为:

SCL ---PA2

SDA--- PA3

驱动OLED屏所定义的输出高低电平的语句定义为:

#define SCL_high GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_SET)

#define SCL_low  GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_RESET)

#define SDA_high GPIO_WriteBit(GPIOA, GPIO_Pin_3, Bit_SET)

#define SDA_low  GPIO_WriteBit(GPIOA, GPIO_Pin_3, Bit_RESET)

配置2个引脚为输出功能的函数为:

void OLED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
GPIO_Init(GPIOA,&GPIO_InitStructure); 
GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3);
}

辅助驱动的相关函数为:

void IIC_Start()
{
   SCL_high;
   SDA_high;
   SDA_low;
   SCL_low;
}

void IIC_Stop()
{
   SCL_low;
   SDA_low;
   SCL_high;
   SDA_high;
}

void IIC_Wait_Ack()
{
    SCL_high;
    SCL_low;
}

OLED屏的初始化函数为:

void OLED_Init(void)
{
    SCL_high;
    SDA_high;
    Delay_Ms(800);
    OLED_WR_Byte(0xAE,OLED_CMD);//--display off
    OLED_WR_Byte(0x40,OLED_CMD);//--set start line address
    OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
    OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
    OLED_WR_Byte(0x81,OLED_CMD); // contract control
    OLED_WR_Byte(0xFF,OLED_CMD);//--128
    OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap
    OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
    OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
    OLED_WR_Byte(0x1F,OLED_CMD);//--1/32 duty
    OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
    OLED_WR_Byte(0x00,OLED_CMD);//
    OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
    OLED_WR_Byte(0xf0,OLED_CMD);//
    OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
    OLED_WR_Byte(0x22,OLED_CMD);//
    OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
    OLED_WR_Byte(0x02,OLED_CMD);//
    OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
    OLED_WR_Byte(0x49,OLED_CMD);//
    OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
    OLED_WR_Byte(0x14,OLED_CMD);//
    OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
    OLED_Clear();
}

显示字符串的函数为:

void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size)
{
    unsigned char j=0;
    while (chr[j]!='\0')
    {       
           OLED_ShowChar(x,y,chr[j],Char_Size);
           x+=8;
           if(x>120){x=0;y+=2;}
           j++;
    }
}

实现显示功能的主程序为:

int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    OLED_IO_Init();
    OLED_Init();
    OLED_Clear();
    OLED_ShowString(0,0,"CH32V103",16);
    OLED_ShowString(0,2,"OLED TEST",16);
    while(1) ;
}

经编译下载,其运行结果如下图所示。

image-20210202111900-1.png

 运行效果图

赞赏

1

查看全部赞赏


回复

3327

帖子

1

资源

五彩晶圆(初级)

谢谢分享!显示屏的繁琐操作令人厌烦。

点评

哈哈,在单片机和ARM上使用显示屏还算方便些,若换在FPGA上那就有些头大了,真称得上麻烦的。  详情 回复 发表于 2021-2-2 20:48
个人签名人已离开,无事别找,找也找不到。

回复

795

帖子

2

资源

版主

看这个屏幕有点像华大开发板上的屏幕哈~感谢分享!!!


回复

94

帖子

0

资源

一粒金砂(中级)

w494143467 发表于 2021-2-2 16:51 看这个屏幕有点像华大开发板上的屏幕哈~感谢分享!!!


回复

94

帖子

0

资源

一粒金砂(中级)

freebsder 发表于 2021-2-2 15:56 谢谢分享!显示屏的繁琐操作令人厌烦。

哈哈,在单片机和ARM上使用显示屏还算方便些,若换在FPGA上那就有些头大了,真称得上麻烦的。


回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/6 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表