找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机oled高刷新率代码

[复制链接]
跳转到指定楼层
楼主
ID:1038352 发表于 2022-7-25 13:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//                @布丁橘长  20220720
//                高度优化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 <oled.h>                                                                        //OLED库函数

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

sbit LEFTkey = P2^7;                                                        //按键左
sbit UPkey = P2^6;                                                                //按键右
sbit RIGHTkey = P2^5;                                                        //按键上
sbit DOWNkey = P2^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范围内
                }
               
        }
}

OLED_高刷新率.zip

57.35 KB, 下载次数: 26, 下载积分: 黑币 -5

oled小恐龙

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

使用道具 举报

沙发
ID:829010 发表于 2022-7-25 17:09 | 只看该作者
没有头文件吧
回复

使用道具 举报

板凳
ID:64089 发表于 2022-7-27 17:41 | 只看该作者
实测没有问题,不过有个问题就是用STC8H3K64S2的P55,P54做OLED驱动时,即使设置了推挽模式也没有显示,敢问是什么问题,有没有遇到过,谢谢
回复

使用道具 举报

地板
ID:64089 发表于 2022-7-27 19:43 | 只看该作者
已解决,谢谢!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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