找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1334|回复: 0
打印 上一主题 下一主题
收起左侧

一个经过优化的超高刷新率的ssd1306 OLED I2C单片机代码

[复制链接]
跳转到指定楼层
楼主
一个经过优化的超高刷新率的ssd1306 OLED I2C代码
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. //                @布丁橘长
  2. //                高度优化OLED图片刷新率,
  3. //
  4. //                提供:        低刷新率         图片显示函数:OLED_DrawBMP()
  5. //                                        中刷新率                图片显示函数:OLED_DrawBMP_Fast()
  6. //                                        高刷新率                图片显示函数:OLED_DrawBMP_Faster()
  7. //                                        图片左右循环移动函数:BMPmove()
  8. //                0.96 OLED显示Chrome小恐龙游戏动画,小恐龙移动、跳跃效果
  9. //                STC89C52RC/STC12C5A60S2/ST15F2K60S2均适用,11.0592MHz,OLED屏为I2C接口
  10. //                OLED_SCL=P2^0;        OLED_SDA=P2^1;               

  11. #include <reg51.h>
  12. #include <oled.h>                                                                        //OLED库函数

  13. #define uchar unsigned char                                //用uchar 表示 unsigned char类型
  14. #define uint unsigned int                                        //用uint 表示 unsigned int类型

  15. sbit LEFTkey = P3^5;                                                        //按键左
  16. sbit UPkey = P3^7;                                                                //按键右
  17. sbit RIGHTkey = P3^6;                                                        //按键上
  18. sbit DOWNkey = P3^4;                                                        //按键下

  19. void keyscan();                                                                                //按键扫描函数声明

  20. extern uchar code BMPclr[];                                //图片外部变量声明:空图片
  21. extern uchar code BMP0[];                                        //图片外部变量声明:小恐龙1
  22. extern uchar code BMP1[];                                        //图片外部变量声明:小恐龙2                                
  23. extern uchar code BMP2[];                                        //图片外部变量声明:云        
  24. extern uchar code BMP3[];                                        //图片外部变量声明:仙人掌
  25. extern unsigned char code F6x8[][6];
  26. extern unsigned char code F8X16[];
  27. uchar bx,by;                                                        //图片坐标,图片移动坐标
  28. uchar upflag,downflag;                                                //跳跃状态标志,上升状态,下落状态                                                                        

  29. void main(void)
  30. {
  31.         uint i;
  32.         bx = 0;                                                                                                        //小恐龙初始坐标:第0列,第4页
  33.         by = 4;
  34.         upflag = downflag = 0;                                        //初始化跳跃标志
  35.         OLED_Init();                                                                                //初始化OLED  
  36.         OLED_Clear();                                                                                //清一次屏
  37.         while(1)
  38.         {        
  39.                 i++;
  40.                 if(i>9999) i = 0;
  41.                 OLED_ShowNum(66,3,i,4,8);
  42.                 BMPmove(20,0,52,2,BMP2,LEFT,0);                                                                //云图片循环左移
  43.                 BMPmove(90,4,106,8,BMP3,LEFT,0);                                                        //仙人掌图片循环左移
  44.                 OLED_ShowCHinese(0,2,0);        
  45.                 OLED_ShowCHinese(16,2,1);        
  46.                 OLED_ShowCHinese(32,2,2);        
  47.                 OLED_ShowCHinese(48,2,3);
  48.                 OLED_ShowString(100,0,"000",16);               
  49.                 OLED_DrawBMP_Faster(bx,by,bx+32,by+4,BMP0);                                        //绘制小恐龙1        
  50.         //        delay_ms(10);                                                                                                                                        //小恐龙图1和图2组合成踏步效果,稍作延时
  51.                 OLED_DrawBMP_Faster(bx,by,bx+32,by+4,BMP1);                                        //绘制小恐龙2
  52.         //        delay_ms(10);                                                                                                                                        //小恐龙图1和图2组合成踏步效果,稍作延时
  53.                 if(upflag == 0 && downflag == 0) keyscan();                //小恐龙在地上才扫描按键,跳跃状态按键失效
  54.                 if(upflag == 1)                                                                                                                                //跳跃状态-上升时
  55.                 {
  56.                         if(by == 0)                                                                                                                                        //到最高处
  57.                         {
  58.                                 upflag = 0;
  59.                                 downflag = 1;                                                                                                                        //清空上升标志,下落标志置1
  60.                         }
  61.                         if(by >=1)                                                                                                                                        //行坐标大于等于1页时,才执行减减操作
  62.                         {
  63.                                 OLED_DrawBMP_Faster(bx,by+3,bx+32,by+4,BMPclr);        //消除脚下残影
  64.                                 by--;                                                                                                                                                        //往上移动一页
  65.                         }
  66.                 }
  67.                 if(downflag == 1)                                                                                                                        //下落状态
  68.                 {
  69.                         if(by == 4)                                                                                                                                        //到最低处
  70.                         {
  71.                                 downflag = 0;                                                                                                                        //清空下落标志
  72.                         }
  73.                         if(by <= 3)                                                                                                                                        //行坐标小于3页时,才执行加加操作
  74.                         {
  75.                                 OLED_DrawBMP_Faster(bx,by,bx+32,by+1,BMPclr);                //消除头顶残影
  76.                                 by++;                                                                                                                                                        //下移一页
  77.                         }
  78.                 }
  79.                
  80.         }
  81. }
  82. void keyscan()                                                                                                                                                //按键扫描
  83. {
  84.         if(UPkey == 0)                                                                                                                                        //上
  85.         {
  86.         //        delay_ms(10);                                                                                                                                        //去抖
  87.                 if(UPkey == 0)
  88.                 {
  89.                         upflag = 1;                                                                                                                                        //跳跃标识置1
  90.                 }
  91.         }
  92.         if(LEFTkey == 0)                                                                                                                                //左
  93.         {
  94.         //        delay_ms(10);
  95.                 if(LEFTkey == 0)
  96.                 {
  97.                         OLED_DrawBMP_Faster(bx+32-8,by,bx+32,by+8,BMPclr);        //消除右边残影
  98.                         if(bx <= 0) bx = 128;                                                                                                //控制在128范围内
  99.                         bx -=8;                                                                                                                                                        //一次左移8列像素
  100.                 }
  101.         }
  102.         if(RIGHTkey == 0)                                                                                                                                //右
  103.         {
  104.         //        delay_ms(10);
  105.                 if(RIGHTkey == 0)
  106.                 {
  107.                         OLED_DrawBMP_Faster(bx,by,bx+8,by+8,BMPclr);                                //消除左边残影
  108.                         bx +=8;                                                                                                                                                        //一次右移8列像素
  109.                         if(bx >= 128) bx = 0;                                                                                                //控制住128范围内
  110.                 }
  111.                
  112.         }
  113. }
复制代码

Keil代码与Proteus仿真下载:
OLED_图片高刷新率(51+STC32).7z (964.81 KB, 下载次数: 41)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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