一個經過優化的超高刷新率的ssd1306 OLED I2C代碼
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- // @布丁橘長
- // 高度優化OLED圖片刷新率,
- //
- // 提供: 低刷新率 圖片顯示函數:OLED_DrawBMP()
- // 中刷新率 圖片顯示函數:OLED_DrawBMP_Fast()
- // 高刷新率 圖片顯示函數:OLED_DrawBMP_Faster()
- // 圖片左右循環移動函數:BMPmove()
- // 0.96 OLED顯示Chrome小恐龍游戲動畫,小恐龍移動、跳躍效果
- // STC89C52RC/STC12C5A60S2/ST15F2K60S2均適用,11.0592MHz,OLED屏為I2C接口
- // OLED_SCL=P2^0; OLED_SDA=P2^1;
- #include <reg51.h>
- #include <oled.h> //OLED庫函數
- #define uchar unsigned char //用uchar 表示 unsigned char類型
- #define uint unsigned int //用uint 表示 unsigned int類型
- sbit LEFTkey = P3^5; //按鍵左
- sbit UPkey = P3^7; //按鍵右
- sbit RIGHTkey = P3^6; //按鍵上
- sbit DOWNkey = P3^4; //按鍵下
- void keyscan(); //按鍵掃描函數聲明
- extern uchar code BMPclr[]; //圖片外部變量聲明:空圖片
- extern uchar code BMP0[]; //圖片外部變量聲明:小恐龍1
- extern uchar code BMP1[]; //圖片外部變量聲明:小恐龍2
- extern uchar code BMP2[]; //圖片外部變量聲明:云
- extern uchar code BMP3[]; //圖片外部變量聲明:仙人掌
- extern unsigned char code F6x8[][6];
- extern unsigned char code F8X16[];
- uchar bx,by; //圖片坐標,圖片移動坐標
- uchar upflag,downflag; //跳躍狀態標志,上升狀態,下落狀態
- void main(void)
- {
- uint i;
- bx = 0; //小恐龍初始坐標:第0列,第4頁
- by = 4;
- upflag = downflag = 0; //初始化跳躍標志
- OLED_Init(); //初始化OLED
- OLED_Clear(); //清一次屏
- while(1)
- {
- i++;
- if(i>9999) i = 0;
- OLED_ShowNum(66,3,i,4,8);
- BMPmove(20,0,52,2,BMP2,LEFT,0); //云圖片循環左移
- BMPmove(90,4,106,8,BMP3,LEFT,0); //仙人掌圖片循環左移
- OLED_ShowCHinese(0,2,0);
- OLED_ShowCHinese(16,2,1);
- OLED_ShowCHinese(32,2,2);
- OLED_ShowCHinese(48,2,3);
- OLED_ShowString(100,0,"000",16);
- OLED_DrawBMP_Faster(bx,by,bx+32,by+4,BMP0); //繪制小恐龍1
- // delay_ms(10); //小恐龍圖1和圖2組合成踏步效果,稍作延時
- OLED_DrawBMP_Faster(bx,by,bx+32,by+4,BMP1); //繪制小恐龍2
- // delay_ms(10); //小恐龍圖1和圖2組合成踏步效果,稍作延時
- if(upflag == 0 && downflag == 0) keyscan(); //小恐龍在地上才掃描按鍵,跳躍狀態按鍵失效
- if(upflag == 1) //跳躍狀態-上升時
- {
- if(by == 0) //到最高處
- {
- upflag = 0;
- downflag = 1; //清空上升標志,下落標志置1
- }
- if(by >=1) //行坐標大于等于1頁時,才執行減減操作
- {
- OLED_DrawBMP_Faster(bx,by+3,bx+32,by+4,BMPclr); //消除腳下殘影
- by--; //往上移動一頁
- }
- }
- if(downflag == 1) //下落狀態
- {
- if(by == 4) //到最低處
- {
- downflag = 0; //清空下落標志
- }
- if(by <= 3) //行坐標小于3頁時,才執行加加操作
- {
- OLED_DrawBMP_Faster(bx,by,bx+32,by+1,BMPclr); //消除頭頂殘影
- by++; //下移一頁
- }
- }
-
- }
- }
- void keyscan() //按鍵掃描
- {
- if(UPkey == 0) //上
- {
- // delay_ms(10); //去抖
- if(UPkey == 0)
- {
- upflag = 1; //跳躍標識置1
- }
- }
- if(LEFTkey == 0) //左
- {
- // delay_ms(10);
- if(LEFTkey == 0)
- {
- OLED_DrawBMP_Faster(bx+32-8,by,bx+32,by+8,BMPclr); //消除右邊殘影
- if(bx <= 0) bx = 128; //控制在128范圍內
- bx -=8; //一次左移8列像素
- }
- }
- if(RIGHTkey == 0) //右
- {
- // delay_ms(10);
- if(RIGHTkey == 0)
- {
- OLED_DrawBMP_Faster(bx,by,bx+8,by+8,BMPclr); //消除左邊殘影
- bx +=8; //一次右移8列像素
- if(bx >= 128) bx = 0; //控制住128范圍內
- }
-
- }
- }
復制代碼
Keil代碼與Proteus仿真下載:
OLED_圖片高刷新率(51+STC32).7z
(964.81 KB, 下載次數: 51)
2023-5-1 03:02 上傳
點擊文件名下載附件
OLED優化超高刷新率
|