化合物是什么| 画龙点晴是什么生肖| 办残疾证需要什么条件| 马桶为什么会堵| 什么叫中位数| 肚子突然变大是什么原因| 高血压不能吃什么水果| 雾化对小孩有什么影响或者副作用| 小米什么时候成熟| 闻思修是什么意思| 核磁dwi是什么意思| 乙肝两对半是什么意思| 女性白带有血丝是什么原因| 异性恋是什么意思| 右眼睛跳是什么预兆| 尿急憋不住尿是什么原因| 福报是什么意思| 胡萝卜吃多了有什么坏处| 耳加贵念什么| 锁精环是什么| 经期吃芒果有什么影响| 魔改是什么意思| 咽喉炎吃什么消炎药| 什么是孤独症| 月亮星座代表什么意思| 黄脸婆是什么意思| 狗拉稀吃什么药| 朋友的意义是什么| 吃狗肉有什么危害| 便士是什么意思| 门牙下面的牙叫什么| 煮玉米加盐有什么好处| 干眼症滴什么眼药水好| ufc什么意思| 破月什么意思| 嘴角边长痘痘是什么原因| 早餐吃什么最营养| 吃完饭想吐是什么原因| 喝什么酒不会胖| 弱的部首是什么| 反式脂肪酸是什么| 肝炎是什么原因引起的| 跑步配速什么意思| 西瓜有什么营养和功效| 什么是大运| 睡不着有什么好办法吗| 血药浓度是什么意思| 衍生物是什么意思| 回归热是什么病| 胃窦是什么意思| 什么原因导致缺钾| 劣质是什么意思| bmi指数是什么| 梅花三弄是什么意思| 须尽欢什么意思| 狗被蜱虫咬了有什么症状| 什么是玄关在哪个位置| 肩膀疼吃什么药| 寿辰是什么意思| 胃不好喝什么茶| 为什么会长癣| 小孩出冷汗是什么原因| 两女一杯是什么| 奶阵是什么意思| 小孩经常口腔溃疡是什么原因| 小便多吃什么药好| 带子是什么海鲜| 土羊是什么字| 整体认读音节有什么| 伤到骨头吃什么好得快| 过生日吃什么菜寓意好| 骨髓纤维化是什么病| 舌苔发黄什么原因| 空气炸锅可以做什么| 肝囊肿是什么原因造成的| 代谢慢吃什么效果最快| 金铃子是什么昆虫| smart什么牌子| 大小脸挂什么科| 抗生素是什么| 肌无力是什么原因引起的| 半夜12点是什么时辰| 人血白蛋白适合什么人| 馒头逼是什么意思| 5月3日什么星座| 小腿浮肿什么原因| hbv病毒是什么意思| 九六年属什么的| 脸上长痘痘是什么原因引起的| 阿斯伯格综合症是什么| 口腔溃疡什么症状| 新生儿一直哭闹是什么原因| 7月八号是什么星座| 王维被称为什么| 麻了是什么意思| x58主板配什么cpu| 许嵩的粉丝叫什么| 什么是抑郁症| 地藏王菩萨是管什么的| 消业障是什么意思| 掌纹多而乱代表什么| life style是什么品牌| 哈达是什么意思| 昆仑雪菊有什么作用| 震卦代表什么| 什么是剧烈运动| 肝内钙化灶是什么意思| 睡不着觉是什么原因| 恨嫁什么意思| 床上什么虫子夜间咬人| 多囊不能吃什么食物| 入殓师是什么意思| 藿香正气水什么时候喝| 力是什么| 龙蛇混杂是什么意思| 常吃木耳有什么好处和坏处| 聚酯纤维是什么材质| 尿碘是检查什么的| 宇宙的中心是什么| 真菌最怕什么| 更年期的女人有什么症状表现| 纵欲过度是什么意思| 立棍是什么意思| 肺部纤维灶什么意思| 唇周发黑是什么原因| 小鸭子吃什么| fpa是什么意思| 尿肌酐是什么意思| 老夫老妻什么意思| 口腔有味道是什么原因| 12月27日什么星座| 甲沟炎看什么科室| 红薯用什么繁殖| 50岁掉牙齿是什么原因| 藏红花能治什么病| 小肚子疼是什么原因| 黑色签字笔是什么笔| 女性长期便秘挂什么科| 仪态什么什么| 小孩铅过高有什么症状| 早泄是什么意思| 来大姨妈喝什么最好| 吃鸡蛋有什么好处| 门户网站是什么| 人为什么怕死| 柠檬水喝多了有什么坏处| 老做梦是什么原因| 肩膀酸胀是什么原因| 四岁属什么生肖| gm是什么意思| 讲究是什么意思| 人格分裂什么意思| 王八蛋是什么意思| 潮热是什么意思| 白术有什么作用| 梦见流鼻血是什么征兆| 95年五行属什么| 汗疱疹是什么引起的| 流鼻血是什么引起的| 什么是县级市| 12356是什么电话| 小狗拉稀 吃什么药| 什么是人乳头瘤病毒| 从容不迫什么意思| 百褶裙配什么鞋子| 月柱代表什么| 鸡吃什么| 制剂是什么意思| 天蝎配什么星座| 喝什么水最好| 尿道灼热感吃什么药| 眼角痒是什么原因| 抗凝药是什么意思| 孤寡老人国家有什么政策| 2019年出生属什么生肖| 什么是清宫| 空调吹感冒吃什么药| 维生素e有什么作用| 蓝色加黄色等于什么颜色| 什么人不能种生基| 右眼皮跳是什么预兆男| abo是什么| 纯阴八字为什么要保密| 么么叽是什么意思| 小便有血尿是什么原因| 鲜卑族现在是什么族| 侍郎是什么官职| 黑丝是什么| 做梦梦见大火是什么意思| 肠胃蠕动慢吃什么药| 喝什么解酒最快最有效| 肺栓塞有什么症状| 笑对人生是什么意思| 什么时候解放台湾| 彩虹有什么颜色| 水代表什么| 人参归脾丸和归脾丸有什么区别| 护理学主要学什么| ed患者是什么意思| 孕妇梦到老公出轨什么意思| 鼻子老流鼻涕是什么原因引起| 白细胞偏低是什么原因| 乌龟吃什么蔬菜| 离异什么意思| 荷花五行属什么| 喝酒对胃有什么伤害| 什么鱼最好养| 8.23是什么星座| 寒热错杂吃什么中成药| 酱油和生抽有什么区别| 王维是诗什么| 西瓜又什么又什么| 无极调光是什么意思| 驻马店以前叫什么名字| 椁是什么意思| 风湿是什么原因造成的| 苏小小属什么生肖| 如什么如什么的成语| 三伏贴是什么| 内分泌代谢科是看什么病的| 天上九头鸟地上湖北佬是什么意思| 胃酸反酸水吃什么药| sp什么意思| 外科和内科有什么区别| 基围虾不能和什么一起吃| 阵容是什么意思| 看幽门螺旋杆菌挂什么科| 什么是刷酸| 脱氧核糖是什么| 小结节是什么意思| 谨言慎行下一句是什么| 奋笔疾书的疾是什么意思| 五指毛桃有什么用| 侵蚀是什么意思| 扁桃体发炎挂什么科| 净土的意思是什么| 胳膊肘疼痛是什么原因| maxco是什么牌子| 什么人容易得妄想症| 脂蛋白a高是什么原因| 海带和什么相克| 膝盖内侧疼是什么原因| 痰有腥臭味是什么原因| hcg偏高是什么原因| 血糖高的人吃什么| 头顶疼是什么原因引起的| 同房痛什么原因引起的| 拉肚子吃什么药管用| 心理学属于什么学科| 媚字五行属什么| 叶酸片什么时候吃最好| 肩周炎吃什么药最好| 新斯的明是什么药| 对辣椒过敏有什么症状| 飞机为什么不能说一路顺风| 头顶痛吃什么药效果好| 尿维生素c阳性是什么意思| 吃什么能立马催月经| 布尔乔亚什么意思| 动脉ct主要检查什么| 肥肠炖什么好吃| 查幽门螺杆菌挂什么科| 为什么叫韩国人棒子| 血氧低吃什么提高的快| 百度
打印
[RISC-V MCU 应用开发]

