设为首页 收藏本站 切换到窄版
查看: 3313|回复: 0

【Banana Pi M2+试用】-06.双OLED显示bad apple动画

[复制链接] qrcode

28

主题

35

帖子

102

积分

注册会员

Rank: 2

积分
102
发表于 2016-9-5 07:53 PM | 显示全部楼层 |阅读模式
本帖最后由 奔跑小蜗牛 于 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
  1. #include <wiringPi.h>  
  2. #include <wiringPiSPI.h>  
  3. #include <stdio.h>   
  4. #include <stdlib.h>   
  5. #include <stdint.h>  
  6. #include <string.h>  
  7. #include <time.h>  
  8.   
  9. unsigned char initcode[] = {  
  10.     0xAE, 0xA8, 0x3F, 0xD3, 0x00, 0x40, 0xA1, 0xC8,  
  11.     0xA6, 0xD5, 0x80, 0xDA, 0x12, 0x81, 0x00, 0xB0,  
  12.     0xA4, 0xDB, 0x40, 0x20, 0x00, 0x00, 0x10, 0x8D,  
  13.     0x14, 0x2E, 0xA6, 0xAF   
  14. };  
  15.   
  16. unsigned char poscode[] = {  
  17.     0x20, 0x00, 0xB0, 0x00, 0x10  
  18. };  
  19.   
  20. #define BUFFER_SIZE 1024  
  21. unsigned char buffer[BUFFER_SIZE];  

  22. void oled_begin();  
  23. void oled_test();  
  24.   
  25. int main(void)  
  26. {  
  27.     time_t now;  
  28.     struct tm *timenow;
  29.         int i;

  30.     //setup gpio pin to spi function
  31.     wiringPiSetup();
  32.     for(i = 10; i < 15; i++)
  33.     {
  34.             if(i == 11)
  35.                 continue;
  36.                
  37.         pinMode(i, SPI_PIN);
  38.     }
  39.                
  40.     oled_begin();  
  41.   
  42.     time(&now);     
  43.     timenow = localtime(&now);      
  44.     printf("Start time is %s/n",asctime(timenow));   
  45.   
  46.     oled_test();  
  47.   
  48.     time(&now);     
  49.     timenow = localtime(&now);      
  50.     printf("End time is %s/n",asctime(timenow));   
  51.   
  52.     return 0;  
  53. }  
  54.   
  55. void oled_begin()  
  56. {         
  57.     pinMode (5, OUTPUT) ;  
  58.     pinMode (6, OUTPUT) ;  
  59.     wiringPiSPISetup(0, 32*1000*1000);  
  60.     digitalWrite(6,  LOW) ;  
  61.     delay(50);  
  62.     digitalWrite(6,  HIGH) ;  
  63.     digitalWrite(5, LOW);  
  64.     wiringPiSPIDataRW(0, initcode, 28);  
  65. }  
  66.   
  67. void oled_test()  
  68. {
  69.         int r;
  70.         FILE *fphzk;
  71.         digitalWrite(5, LOW);
  72.         wiringPiSPIDataRW(0, poscode, 5);
  73.         fphzk=fopen("apple.dat","rb");
  74.         r=fread(buffer,1,BUFFER_SIZE,fphzk);
  75.         while(r>0)
  76.         {
  77.                 digitalWrite(5, HIGH);
  78.                 wiringPiSPIDataRW(0, buffer, 1024);
  79.                 r=fread(buffer,1,BUFFER_SIZE,fphzk);
  80.                 delay(66);
  81.         }
  82.         fclose(fphzk);
  83. }
复制代码

我手头有两个尺寸的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




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表