本帖最后由 奔跑小蜗牛 于 2016-9-5 20:16 编辑
****************************************************************************************************************************************** ------------------------转载请注明出处 ICKEY-------------------------- ****************************************************************************************************************************************** 【Banana Pi M2+试用】--06.双OLED显示bad apple动画
OLED的驱动还是使用wiringpi里面的spi接口驱动,程序也偷懒下,里面有现成的demo, 在m2p_test文件夹下的52pi.c,可以看下里面的源码,只能驱动SSD1306控制器的OLED, 顺便说一下,市面上0.96寸OLED主流控制器是SSD1306,少部分是SH1106,初始化代码 部分有略微不同,支持spi驱动和iic驱动。M2+这里使用的是spi驱动,基本流程就是SSD1306 控制器初始化,apple.dat动画字库一帧帧的搬运到buff中,采用OLED RAM填充的方式刷屏, buff大小计算方法是一个字节对应8个点,那么128x64/8=1024字节 buff - #include <wiringPi.h>
- #include <wiringPiSPI.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdint.h>
- #include <string.h>
- #include <time.h>
-
- unsigned char initcode[] = {
- 0xAE, 0xA8, 0x3F, 0xD3, 0x00, 0x40, 0xA1, 0xC8,
- 0xA6, 0xD5, 0x80, 0xDA, 0x12, 0x81, 0x00, 0xB0,
- 0xA4, 0xDB, 0x40, 0x20, 0x00, 0x00, 0x10, 0x8D,
- 0x14, 0x2E, 0xA6, 0xAF
- };
-
- unsigned char poscode[] = {
- 0x20, 0x00, 0xB0, 0x00, 0x10
- };
-
- #define BUFFER_SIZE 1024
- unsigned char buffer[BUFFER_SIZE];
- void oled_begin();
- void oled_test();
-
- int main(void)
- {
- time_t now;
- struct tm *timenow;
- int i;
- //setup gpio pin to spi function
- wiringPiSetup();
- for(i = 10; i < 15; i++)
- {
- if(i == 11)
- continue;
-
- pinMode(i, SPI_PIN);
- }
-
- oled_begin();
-
- time(&now);
- timenow = localtime(&now);
- printf("Start time is %s/n",asctime(timenow));
-
- oled_test();
-
- time(&now);
- timenow = localtime(&now);
- printf("End time is %s/n",asctime(timenow));
-
- return 0;
- }
-
- void oled_begin()
- {
- pinMode (5, OUTPUT) ;
- pinMode (6, OUTPUT) ;
- wiringPiSPISetup(0, 32*1000*1000);
- digitalWrite(6, LOW) ;
- delay(50);
- digitalWrite(6, HIGH) ;
- digitalWrite(5, LOW);
- wiringPiSPIDataRW(0, initcode, 28);
- }
-
- void oled_test()
- {
- int r;
- FILE *fphzk;
- digitalWrite(5, LOW);
- wiringPiSPIDataRW(0, poscode, 5);
- fphzk=fopen("apple.dat","rb");
- r=fread(buffer,1,BUFFER_SIZE,fphzk);
- while(r>0)
- {
- digitalWrite(5, HIGH);
- wiringPiSPIDataRW(0, buffer, 1024);
- r=fread(buffer,1,BUFFER_SIZE,fphzk);
- delay(66);
- }
- fclose(fphzk);
- }
复制代码
我手头有两个尺寸的oled屏,大的是0.96寸12864,小的是0.91寸12832,控制器同为SSD1306,使用SPI接口,没有回读数据,突发奇想直接把俩屏并在一块驱动显示。
屏引脚依次是:GND----VCC----SCL----SDA----RST----D/C 跟M2+板连接:GND----3.3V--PIN23--PIN19--PIN22--PIN18
由于使用的是12864的初始化代码,所以12832的0.91寸屏是在去掉1/2行数的基础上显示,仍然是全屏显示,但是有种压扁的感觉
下面附个视频: http://v.youku.com/v_show/id_XMTcxNDE3MDQ2NA==.html
|