OLED相信大家都认识,是一个很常见的显示模块,但是现在网上买的许多oled显示模块因为底层驱动的原因,在编程时对显示有很大的局限性(特别是对51内核的单片机),在定义坐标行数显示的时候往往需要是8的倍数,以下便是针对这个问题做出的改进。

首先介绍一下这篇文章的核心思想,我们都知道以oled12864为例,其实就是128*64个灯,当选择相应坐标的灯点亮就能显示相对应的数字,字符或者是图像。针对上面问题,我们可以建立和显示屏分辨率一样的二维数组,当我们需要将数值显示到显示屏上时,先将数值赋值给数组相同坐标上的值。所以,我们的核心思想其实就是写一个可以在显示屏上任意位置点亮灯的程序,然后结合这个程序和取模软件实现在显示屏任意坐标显示的功能。

二维表:

unsigned char OLED_GRAM[144][8];

以下是打点程序:

//画点
//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];}
}

有了这个程序就可以显示数字,字符,汉字,图片等等:

//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//sizey:选择字体 6x8  8x16
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 sizey,u8 mode)
{       u8 chr1,m,temp;u8 i=0,size1;u8 x0=x,y0=y;if(sizey==8)size1=6;else size1=(sizey/8+((sizey%8)?1:0))*(sizey/2);chr1=chr-' ';//得到偏移后的值for(i=0;i<size1;i++){if(sizey==8){temp=asc2_0806[chr1][i];} //调用0806字体else if(sizey==16){temp=asc2_1608[chr1][i];} //调用1608字体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((sizey!=8)&&((x-x0)==sizey/2)){x=x0;y0=y0+8;}y=y0;}
}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 :数字的位数
//sizey:字体大小
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);}}
}
//显示汉字
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=Hzk[num][i];}//调用16*16字体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;}
}
//显示图片
//x,y显示坐标
//sizex,sizey,图片长宽
//BMP:要显示的图片
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;}}
}

最后我们通过图片显示函数将大小为128*64的二维数组过渡打印到显示屏,到处,这个功能就实现啦。因为51单片机是8位单片机,很多时候处理起来会比较慢,而且flash空间也比较小,所以在使用stc15f2k60s2单片机和oled12864进行开发的时候推荐使用isp通信提高刷新率。

STC15F2K60S2+OLED12864相关推荐

  1. 蓝桥杯单片机stc15f2k60s2 中断函数代码模板注释

    用到哪些寄存器? 中断使能寄存器//                                              EA=1(总使能开),ET0=1(T0中断允许)  定时器/计数器控制寄 ...

  2. 树莓派之OLED12864视频播放—BadApple

    代码地址如下: http://www.demodashi.com/demo/13218.html 概述 本篇教程讲述了使用树莓派驱动OLED12864液晶屏,并在液晶屏上播放动画和视频. 硬件平台 树 ...

  3. 【开源STC15开发板】STC15F2K60S2开发板

    [开源STC15开发板]STC15F2K60S2开发板 2022-7-6 补充说明: STC15系列单片机最多有62个I/0口(如64-pin单片机):P0.0 ~ P0.7,P1.0-Pl.7,P2 ...

  4. STC15F2K60S2实现A/D转换

    1 实现功能 以中断方式进行A/D转换,取10位精度,并送P3和P2口LED灯显示(低电平驱动),P3口显示最高2位,P2口显示第8位. 2 程序代码 #include"STC15F2K60 ...

  5. 【Proteus仿真】Arduino UNO+OLED12864 I2C接口跑图形库

    [Proteus仿真]Arduino UNO+OLED12864 I2C接口跑图形库 Proteus仿真 基于VSM Studio代码 主程序代码 /************************* ...

  6. 0.96寸IIC接口ssd1306和ssd1315驱动oled12864屏幕介绍

    0.96寸IIC接口ssd1306和ssd1315驱动oled12864屏幕介绍 图为中景园的0.96寸ssd1306屏幕,适合于PCB一体化设计.如果想分开,可以直接购买带焊接好转接的OLED屏幕. ...

  7. OLED12864播放视频

    OLED12864播放视频 最近看了B站up@会飞的阿卡林做的一个主板小屏幕,可以在一块0.96寸的12864上播放视频,觉得十分不错,up还附上了上位机软件和NodeMCU单片机的代码.不过上位机代 ...

  8. STC15f2k60s2C语言定时器2,STC15F2K60S2 定时器2测试C.doc

    STC15F2K60S2 定时器2测试C //本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译 //假定测试芯片的工作频率为18.432MHz #include "stc ...

  9. 对于reg51.h、reg52.h、regx52.h、stc15f2k60s2.h的思考

    早在学习51单片机时就在想这几个头文件到底有什么区别,在不同的地方有不同的用法.现在再回过头来看心中不禁了然. reg52.h和stc15f2k60s2.h对于使用蓝桥杯的板子,都可以正常使用,但是又 ...

最新文章

  1. jenkins pipeline脚本_Jenkins 创建流水线 (Pipeline) 项目的脚本
  2. beta book读书俱乐部的构思
  3. 吴恩达deeplearning资源汇总帖
  4. C语言 —— 贪吃蛇
  5. angular语言前端开发_web前端开发入门全套学习方法路径,兼职在家做网站也能月入上万...
  6. python利用pygame框架实现类似推箱子游戏 Star Pusher
  7. easymock使用方法_EasyMock最终方法– PowerMock,JUnit 4,TestNG
  8. python画折线图参数配置
  9. 完美卸载SQL Server2014数据库
  10. android笑脸切图,朋友圈小符号表情怎么弄?朋友圈文案小符号表情大全
  11. 设备状态监测及故障预警,你了解多少?
  12. 时光轴一之listView实现时光轴效果
  13. 未转变者3.x局域网服务器,未转变者局域网怎么创建服务器
  14. 获取图片外链的方法--网易相册
  15. 如何使用swagger的API接口获取数据并且封装
  16. JS 全屏和退出全屏--requestFullScreen详解及兼容代码
  17. 计算机网络——互联网上的音/视频服务
  18. python将图片转换为csv
  19. HTML绘制七巧板,如何使用HTML5 CSS3制作简单七巧板
  20. 数据通信初级工程师题库

热门文章

  1. nnUNet实战一使用预训练nnUNet模型进行推理
  2. ARIS:Architecture of Integrated Information System 简介和图例说明
  3. 2021年互联网公司的获客成本概览
  4. 离线安装cdh6.3.1
  5. 技术员工离职后留下的坑,再找一个人填上,就万事大吉了吗
  6. C语言函数调用时候内存中栈的动态变化详细分析
  7. 当当网Day2-Day3
  8. dbo oracle,Oracle.ManagedDataAccess.EntityFramework – ORA-01918:用户’dbo’不存在
  9. QT多线程临界资源互斥
  10. 【2014】如何才能快速学好英语语法