找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机OLED汉字图片左右循环移动 程序无法实现效果

[复制链接]
跳转到指定楼层
楼主
仿真及完整代码


#include <reg51.h>                                                                //51通用头文件        
#include <oled.h>                                                                        //OLED库函数

#define uchar unsigned char                                //用uchar 表示 unsigned char类型
#define uint unsigned int                                        //用uint 表示 unsigned int类型
//#define UP 0
//#define DOWN 1
#define LEFT 2
#define RIGHT 3

extern uchar code BMPclr[];                                //图片清屏用
extern uchar code BMP0[];                                        //oledfont.h中,图片0取模数组,做外部变量声明
extern uchar code BMP1[];                                        //oledfont.h中,图片1取模数组,做外部变量声明(如用到更多图片,均需要声明)

void HZmove(uchar *sz,uint sudu,uchar fx);        //汉字移动函数
//3个形参分别为:汉字数组名,移动速度,移动方向

void BMPmove(uchar BMPx1,uchar BMPy1,uchar BMPx2,uchar BMPy2,uchar *BMPn,uchar BMPfx);//图片移动函数
//6个形参分别为:图片起始列坐标,起始页坐标,结束列坐标,结束页坐标,图片名,移动方向

uchar hzsz[9]={0,0,0,0,0,5,6,7,8};//移动汉字数组,支持1-8个汉字,需要显示移动效果的文字序号,按顺序填入数组,从1开始,hzsz[0]不可用

uchar bx,by,hx,hy;//图片移动坐标,汉字移动坐标变量

void main(void)
{        
        OLED_Init();                                                                                                //初始化OLED  
        OLED_ShowCHinese(hx,0,hzsz[8]);
        while(1);
//        while(1)
//        {        
//                HZmove(hzsz,0,LEFT);                                                        //汉字,移速0(最快),右移               
//                BMPmove(0,2,64,8,BMP0,LEFT);                        //BMP0,初始:0-64列,2-8页,循环左移
//                BMPmove(0,2,64,8,BMP1,LEFT);                        //BMP1,初始:0-64列,2-8页,循环左移  //BMP0和BMP1两图合成为动画效果
//        }
}

void HZmove(uchar *sz,uint sudu,uchar fx)        //汉字移动函数(数组名,移动方向)
{        
        if(fx == RIGHT)                                                                                                        //右移
        {
                if(hx >= 128) hx = 0;                                                                        
                if(hx <= 128)                                                                                                        //128列范围内移动
                {
                        OLED_ShowCHinese(hx,0,sz[8]);                                //按当前坐标更新汉字        
                        OLED_ShowCHinese(hx+16,0,sz[7]);
                        OLED_ShowCHinese(hx+32,0,sz[6]);
                        OLED_ShowCHinese(hx+48,0,sz[5]);                                
                        OLED_ShowCHinese(hx+64,0,sz[4]);
                        OLED_ShowCHinese(hx+80,0,sz[3]);
                        OLED_ShowCHinese(hx+96,0,sz[2]);
                        OLED_ShowCHinese(hx+112,0,sz[1]);        //汉字逆向显示(从右往左显示)
                        delay_ms(sudu*10);                                                                //速度暂时用delay控制
                        hx +=8;                                                                                                                //每次右移8列像素
                }        
        }
        if(fx == LEFT)                                                                                                //左移
        {
                if(hx <= 0) hx = 120;
                if(hx >= 8)                                                                                                        //128列范围移动
                {
                        OLED_ShowCHinese(hx,0,sz[1]);                        //按当前坐标更新汉字
                        OLED_ShowCHinese(hx+16,0,sz[2]);
                        OLED_ShowCHinese(hx+32,0,sz[3]);
                        OLED_ShowCHinese(hx+48,0,sz[4]);                                
                        OLED_ShowCHinese(hx+64,0,sz[5]);
                        OLED_ShowCHinese(hx+80,0,sz[6]);
                        OLED_ShowCHinese(hx+96,0,sz[7]);
                        OLED_ShowCHinese(hx+112,0,sz[8]);        //正向显示汉字(从左往右显示)
                        delay_ms(sudu*10);                                                                //速度暂时用delay控制
                        hx -=8;                                                                                                                //每次左移8列像素
                }
        }
}
void BMPmove(uchar BMPx1,uchar BMPy1,uchar BMPx2,uchar BMPy2,uchar *BMPn,uchar BMPfx)//图片循环移动函数
{
        if(BMPfx == LEFT)                                                                                        //左移
        {
                if(bx <= 0) bx = 128;
                if(bx >= 8)                                                                                                        //128列范围
                {        
                        OLED_DrawBMP(bx+BMPx1,BMPy1,bx+BMPx2,BMPy2,BMPn);                        //按当前坐标更新图形
                        OLED_DrawBMP(bx+BMPx2,BMPy1,bx+BMPx2+8,BMPy2,BMPclr);        //擦除部分图像
                        bx -= 8;
                }
        }
        if(BMPfx == RIGHT)                                                                                //右移
        {
                if(bx >= 128) bx = 0;
                if(bx <= 128)                                                                                                //128列范围
                {
                        OLED_DrawBMP(bx+BMPx1,BMPy1,bx+BMPx2,BMPy2,BMPn);                        //按当前坐标更新图形
                        OLED_DrawBMP(bx+BMPx1,BMPy1,bx+BMPx1+8,BMPy2,BMPclr);        //擦除部分图像
                        bx +=8;
                }
        }        
}

代码有错误 求帮助:
OLED汉字图片左右循环移动.zip (1.93 MB, 下载次数: 6)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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