有作为③图表丨2018年阿坝工作怎么干?州委书记说要打赢四场攻坚硬仗

[复制链接]
4246|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 RISCVLAR 于 2021-2-21 16:15 编辑

CH32V103应用教程——IIC-模拟IIC驱动OLED

本章教程主要在第三十七章软件模拟IIC读写EEPROM的基础上进行改动,使用模拟IIC驱动OLED屏。

1、IIC简介及相关函数介绍
关于IIC,在前面第十四章以及第三十七章已进行过介绍,在此不再赘述。

2、硬件设计
本章教程主要使用模拟IIC驱动OLED屏,所用OLED屏为0.96寸OLED屏。程序中配置PA1作为SDA线,PA2作为SCL线,具体连接方式如下:
  • PA1连接OLED屏的SDA引脚
  • PA2连接OLED屏的SCL引脚

3软件设计
关于模拟IIC的初始化配置以及各状态的配置,在前面第三十七章已经介绍,在此不再赘述。本章教程主要对OLED相关配置文件进行介绍,具体如下:
oled.h文件
#ifndef __OLED_H
#define __OLED_H

#include "ch32v10x.h"
#include "ch32v10x_conf.h"

#define OLED_CMD  0
#define OLED_DATA 1

void OLED_ClearPoint(u8 x,u8 y);
void OLED_ColorTurn(u8 i);
void OLED_DisplayTurn(u8 i);
void OLED_WR_Byte(u8 dat,u8 mode);
void OLED_DisPlay_On(void);
void OLED_DisPlay_Off(void);
void OLED_Refresh(void);
void OLED_Clear(void);
void OLED_DrawPoint(u8 x,u8 y,u8 t);
void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2,u8 mode);
void OLED_DrawCircle(u8 x,u8 y,u8 r);
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode);
void OLED_ShowChar6x8(u8 x,u8 y,u8 chr,u8 mode);
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode);
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1,u8 mode);
void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1,u8 mode);
void OLED_ScrollDisplay(u8 num,u8 space,u8 mode);
void OLED_ShowPicture(u8 x,u8 y,u8 sizex,u8 sizey,u8 BMP[],u8 mode);
void OLED_Init(void);

