在上文中,分析了wiringPi 的oled demo是使用devfs来控制spi master和spi slave通讯。

https://blog.csdn.net/feiwatson/article/details/81149028

再详细分析一下demo的OLED SSD1306相关代码。

定义一个buffer

unsigned char buffer[1024];

初始化

void SSD1306_begin()
{
pinMode(RST,OUTPUT); //Pin24 设置为输出
pinMode(DC,OUTPUT); //Pin27 设置为输出
wiringPiSPISetup(channel,2000000); //2M digitalWrite(RST,HIGH); //reset
delay(10);
digitalWrite(RST,LOW);
delay(10);
digitalWrite(RST,HIGH); command(SSD1306_DISPLAYOFF);
command(SSD1306_SETDISPLAYCLOCKDIV);
command(0x80); // the suggested ratio 0x80 command(SSD1306_SETMULTIPLEX);
command(0x3F);
command(SSD1306_SETDISPLAYOFFSET);
command(0x0); // no offset
command(SSD1306_SETSTARTLINE | 0x0); // line #0
command(SSD1306_CHARGEPUMP);
command((vccstate == SSD1306_EXTERNALVCC) ? 0x10 : 0x14); command(SSD1306_MEMORYMODE);
command(0x00); // 0x0 act like ks0108 command(SSD1306_SEGREMAP | 0x1);
command(SSD1306_COMSCANDEC);
command(SSD1306_SETCOMPINS);
command(0x12); // TODO - calculate based on _rawHieght ?
command(SSD1306_SETCONTRAST);
command((vccstate == SSD1306_EXTERNALVCC) ? 0x9F : 0xCF);
command(SSD1306_SETPRECHARGE);
command((vccstate == SSD1306_EXTERNALVCC) ? 0x22 : 0xF1);
command(SSD1306_SETVCOMDETECT);
command(0x40);
command(SSD1306_DISPLAYALLON_RESUME);
command(SSD1306_NORMALDISPLAY);
command(SSD1306_DISPLAYON);
}

设置一个pixel对应的buffer中的bit. 一列8个pixel对应一个buffer字节

void SSD1306_pixel(int x,int y,char color)
{
if(x > width || y > height)return ;
if(color)
buffer[x+(y/8)*width] |= 1<<(y%8);
else
buffer[x+(y/8)*width] &= ~(1<<(y%8));
}

其他的SSD1306_bitmap , SSD1306_string, SSD1306_char3216, SSD1306_char1616等函数通过调用SSD1306_pixel设置buffer

将buffer中缓冲的图像显示

void SSD1306_display()
{
command(SSD1306_COLUMNADDR);
command(0); //cloumn start address
command(width -1); //cloumn end address
command(SSD1306_PAGEADDR);
command(0); //page atart address
command(pages -1); //page end address
digitalWrite(DC,HIGH);
wiringPiSPIDataRW(channel,buffer,sizeof(buffer));
}

图片中显示图像的代码如下

int main(int argc,char **argv)
{
time_t now;
struct tm *timenow;
if(wiringPiSetup() < 0)return 1;
printf("OLED Test Program !!!\n"); SSD1306_begin();
SSD1306_bitmap(0,0,waveshare,128,64);
SSD1306_display();
delay(2000);
SSD1306_clear();
while(1)
{
time(&now);
timenow = localtime(&now); SSD1306_bitmap(0, 2, Singal816, 16, 8);
SSD1306_bitmap(24, 2,Bluetooth88, 8, 8);
SSD1306_bitmap(40, 2, Msg816, 16, 8);
SSD1306_bitmap(64, 2, GPRS88, 8, 8);
SSD1306_bitmap(90, 2, Alarm88, 8, 8);
SSD1306_bitmap(112, 2, Bat816, 16, 8); SSD1306_string(0, 52, "MUSIC", 12, 0);
SSD1306_string(52, 52, "MENU", 12, 0);
SSD1306_string(98, 52, "PHONE", 12, 0); SSD1306_char3216(0,16, value[timenow->tm_hour/10]);
SSD1306_char3216(16,16, value[timenow->tm_hour%10]);
SSD1306_char3216(32,16, ':');
SSD1306_char3216(48,16, value[timenow->tm_min/10]);
SSD1306_char3216(64,16, value[timenow->tm_min%10]);
SSD1306_char3216(80,16, ':');
SSD1306_char3216(96,16, value[timenow->tm_sec/10]);
SSD1306_char3216(112,16, value[timenow->tm_sec%10]); SSD1306_display();
}
return 0;
}

