树莓派 -- oled 续(1) wiringPi
在上文中,分析了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的更多相关文章
- 树莓派 -- oled 续(2) python
上文中的代码通过wiringPi的API调用devfs API来显示图片. 这里分析的Python代码也通过类似的方法来显示图片. 主要用到了两个Library. import spidev impo ...
- 树莓派 -- oled
硬件 SPI0,CE0 SPI Master Driver 设备树 arch\arm\boot\dts\bcm2710-rpi-3-b.dts &gpio { spi0_pins: spi0_ ...
- 树莓派4b 安装最新wiringpi库
树莓派4自带的wiringPi库默认是2.50,无法映射到gpio,所以需要更新到2.52才能与树莓派映射: 1. 安装自带的wiringPi库 $ Sudo apt-get install wiri ...
- 树莓派OLED模块的使用教程大量例程详解
简介 Python有两个可以用的OLED库 [Adafruit_Python_SSD1306库]->只支持SSD1306 [Luma.oled库]->支持SSD1306 / SSD1309 ...
- 基础篇:一文讲懂树莓派命令行文本编辑工具Vim的使用
简介 众所周知,在Linux系统下的命令行调试界面,经常会遇到需要文本编辑的情况,而树莓派官方系统默认自带了Nano编辑器,Nano的操作门槛更低,但却不如Vim编辑器方便.Vim编辑器是由早期在Li ...
- ApacheCN C/C++ 译文集(二) 20211204 更新
编写高效程序的艺术 零.序言 第一部分:性能基础 一.性能和并发性介绍 二.性能测量 三.CPU 架构.资源和性能 四.内存架构和性能 五.线程.内存和并发 第二部分:高级并发 六.并发和性能 七.并 ...
- 树莓派wiringPi库详解
wiringPi是一个很棒的树莓派IO控制库,使用C语言开发,提供了丰富的接口:GPIO控制,中断,多线程,等等.java 的pi4j项目也是基于wiringPi的,我最近也在看源代码,到时候整理好了 ...
- 树莓派学习路程No.1 GPIO功能初识 wiringPi安装
WiringPi是应用于树莓派平台的GPIO控制库函数,WiringPi遵守GUN Lv3.wiringPi使用C或者C++开发并且可以被其他语言包转,例如python.ruby或者PHP等.Wiri ...
- 树莓派wiringPi,BCM,BOARD编码对应管脚
wiringPi,BCM,BOARD编码 由于上课需要, 嵌入式学习从树莓派开始 树莓派中执行: $> gpio readall 即可得到关于树莓派管脚的各种信息 上面的图可能不是特别清楚, 可 ...
随机推荐
- 【WIP】Objective-C Foundation框架的主要对象
创建: 2018/02/02 完成字符串: 2018/02/05 任务表: TODO 最新内容确认: 字符串,数据类, 数组类 可变与不变的对象 一览 种类 不变类 可变类 数组 NSA ...
- Linux 常用命令十六 文件权限管理
一.ls -l 各段含义 wang@wang:~/workpalce/threading$ ls -l 总用量 drwxrwxr-x wang wang 12月 : a -rw-rw-r-- wang ...
- 动态规划基础复习 By cellur925
结束帝都的qbxt dp图论精讲班后,感觉自己依然很水,接下来的一周,不妨来复习一下讲课内容:) 动态规划是lyd讲的,上次在泉城讲数据结构,然鹅体验较差,这次虽说好了些,但还是比想象中的效果不好(还 ...
- Chtholly Tree (珂朵莉树) ODT
ODT,OldDriverTree,又名ChthollyTree" role="presentation" style="position: relative; ...
- "HIBERNATE_SEQUENCE" does not exist问题处理
JavaWeb应用在MySQL环境下可以正常运行,数据迁移至Oracle或者人大金仓后应用运行爆出如下错误: 严重: Servlet.service() for servlet [JeeCmsAdmi ...
- Jmeter+Jenkins+Ant自动化集成环境搭建
搭建环境: JDK:jdk1.8.0_92 Ant:apache-ant-1.9.7 Jmeter: apache-jmeter-3.0 Jenkins:jenkins-2.19.3 具体环境配置 1 ...
- RabbitMQ四:生产者--队列--消费者
AMQP协议的梳理和名词解析 建议先把上篇AMQP协议先看一遍,理解一下,由于用XMind绘图,电脑屏幕比较小,不能截取全部,如果想要全图和源代码,请下面留言....... 可以点击图片,打开到新的 ...
- C# Equals的重写
using System; using System.Collections.Generic; using System.Text; namespace Equal { using Syste ...
- 搜索可用docker镜像
简介:这一步的目标是学会使用docker search命令来检索可用镜像. 搜索可用的docker镜像 目标: 提示: 正确的命令: 搜索可用的docker镜像 使用docker最简单的方式莫过于从现 ...
- testlink 从1.8.5 升级到 1.9.8
step1:备份原 1.8.5 的数据库. step2:分别下载 1.9.0 / 1.9.3 / 1.9.8 的安装包. step3:分别解压 1.9.0 / 1.9.3 / 1.9.8 成3 ...