#endif
oled.h文件主要进行相关定义和函数声明;
oled.c文件
#include "oled.h"
#include "oledfont.h"
#include "iic.h"
#include "debug.h"

u8 OLED_GRAM[144][8];

//反显函数
void OLED_ColorTurn(u8 i)
{
    if(i==0)
        {
            OLED_WR_Byte(0xA6,OLED_CMD);//正常显示
        }
    if(i==1)
        {
            OLED_WR_Byte(0xA7,OLED_CMD);//反色显示
        }
}

//屏幕旋转180度
void OLED_DisplayTurn(u8 i)
{
    if(i==0)
        {
            OLED_WR_Byte(0xC8,OLED_CMD);//正常显示
            OLED_WR_Byte(0xA1,OLED_CMD);
        }
    if(i==1)
        {
            OLED_WR_Byte(0xC0,OLED_CMD);//反转显示
            OLED_WR_Byte(0xA0,OLED_CMD);
        }
}

//发送一个字节
//mode:数据/命令标志  0,表示命令;1,表示数据;
void OLED_WR_Byte(u8 dat,u8 mode)
{
    IIC_Start();
    IIC_SendByte(0x78);
    IIC_WaitAck();
    if(mode){IIC_SendByte(0x40);}
    else{IIC_SendByte(0x00);}
    IIC_WaitAck();
    IIC_SendByte(dat);
    IIC_WaitAck();
    IIC_Stop();
}