树莓派 -- oled 续(1) wiringPi的更多相关文章

  1. 树莓派 -- oled 续(2) python

    上文中的代码通过wiringPi的API调用devfs API来显示图片. 这里分析的Python代码也通过类似的方法来显示图片. 主要用到了两个Library. import spidev impo ...

  2. 树莓派 -- oled

    硬件 SPI0,CE0 SPI Master Driver 设备树 arch\arm\boot\dts\bcm2710-rpi-3-b.dts &gpio { spi0_pins: spi0_ ...

  3. 树莓派4b 安装最新wiringpi库

    树莓派4自带的wiringPi库默认是2.50,无法映射到gpio,所以需要更新到2.52才能与树莓派映射: 1. 安装自带的wiringPi库 $ Sudo apt-get install wiri ...

  4. 树莓派OLED模块的使用教程大量例程详解

    简介 Python有两个可以用的OLED库 [Adafruit_Python_SSD1306库]->只支持SSD1306 [Luma.oled库]->支持SSD1306 / SSD1309 ...

  5. 基础篇:一文讲懂树莓派命令行文本编辑工具Vim的使用

    简介 众所周知,在Linux系统下的命令行调试界面,经常会遇到需要文本编辑的情况,而树莓派官方系统默认自带了Nano编辑器,Nano的操作门槛更低,但却不如Vim编辑器方便.Vim编辑器是由早期在Li ...

  6. ApacheCN C/C++ 译文集(二) 20211204 更新

    编写高效程序的艺术 零.序言 第一部分:性能基础 一.性能和并发性介绍 二.性能测量 三.CPU 架构.资源和性能 四.内存架构和性能 五.线程.内存和并发 第二部分:高级并发 六.并发和性能 七.并 ...

  7. 树莓派wiringPi库详解

    wiringPi是一个很棒的树莓派IO控制库,使用C语言开发,提供了丰富的接口:GPIO控制,中断,多线程,等等.java 的pi4j项目也是基于wiringPi的,我最近也在看源代码,到时候整理好了 ...

  8. 树莓派学习路程No.1 GPIO功能初识 wiringPi安装

    WiringPi是应用于树莓派平台的GPIO控制库函数,WiringPi遵守GUN Lv3.wiringPi使用C或者C++开发并且可以被其他语言包转,例如python.ruby或者PHP等.Wiri ...

  9. 树莓派wiringPi,BCM,BOARD编码对应管脚

    wiringPi,BCM,BOARD编码 由于上课需要, 嵌入式学习从树莓派开始 树莓派中执行: $> gpio readall 即可得到关于树莓派管脚的各种信息 上面的图可能不是特别清楚, 可 ...

随机推荐

  1. bzoj 1898: [Zjoi2005]Swamp 沼泽鳄鱼【dp+矩阵快速幂】

    注意到周期234的lcm只有12,也就是以12为周期,可以走的状态是一样的 所以先预处理出这12个状态的转移矩阵,乘起来,然后矩阵快速幂优化转移k/12次,然后剩下的次数暴力转移即可 #include ...

  2. bzoj 1502 月下柠檬树【Simpson积分】

    投影到地面之后,会发现圆形在平行光下面积和形状是不会变的,也就是所要求的图形是若干个圆和把相邻两个圆连起来的公切线所组成的. 公切线和圆间距瞎求一下就行,注意要去掉被完全覆盖的圆 然后simpson即 ...

  3. bzoj1483: [HNOI2009]梦幻布丁(vector+启发式合并)

    1483: [HNOI2009]梦幻布丁 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 4022  Solved: 1640[Submit][Statu ...

  4. 版本管理工具 Git

    Git是目前世界上最先进的分布式版本控制系统(没有之一). 文章参考来源: https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248 ...

  5. .Net Core之Configuration

    ASP.NET CORE 中自动集成了应用配置,支持从以下 源 处获取配置键值对 命令行 环境变量 内存 文件配置 其中文件配置是我们最常用的方式,默认文件是.json的json格式文件,摒弃了以往. ...

  6. 跨域时发送预检请求,tp5的restful无options方法的解决方案

    解决 跨域问题解决 问题:使用vue-resource发送delete请求时报options请求404 思考:明明发送的是delete请求,为何变成了options请求? 答:跨域情况下,PUT,DE ...

  7. 针对IE浏览器里面CSS的Bug解决方法

    IE6双倍边距bug 当页面内有多个连续浮动时,如本页的图标列表是采用左浮动,此时设置li的左侧margin值时,在最左侧呈现双倍情况.如外边距设置为10px, 而左侧则呈现出20px,解决它的方法是 ...

  8. [CF997E] Good SubSegment

    Description Transmission Gate 给你一个长度为n的排列P,定义一段子区间是好的,当且仅当这个子区间内的值构成了连续的一段.例如对于排列\(\{1,3,2\}\),\([1, ...

  9. Hdu 3605 Escape (最大流 + 缩点)

    题目链接: Hdu 3605  Escape 题目描述: 有n个人要迁移到m个星球,每个星球有最大容量,每个人有喜欢的星球,问是否所有的人都能迁移成功? 解题思路: 正常情况下建图,不会爆内存,但是T ...

  10. 一个简单的jsp+servlet登录界面的总结

    这个登录界面我是用eclipse+tomcat7来实现的(网上比较多都是用myeclipse来做的) 1.首先是关于servlet部署的问题 首先你的servlet类要写在WEB-INF的Class文 ...