在上文中,分析了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. linux 文件查阅 cat、more、less、tail

    文件内容查阅1.cat由第一行开始显示文件内容2.tac:从最后一行开始显示,可以看出tac是cat的倒写形式.3.nl:显示的时候,顺便输出行号;4.more:一页一页地显示文件内容5.less:与 ...

  2. 题解报告:poj 2533 Longest Ordered Subsequence(最长上升子序列LIS)

    Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence ...

  3. python_基础部分(1)

    第1章 Python介绍 1.1 基础介绍 l  代码:代码的出现是为了解决生活中的问题 l  编译解释器:目的是让解释器将代码翻译成计算机可识别的语言 l  编程语言:按照一定规则写出来的语言, C ...

  4. Suricata的所有运行方式模式(图文详解)

    不多说,直接上干货! suricata的基本组成.Suricata是由所谓的线程(threads).线程模块 (thread-modules)和队列(queues)组成.Suricata是一个多线程的 ...

  5. 初学Ajax

    AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. AJAX = 异步 JavaScript和 ...

  6. php数组转为字符串,数据库存储

    php对象转字符存储数据库的方法. 总所周知对象是不能直接存储到数据库的.那么我们用什么样的方法能够存储到数据库中能? 方法一:序列化serialize和unserialize 序列化对象serial ...

  7. SpringBoot_自定义配置属性

    @ConfigurationProperties 在aplication.properties 中添加如下一段配置: mysql.jdbcName=com.mysql.jdbc.Driver mysq ...

  8. Activiti工作流和shiro权限管理关系图

  9. jquery js 分页

    <html xmlns="http://www.w3.org/1999/xhtml"><head>    <title>jQuery.pager ...

  10. android中使用图文并茂的按钮

    代码: <LinearLayout android:orientation="horizontal" android:layout_width="match_par ...