//开启OLED显示
void OLED_DisPlay_On(void)
{
    OLED_WR_Byte(0x8D,OLED_CMD);//电荷泵使能
    OLED_WR_Byte(0x14,OLED_CMD);//开启电荷泵
    OLED_WR_Byte(0xAF,OLED_CMD);//点亮屏幕
}

//关闭OLED显示
void OLED_DisPlay_Off(void)
{
    OLED_WR_Byte(0x8D,OLED_CMD);//电荷泵使能
    OLED_WR_Byte(0x10,OLED_CMD);//关闭电荷泵
    OLED_WR_Byte(0xAE,OLED_CMD);//关闭屏幕
}

//更新显存到OLED
void OLED_Refresh(void)
{
    u8 i,n;
    for(i=0;i<8;i++)
    {
        OLED_WR_Byte(0xb0+i,OLED_CMD); //设置行起始地址
        OLED_WR_Byte(0x00,OLED_CMD);   //设置低列起始地址
        OLED_WR_Byte(0x10,OLED_CMD);   //设置高列起始地址
        IIC_Start();
        IIC_SendByte(0x78);
        IIC_WaitAck();
        IIC_SendByte(0x40);
        IIC_WaitAck();
        for(n=0;n<128;n++)
        {
            IIC_SendByte(OLED_GRAM[n][i]);
            IIC_WaitAck();
        }
        IIC_Stop();
  }
}

//清屏函数
void OLED_Clear(void)
{
    u8 i,n;
    for(i=0;i<8;i++)
    {
       for(n=0;n<128;n++)
            {
             OLED_GRAM[n][i]=0;//清除所有数据
            }
  }
    OLED_Refresh();            //更新显示
}

//画点
//x:0~127
//y:0~63
//t:1,填充 ;0,清空
void OLED_DrawPoint(u8 x,u8 y,u8 t)
{
    u8 i,m,n;
    i=y/8;
    m=y%8;
    n=1<<m;
    if(t){OLED_GRAM[x][i]|=n;}
    else
    {
        OLED_GRAM[x][i]=~OLED_GRAM[x][i];
        OLED_GRAM[x][i]|=n;
        OLED_GRAM[x][i]=~OLED_GRAM[x][i];
    }
}

//画线
//x1,y1:起点坐标
//x2,y2:结束坐标
void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2,u8 mode)
{
    u16 t;
    int xerr=0,yerr=0,delta_x,delta_y,distance;
    int incx,incy,uRow,uCol;
    delta_x=x2-x1; //计算坐标增量
    delta_y=y2-y1;
    uRow=x1;       //画线起点坐标
    uCol=y1;
    if(delta_x>0)incx=1; //设置单步方向
    else if (delta_x==0)incx=0;//垂直线
    else {incx=-1;delta_x=-delta_x;}
    if(delta_y>0)incy=1;
    else if (delta_y==0)incy=0;//水平线
    else {incy=-1;delta_y=-delta_x;}
    if(delta_x>delta_y)distance=delta_x; //选择基本增量坐标轴
    else distance=delta_y;
    for(t=0;t<distance+1;t++)
    {
        OLED_DrawPoint(uRow,uCol,mode);  //画点
        xerr+=delta_x;
        yerr+=delta_y;
        if(xerr>distance)
        {
            xerr-=distance;
            uRow+=incx;
        }
        if(yerr>distance)
        {
            yerr-=distance;
            uCol+=incy;
        }
    }
}
//x,y:圆心坐标
//r:圆的半径
void OLED_DrawCircle(u8 x,u8 y,u8 r)
{
    int a, b,num;
    a = 0;
    b = r;
    while(2 * b * b >= r * r)
    {
        OLED_DrawPoint(x + a, y - b,1);
        OLED_DrawPoint(x - a, y - b,1);
        OLED_DrawPoint(x - a, y + b,1);
        OLED_DrawPoint(x + a, y + b,1);

        OLED_DrawPoint(x + b, y + a,1);
        OLED_DrawPoint(x + b, y - a,1);
        OLED_DrawPoint(x - b, y - a,1);
        OLED_DrawPoint(x - b, y + a,1);

        a++;
        num = (a * a + b * b) - r*r;   //计算画的点离圆心的距离
        if(num > 0)
        {
            b--;
            a--;
        }
    }
}

