基于昊芯DSC28034+四针OLED屏 显示文字及数字

/******************************************************************
编  译  器:haawking ide v0.1.2
d  s  p:dsc28034湖人板
电 脑 配 置:windows10 专业版; 64 位操作系统
仿  真  器:hx100v2
使  用  库:无
作         用:在oled屏上显示文字及数字
说         明:无
版         本:v0.0.1
******************************************************************/
oled屏资料:
链接:https://pan.baidu.com/s/1sqlrv6j09xkwtcqlfhxdxq 
提取码:8034
四针的oled屏用iic来写,原理在资料中 ,再结合以下例程,定能够轻松上手:
iic_oled.c、
//gpio配置
void i2c_gpio_config_oled(void)
{
    eallow;
    gpioctrlregs.gpapud.bit.gpio14 = 0;
    gpioctrlregs.gpapud.bit.gpio15 = 0;
gpioctrlregs.gpaqsel1.bit.gpio14 = 3;
    gpioctrlregs.gpaqsel1.bit.gpio15 = 3;
gpioctrlregs.gpadir.bit.gpio14 = 1;
    gpioctrlregs.gpadir.bit.gpio15 = 1;
gpioctrlregs.gpamux1.bit.gpio14 = 0; 
    gpioctrlregs.gpamux1.bit.gpio15 = 0;
gpiodataregs.gpaset.bit.gpio14 = 1;
    gpiodataregs.gpaset.bit.gpio15 = 1;
edis;
}
//得到输入数字的长度
int data_len(int data)
{
        int n=0;
        if(data==0)
        return ++n;
    while(data!=0)
    {
        n++;
        data/=10;
    }
    return n;
}
//延时
void i2c_oled_delay(void)   //延时函数
{
    int i =50;
    while(i)
    {
        i--;
    }
}
//延时
void i2c_oled_delay_more(void)
{
    int i =200;
    while(i)
    {
        i--;
    }
}
//以gpio14为scl,gpio15为sda向oled模块传送起始位
bool i2c_oled_start(void)//iic起始位
{
    sda1_h;
    scl1_h;
    i2c_oled_delay();
    if(!sda1_read)//sda线为低电平,总线忙,退出
    {
        return 0;
    }
    sda1_l;
    i2c_oled_delay();
    if(sda1_read)//sda线为高电平则总线出错,退出
    {
        return 0;
    }
    sda1_l;
    i2c_oled_delay();
    return 1;
}
//以gpio14为scl,gpio15为sda向oled模块传送停止位
void i2c_oled_stop(void)
{
    scl1_l;
    i2c_oled_delay();
    sda1_l;
    i2c_oled_delay();
    scl1_h;
    i2c_oled_delay();
    sda1_h;
}
//以gpio14为scl,gpio15为sda向oled模块传送响应位
void i2c_oled_ack(void)
{
    scl1_l;
    i2c_oled_delay();
    sda1_l;
    i2c_oled_delay();
    scl1_h;
    i2c_oled_delay();
    scl1_l;
    i2c_oled_delay();
}
//以gpio14为scl,gpio15为sda向oled模块传送不响应位
void i2c_oled_noack(void)//不响应位
{
    scl1_l;
    i2c_oled_delay();
    sda1_h;
    i2c_oled_delay();
    scl1_h;
    i2c_oled_delay();
    scl1_l;
    i2c_oled_delay();
}
//接受ack,有返回1,无返回0
bool i2c_oled_waitack(void)//0无ack,1有ack
{
    eallow;
    gpioctrlregs.gpadir.bit.gpio15 = 0;            //配置gpio15(sda)为输入模式
    scl1_l;
    i2c_oled_delay();
    sda1_h;
    i2c_oled_delay();
    scl1_h;
    i2c_oled_delay();
    if(sda1_read)
    {
      scl1_l;
      i2c_oled_delay();
      return 0;
    }
    scl1_l;
    i2c_oled_delay();
    gpioctrlregs.gpadir.bit.gpio15 = 1;        //配置gpio15为输出模式
    edis;
    return 1;
}
//判断是否有ack,有返回1,无返回0
bool juge_ack_oled(void)//判断有无ack
{
     if(!i2c_oled_waitack())
        {
         i2c_oled_stop();
            return 0;
        }
     return 1;
}
//用iic协议写数据sendbyte
void i2c_oled_sendbyte(uint8 sendbyte)   //写入
{
    uint8 i=8;
    while(i--)
    {
        scl1_l;
        i2c_oled_delay();
      if(sendbyte&0x80)
        sda1_h;
      else
        sda1_l;
        sendbyte=sendbyte<<1;
        i2c_oled_delay();
        scl1_h;
        i2c_oled_delay();
    }
    scl1_l;
}
//向oled模块传送写命令的要求,0x00,写命令iic_command(oled模块的写时序)
bool write_iic_oled_command(uint8 iic_command)//写命令
{
    if(!i2c_oled_start())
    {
        return 0;//总线忙或出错
    }
    i2c_oled_sendbyte(oled_addr);            //slave address,sa0=0
    if(!juge_ack_oled())
        return 0;
    i2c_oled_sendbyte(0x00);    //write command
    if(!juge_ack_oled())
        return 0;
    i2c_oled_sendbyte(iic_command);
    if(!juge_ack_oled())
        return 0;
    i2c_oled_stop();
    return 1;
}
//向oled模块传送写数据的要求,0x40,写数据iic_data(oled模块的写时序)
bool write_iic_oled_data(uint8 iic_data)//写数据
{
    if(!i2c_oled_start())
    {
        return 0;//总线忙或出错
    }
    i2c_oled_sendbyte(oled_addr);             //d/c#=0; r/w#=0
    if(!juge_ack_oled())
        return 0;
    i2c_oled_sendbyte(0x40);            //write data
    if(!juge_ack_oled())
        return 0;
    i2c_oled_sendbyte(iic_data);
    if(!juge_ack_oled())
        return 0;
    i2c_oled_stop();
    return 1;
}
//选择是写数据还是写命令,cmd==1则写数据,否则写命令
void oled_wr_byte(uint8 dat,int cmd)//写数据或命令
{
    if(cmd)
    {
        write_iic_oled_data(dat);
    }
    else
    {
        write_iic_oled_command(dat);
    }
}
//写入fill_data整个oled屏幕
void fill_picture(uint8 fill_data)
{
    uint8 m,n;
    for(m=0;m4)|0x10,oled_cmd);//列高地址
    oled_wr_byte((x&0x0f),oled_cmd);                //列低地址
}
//开启oled显示
void oled_display_on(void)
{
    oled_wr_byte(set_dcdc,oled_cmd);  //set dcdc命令
    oled_wr_byte(0x14,oled_cmd);  //dcdc on
    oled_wr_byte(display_on,oled_cmd);  //display on
}
//关闭oled显示
void oled_display_off(void)
{
    oled_wr_byte(set_dcdc,oled_cmd);  //set dcdc命令
    oled_wr_byte(0x10,oled_cmd);  //dcdc off
    oled_wr_byte(display_off,oled_cmd);  //display off
}
//清屏
void oled_clear(void)
{
    uint8 i,n;
    for(i=0;i<8;i++)
    {
        oled_wr_byte (page_address+i,oled_cmd);    //设置页地址(0~7)
        oled_wr_byte (low_column_address,oled_cmd);      //设置显示位置—列低地址
        oled_wr_byte (high_column_address,oled_cmd);      //设置显示位置—列高地址
        for(n=0;n<128;n++)
        {
            oled_wr_byte(0,oled_data);
            i2c_oled_delay_more();
        }
    }
}
//全亮,将屏幕全变亮
void oled_on(void)
{
    uint8 i,n;
    for(i=0;i<8;i++)
    {
        oled_wr_byte (page_address+i,oled_cmd);    //设置页地址(0~7)
        oled_wr_byte (low_column_address,oled_cmd);      //设置显示位置—列低地址
        oled_wr_byte (high_column_address,oled_cmd);      //设置显示位置—列高地址
        for(n=0;nmax_column-1)
        {
            x=0;
            y=y+2;
        }
        if(char_size ==16)
        {
            oled_set_pos(x,y);
            for(i=0;i<8;i++)
            {
                oled_wr_byte(f8x16[c*16+i],oled_data);
                i2c_oled_delay_more();
            }
            oled_set_pos(x,y+1);
            for(i=0;i<8;i++)
            {
                oled_wr_byte(f8x16[c*16+i+8],oled_data);
                i2c_oled_delay_more();
            }
        }
        else
        {
            oled_set_pos(x,y);
            for(i=0;i<6;i++)
                oled_wr_byte(f6x8[c][i],oled_data);
        }
}
//指数函数,m^n
uint32 oled_pow(int m,int n)
{
    uint32 result=1;
    while(n--)
        result*=m;
    return result;
}
//在指定位置(x,y)显示一串数字
void oled_shownum(int x,int y,uint32 num,int len,int size2)
{
    int t,temp;
    int enshow=0;
    for(t=0;t;t++)
    {
        temp=(num/oled_pow(10,len-t-1))%10;
        if(enshow==0&&t<(len-1))
        {
            if(temp==0)
            {
                oled_showchar(x+(size2/2)*t,y,0,size2);
                i2c_oled_delay_more();
                continue;
            }else enshow=1;
        }
         oled_showchar(x+(size2/2)*t,y,temp,size2);
        i2c_oled_delay_more();
    }
}
//在指定位置(x,y)显示汉字
void oled_showchinese(int x,int y,uint8 no)
{
    uint8 t;
    oled_set_pos(x,y);
    for(t=0;t<16;t++)
    {
        oled_wr_byte(hzk[2*no][t],oled_data);
        i2c_oled_delay_more();
    }
    oled_set_pos(x,y+1);
    for(t=0;tintosc1trim.bit.coarsetrim = 0;
    p_sysctrlregs->intosc2trim.bit.coarsetrim= 0;
    edis;
    initsysctrl();
    dint;
    initpiectrl();
    ier_disable(0xffff);
    ifr_disable(0xffff);
    initpievecttable();
    i2c_gpio_config_oled();
    oled_init();
    eint;
    oled_clear();
    oled_showchinese(28,0,0);
    oled_showchinese(44,0,1);
    oled_showchinese(60,0,2);
    oled_showchinese(76,0,3);
    oled_showchar(16,4,16,16);
    oled_showchar(24,4,17,16);
    oled_showchar(32,4,16,16);
    oled_showchar(40,4,13,16);
    oled_showchar(48,4,22,16);
    oled_showchar(56,4,17,16);
    oled_showchar(64,4,25,16);
    oled_showchar(72,4,19,16);
    oled_showchar(80,4,20,16);
    oled_showchar(88,4,21,16);
    oled_showchar(96,4,22,16);
    oled_showchar(104,4,17,16);
    while(1){}
    return 0;
}
接线以及显示效果:
详细例程请参考
链接:https://pan.baidu.com/s/1c8i7osgjkifgp8ux-u6tmg 
提取码:8034
————————————————
特别鸣谢 原创作者  博主「晟逸轩」

AR和MR共享体验是未来AR/MR的发展方向吗
为什么LDPC码不适合工业存储
realme X大师白蒜配色版正式发布搭载了骁龙710处理器屏占比高达91.2%
测量角位移的数字编码器-玻璃码盘介绍
机器视觉的五大典型应用
基于昊芯DSC28034+四针OLED屏 显示文字及数字
电源滤波电容的作用的选择
PS-9305S系列三轴按键试验机有哪些作用
无人机有哪些关键技术?
AT90S1200智力抢答器,AT90S1200 Responder
ZDS2024:一款面向工程师的更全面的示波器
今年最终户用光伏新增装机量将超过10GW,达到一个新的里程碑
KAIST最终赢得了“AI世界杯”冠军
奥比中光获专精特新“小巨人”企业认证
继续耍猴吧,红米note4X用的是骁龙625
全球首款碳纤维手机成功问世
AppleWatch5或继续延用OLED显示屏 并提供钛合金和陶瓷表壳型号供选择
iPhone12 Pro Max到底值不值得购买?
福特全新车型电动跨界SUV Mach-E即将发布百公里加速只需要5秒
体育馆人脸识别系统的应用案例