找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2481|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

一個(gè)經(jīng)過優(yōu)化的超高刷新率的ssd1306 OLED I2C單片機(jī)代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
一個(gè)經(jīng)過優(yōu)化的超高刷新率的ssd1306 OLED I2C代碼
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. //                @布丁橘長
  2. //                高度優(yōu)化OLED圖片刷新率,
  3. //
  4. //                提供:        低刷新率         圖片顯示函數(shù):OLED_DrawBMP()
  5. //                                        中刷新率                圖片顯示函數(shù):OLED_DrawBMP_Fast()
  6. //                                        高刷新率                圖片顯示函數(shù):OLED_DrawBMP_Faster()
  7. //                                        圖片左右循環(huán)移動函數(shù):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庫函數(shù)

  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();                                                                                //按鍵掃描函數(shù)聲明

  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;                                                        //圖片坐標(biāo),圖片移動坐標(biāo)
  28. uchar upflag,downflag;                                                //跳躍狀態(tài)標(biāo)志,上升狀態(tài),下落狀態(tài)                                                                        

  29. void main(void)
  30. {
  31.         uint i;
  32.         bx = 0;                                                                                                        //小恐龍初始坐標(biāo):第0列,第4頁
  33.         by = 4;
  34.         upflag = downflag = 0;                                        //初始化跳躍標(biāo)志
  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);                                                                //云圖片循環(huán)左移
  43.                 BMPmove(90,4,106,8,BMP3,LEFT,0);                                                        //仙人掌圖片循環(huán)左移
  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組合成踏步效果,稍作延時(shí)
  51.                 OLED_DrawBMP_Faster(bx,by,bx+32,by+4,BMP1);                                        //繪制小恐龍2
  52.         //        delay_ms(10);                                                                                                                                        //小恐龍圖1和圖2組合成踏步效果,稍作延時(shí)
  53.                 if(upflag == 0 && downflag == 0) keyscan();                //小恐龍?jiān)诘厣喜艗呙璋存I,跳躍狀態(tài)按鍵失效
  54.                 if(upflag == 1)                                                                                                                                //跳躍狀態(tài)-上升時(shí)
  55.                 {
  56.                         if(by == 0)                                                                                                                                        //到最高處
  57.                         {
  58.                                 upflag = 0;
  59.                                 downflag = 1;                                                                                                                        //清空上升標(biāo)志,下落標(biāo)志置1
  60.                         }
  61.                         if(by >=1)                                                                                                                                        //行坐標(biāo)大于等于1頁時(shí),才執(zhí)行減減操作
  62.                         {
  63.                                 OLED_DrawBMP_Faster(bx,by+3,bx+32,by+4,BMPclr);        //消除腳下殘影
  64.                                 by--;                                                                                                                                                        //往上移動一頁
  65.                         }
  66.                 }
  67.                 if(downflag == 1)                                                                                                                        //下落狀態(tài)
  68.                 {
  69.                         if(by == 4)                                                                                                                                        //到最低處
  70.                         {
  71.                                 downflag = 0;                                                                                                                        //清空下落標(biāo)志
  72.                         }
  73.                         if(by <= 3)                                                                                                                                        //行坐標(biāo)小于3頁時(shí),才執(zhí)行加加操作
  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;                                                                                                                                        //跳躍標(biāo)識置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范圍內(nèi)
  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范圍內(nèi)
  110.                 }
  111.                
  112.         }
  113. }
復(fù)制代碼

Keil代碼與Proteus仿真下載:
OLED_圖片高刷新率(51+STC32).7z (964.81 KB, 下載次數(shù): 51)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表