//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//size1:选择字体 6x8/6x12/8x16/12x24
//mode:0,反色显示;1,正常显示
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode)
{
    u8 i,m,temp,size2,chr1;
    u8 x0=x,y0=y;
    if(size1==8)size2=6;
    else size2=(size1/8+((size1%8)?1:0))*(size1/2);  //得到字体一个字符对应点阵集所占字节数
    chr1=chr-' ';  //计算偏移后的值
    for(i=0;i<size2;i++)
    {
        if(size1==8)
        {temp=asc2_0806[chr1][i];} //调用0806字体
        else if(size1==12)
        {temp=asc2_1206[chr1][i];} //调用1206字体
        else if(size1==16)
        {temp=asc2_1608[chr1][i];} //调用1608字体
        else if(size1==24)
        {temp=asc2_2412[chr1][i];} //调用2412字体
        else return;
        for(m=0;m<8;m++)
        {
            if(temp&0x01)OLED_DrawPoint(x,y,mode);
            else OLED_DrawPoint(x,y,!mode);
            temp>>=1;
            y++;
        }
        x++;
        if((size1!=8)&&((x-x0)==size1/2))
        {x=x0;y0=y0+8;}
        y=y0;
    }
}

//显示字符串
//x,y:起点坐标
//size1:字体大小
//*chr:字符串起始地址
//mode:0,反色显示;1,正常显示
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode)
{
    while((*chr>=' ')&&(*chr<='~'))//判断是不是非法字符
    {
        OLED_ShowChar(x,y,*chr,size1,mode);
        if(size1==8)x+=6;
        else x+=size1/2;
        chr++;
  }
}

//m^n
u32 OLED_Pow(u8 m,u8 n)
{
    u32 result=1;
    while(n--)
    {
      result*=m;
    }
    return result;
}

//显示数字
//x,y :起点坐标
//num :要显示的数字
//len :数字的位数
//size:字体大小
//mode:0,反色显示;1,正常显示
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1,u8 mode)
{
    u8 t,temp,m=0;
    if(size1==8)m=2;
    for(t=0;t<len;t++)
    {
        temp=(num/OLED_Pow(10,len-t-1))%10;
            if(temp==0)
            {
                OLED_ShowChar(x+(size1/2+m)*t,y,'0',size1,mode);
            }
            else
            {
              OLED_ShowChar(x+(size1/2+m)*t,y,temp+'0',size1,mode);
            }
    }
}

//显示汉字
//x,y:起点坐标
//num:汉字对应的序号
//mode:0,反色显示;1,正常显示
void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1,u8 mode)
{
    u8 m,temp;
    u8 x0=x,y0=y;
    u16 i,size3=(size1/8+((size1%8)?1:0))*size1;  //得到字体一个字符对应点阵集所占字节数
    for(i=0;i<size3;i++)
    {
        if(size1==16)
                {temp=Hzk1[num][i];}//调用16*16字体
        else if(size1==24)
                {temp=Hzk2[num][i];}//调用24*24字体
        else if(size1==32)
                {temp=Hzk3[num][i];}//调用32*32字体
        else if(size1==64)
                {temp=Hzk4[num][i];}//调用64*64字体
        else return;
        for(m=0;m<8;m++)
        {
            if(temp&0x01)OLED_DrawPoint(x,y,mode);
            else OLED_DrawPoint(x,y,!mode);
            temp>>=1;
            y++;
        }
        x++;
        if((x-x0)==size1)
        {x=x0;y0=y0+8;}
        y=y0;
    }
}

//num 显示汉字的个数
//space 每一遍显示的间隔
//mode:0,反色显示;1,正常显示
void OLED_ScrollDisplay(u8 num,u8 space,u8 mode)
{
    u8 i,n,t=0,m=0,r;
    while(1)
    {
        if(m==0)
        {
        OLED_ShowChinese(128,24,t,16,mode); //写入一个汉字保存在OLED_GRAM[][]数组中
            t++;
        }
        if(t==num)
        {
                for(r=0;r<16*space;r++)     //显示间隔
                 {
                    for(i=1;i<144;i++)
                        {
                            for(n=0;n<8;n++)
                            {
                                OLED_GRAM[i-1][n]=OLED_GRAM[i][n];
                            }
                        }
           OLED_Refresh();
                 }
        t=0;
        }
        m++;
        if(m==16){m=0;}
        for(i=1;i<144;i++)                  //实现左移
        {
            for(n=0;n<8;n++)
            {
                OLED_GRAM[i-1][n]=OLED_GRAM[i][n];
            }
        }
        OLED_Refresh();
    }
}

//x,y:起点坐标
//sizex,sizey,图片长宽
//BMP[]:要写入的图片数组
//mode:0,反色显示;1,正常显示
void OLED_ShowPicture(u8 x,u8 y,u8 sizex,u8 sizey,u8 BMP[],u8 mode)
{
    u16 j=0;
    u8 i,n,temp,m;
    u8 x0=x,y0=y;
    sizey=sizey/8+((sizey%8)?1:0);
    for(n=0;n<sizey;n++)
    {
         for(i=0;i<sizex;i++)
         {
                temp=BMP[j];
                j++;
                for(m=0;m<8;m++)
                {
                    if(temp&0x01)OLED_DrawPoint(x,y,mode);
                    else OLED_DrawPoint(x,y,!mode);
                    temp>>=1;
                    y++;
                }
                x++;
                if((x-x0)==sizex)
                {
                    x=x0;
                    y0=y0+8;
                }
                y=y0;
     }
     }
}

//OLED的初始化
void OLED_Init(void)
{
    IIC_Init();
    GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2);

    Delay_Ms(200);              //初始化之前的延时很重要

    OLED_WR_Byte(0xAE,OLED_CMD);//---turn off oled panel
    OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
    OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
    OLED_WR_Byte(0x40,OLED_CMD);//---set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
    OLED_WR_Byte(0x81,OLED_CMD);//---set contrast control register
    OLED_WR_Byte(0xCF,OLED_CMD);//---Set SEG Output Current Brightness
    OLED_WR_Byte(0xA1,OLED_CMD);//---Set SEG/Column Mapping       0xa0左右反置 0xa1正常
    OLED_WR_Byte(0xC8,OLED_CMD);//---Set COM/Row Scan Direction   0xc0上下反置  0xc8正常
    OLED_WR_Byte(0xA6,OLED_CMD);//---set normal display
    OLED_WR_Byte(0xA8,OLED_CMD);//---set multiplex ratio(1 to 64)
    OLED_WR_Byte(0x3f,OLED_CMD);//---1/64 duty
    OLED_WR_Byte(0xD3,OLED_CMD);//---set display offset   Shift Mapping RAM Counter (0x00~0x3F)
    OLED_WR_Byte(0x00,OLED_CMD);//---not offset
    OLED_WR_Byte(0xd5,OLED_CMD);//---set display clock divide ratio/oscillator frequency
    OLED_WR_Byte(0x80,OLED_CMD);//---set divide ratio, Set Clock as 100 Frames/Sec
    OLED_WR_Byte(0xD9,OLED_CMD);//---set pre-charge period
    OLED_WR_Byte(0xF1,OLED_CMD);//---Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
    OLED_WR_Byte(0xDA,OLED_CMD);//---set com pins hardware configuration
    OLED_WR_Byte(0x12,OLED_CMD);
    OLED_WR_Byte(0xDB,OLED_CMD);//---set vcomh
    OLED_WR_Byte(0x40,OLED_CMD);//---Set VCOM Deselect Level
    OLED_WR_Byte(0x20,OLED_CMD);//---Set Page Addressing Mode (0x00/0x01/0x02)
    OLED_WR_Byte(0x02,OLED_CMD);//
    OLED_WR_Byte(0x8D,OLED_CMD);//---set Charge Pump enable/disable
    OLED_WR_Byte(0x14,OLED_CMD);//---set(0x10) disable
    OLED_WR_Byte(0xA4,OLED_CMD);//---Disable Entire Display On (0xa4/0xa5)
    OLED_WR_Byte(0xA6,OLED_CMD);//---Disable Inverse Display On (0xa6/a7)
    OLED_Clear();
    OLED_WR_Byte(0xAF,OLED_CMD);
}

oled.c文件主要进行OLED显示相关函数的配置。关于函数的具体功能请查看程序中函数具体注释,在此不再一一介绍。
main.c文件
/********************************** (C) COPYRIGHT *******************************
* File Name          : main.c
* Author             : WCH
* Version            : V1.0.0
* Date               : 2020/04/30
* Description        : Main program body.
*******************************************************************************/

/*
*@Note
模拟IIC驱动OLED屏:
?PA1连接OLED屏的SDA引脚
?PA2连接OLED屏的SCL引脚

*/

#include "debug.h"
#include "iic.h"
#include "oled.h"
#include "bmp.h"

/*******************************************************************************
* Function Name  : main
* Description    : Main program.
* Input          : None
* Return         : None
*******************************************************************************/
int main(void)
{
    u8 t=' ';
    Delay_Init();
    OLED_Init();
    OLED_ColorTurn(0);    //0正常显示,1 反色显示
    OLED_DisplayTurn(0);  //0正常显示 1 屏幕翻转显示
    while(1)
    {
        OLED_ShowPicture(0,0,128,64,BMP2,1);
        OLED_Refresh();
        Delay_Ms(500);
        OLED_Clear();
        OLED_ShowChinese(0,0,0,16,1); //沁
        OLED_ShowChinese(18,0,1,16,1);//恒
        OLED_ShowChinese(36,0,2,16,1);//单
        OLED_ShowChinese(54,0,3,16,1);//片
        OLED_ShowChinese(72,0,4,16,1);//机

        OLED_ShowString(0,16,"IIC driving OLED",16,1);
        OLED_ShowString(20,32,"2021/02/21",16,1);
        OLED_ShowString(0,48,"ASCII:",16,1);
        OLED_ShowString(63,48,"CODE:",16,1);
        OLED_ShowChar(48,48,t,16,1);//显示ASCII字符
        t++;
        if(t>'~')t=' ';
        OLED_ShowNum(103,48,t,3,16,1);
        OLED_Refresh();
        Delay_Ms(500);
        OLED_Clear();
        OLED_ShowString(0,0,"ABC",8,1);//6*8 “ABC”
        OLED_ShowString(0,8,"ABC",12,1);//6*12 “ABC”
        OLED_ShowString(0,20,"ABC",16,1);//8*16 “ABC”
        OLED_ShowString(0,36,"ABC",24,1);//12*24 “ABC”
        OLED_Refresh();
        Delay_Ms(500);
        OLED_ScrollDisplay(5,4,1);
    }
}

main.c文件主要进行OLED屏显示操作,显示图片、汉字等信息。

4下载验证
将编译好的程序下载到开发版并复位,OLED显示如下:

   

67、模拟IIC-OLED.rar

498.48 KB

相关帖子

沙发
xinpian101| | 2021-2-22 10:10 | 只看该作者
收藏,学习学习。
板凳
xinpian101| | 2021-2-22 10:11 | 只看该作者
移植好像很容易,试试看。
地板
WTDDD| | 2025-08-04 19:13 | 只看该作者
本帖最后由 WTDDD 于 2025-08-04 19:31 编辑

好教程,辛苦了
5
1988020566| | 2022-12-2 19:18 | 只看该作者
模拟iic是最好移植的方式了。              
6
sdlls| | 2022-12-3 15:34 | 只看该作者
这个oled最大的刷新速度是多少?
7
alvpeg| | 2022-12-4 21:11 | 只看该作者
软件模拟IIC还是使用硬件IIC,哪个更好?         
8
timfordlare| | 2022-12-5 20:56 | 只看该作者
可以移植单色的gui过来吗              
9
uiint| | 2022-12-5 21:42 | 只看该作者
SDA如何使用寄存器配置输入和输出呢?
10
linfelix| | 2022-12-5 22:34 | 只看该作者
可以运行spi接口的ssd1306d的例程吗?
11
51xlf| | 2022-12-6 12:41 | 只看该作者
可以移植SSD1306库驱动OLED。  
12
loutin| | 2022-12-6 13:20 | 只看该作者
这个iic是如何区分命令和数据的呢?
13
kkzz| | 2023-1-6 13:40 | 只看该作者
可以驱动彩色屏幕的              
14
mickit| | 2023-1-6 22:17 | 只看该作者
如果屏幕不亮是怎么个原因呢              
15
claretttt| | 2023-2-4 15:37 | 只看该作者
模拟IIC驱动OLED的效果怎么样?
16
yeates333| | 2023-2-4 15:45 | 只看该作者
iic模拟的速度怎么样?              
17
jimmhu| | 2023-2-4 18:27 | 只看该作者
ssd1306的程序有很多。              
18
macpherson| | 2023-2-4 20:53 | 只看该作者
这个可以移植gui吗?              
19
phoenixwhite| | 2023-2-7 20:58 | 只看该作者
oled屏幕刷屏的效果如何?              
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

133

主题

296

帖子

44

粉丝
什么茶能去体内湿气 气短吃什么药 鱼肝油又叫什么名字 白色念珠菌是什么意思 膝盖疼痛什么原因
食指戴戒指代表什么 黑素瘤早期什么症状 自己家院子种什么树好 什么情况下要打破伤风针 射精无力吃什么药
鸡肉和什么不能一起吃 夏天肚子疼是什么原因 心阳不足吃什么中成药 走后门什么意思 鞘是什么意思
打喷嚏头疼是什么原因 肠胃炎吃什么好 法院是什么机关 甘草长什么样子图片 胃腺息肉什么意思
3月20号是什么星座hcv9jop0ns1r.cn 96199是什么电话hcv8jop7ns8r.cn 水鱼是什么意思hcv9jop3ns3r.cn 鸡米头是什么hcv9jop5ns7r.cn beetle是什么车jingluanji.com
除日是什么意思fenrenren.com ot什么意思hcv8jop5ns6r.cn 治疗早泄吃什么药adwl56.com 身份证数字分别代表什么hcv8jop0ns9r.cn 封面是什么意思hcv8jop9ns7r.cn
怀孕天数从什么时候算起hcv8jop3ns2r.cn 牙膏属于什么类商品hcv8jop9ns7r.cn 什么花不能浇水zhongyiyatai.com 尿液是什么味道hcv8jop5ns7r.cn 弱点是什么意思hcv8jop8ns7r.cn
处女男喜欢什么样的女生hcv7jop5ns0r.cn earth是什么意思0297y7.com 淋巴是什么东西hcv7jop9ns5r.cn dbm是什么单位baiqunet.com 盐酸多西环素片治什么病bfb118.com
百度