历史上的今天

今天是:2024年10月19日(星期六)

正在发生

2019年10月19日 | 基于ARM平台的钢琴游戏 08实现音乐钢琴效果

发布者:数字舞者 来源: 51hei关键字:ARM平台  钢琴游戏  音乐钢琴效果 手机看文章 扫描二维码
随时随地手机看文章

//////////////////////////////////////////////////////////////////

//

//  Copyright(C), 2013-2016, GEC Tech. Co., Ltd.

//

//  File name: GPLE/bmp.c

//

//  Author: Vincent Lin (林世霖)  微信公众号:秘籍酷

//

//  Date: 2016-11

//  

//  Description: 处理BMP格式图像数据

//

//  GitHub: github.com/vincent040   Bug Report: 2437231462@qq.com

//

//////////////////////////////////////////////////////////////////


#include

#include "bmp.h"

#include "ts.h"


char * load_bmp(const char *bmpfile, struct image_info *minfo)

{

        int fd = open(bmpfile, O_RDONLY);

        if(fd == -1)

        {

                fprintf(stderr, "opening "%s" failed: %sn",

                                        bmpfile, strerror(errno));

                exit(0);

        }


        // 获得文件大小,并分配内存

        struct stat fileinfo;

        fstat(fd, &fileinfo);


        int   rgb_size = fileinfo.st_size;

        char *rgb_buf  = calloc(1, rgb_size);


        // 读取BMP内容到内存中

        struct bitmap_header header;

        struct bitmap_info info;

        struct rgb_quad quad;

        read(fd, &header, sizeof(header));

        read(fd, &info, sizeof(info));

        if(info.compression != 0)

        {

                read(fd, &quad, sizeof(quad));

                fprintf(stderr, "read quad! n");

        }

        read(fd, rgb_buf, rgb_size);


        minfo->width = info.width;

        minfo->height= info.height;

        minfo->pixel_size = info.bit_count/8;


        #ifdef DEBUG

        printf("width: %dn", minfo->width);

        printf("height: %dn", minfo->height);

        printf("pixel_size: %dn", minfo->pixel_size);

        #endif


        close(fd);

        return rgb_buf;

}


void bmp2lcd(char *bmpfile, char *FB,

                         struct fb_var_screeninfo *vinfo,

                         int xoffset, int yoffset)

{

        xoffset = xoffset>(65*12+10) ? (65*10+10) : xoffset;


        struct image_info *minfo = calloc(1, sizeof(struct image_info));

        char *rgb_buf = load_bmp(bmpfile, minfo);

        char *tmp = rgb_buf;


        // 从最后一行开始显示BMP图像

        int pad = ((4-( minfo->width * minfo->pixel_size ) % 4)) % 4; // 0-3

        rgb_buf += (minfo->width * minfo->pixel_size + pad) * (minfo->height-1);        


        FB += (yoffset * vinfo->xres + xoffset) * 4;

        int lcd_w = vinfo->xres - xoffset;

        int lcd_h = vinfo->yres - yoffset;


        int x, y;

        for(x=0; xheight; x++)

        {

                for(y=0; ywidth; y++)

                {

                        unsigned long lcd_offset = (vinfo->xres*x + y) * 4;

                        rgb_buf += minfo->pixel_size;


                        memcpy(FB + lcd_offset + vinfo->red.offset/8,   rgb_buf + 2, 1);

                        memcpy(FB + lcd_offset + vinfo->green.offset/8, rgb_buf + 1, 1);

                        memcpy(FB + lcd_offset + vinfo->blue.offset/8,  rgb_buf + 0, 1);

                }


                rgb_buf += pad;

                rgb_buf -= (minfo->width * minfo->pixel_size + pad) * 2;

        }


        free(tmp);

}


关键字:ARM平台  钢琴游戏  音乐钢琴效果 引用地址:基于ARM平台的钢琴游戏 08实现音乐钢琴效果

上一篇:嵌入式开发板QtE必备知识-qt4文件的移植和修改
下一篇:S3C2440定时器汇编程序

推荐阅读

10月18日,2018瓷博会将在景德镇国际会展中心举行。经过14年的磨练,瓷博会已经在国内外形成了广泛的知名度和影响力。据统计,今年瓷博会国内参展的规模企业达到468家;境外参展企业有21家。作为本次展会最大的亮点,景德镇市政府首次与国内领先的移动互联网企业猎豹移动合作,引入机器人为大会提供讲解服务,这在全国乃至世界范围内陶瓷专业展会服务中尚...
ARM指令:什么是adr adrl ldr mov?ADR是一条小范围的地址读取伪指令,它将基于PC的相对偏移的地址值读到目标寄存器中。格式:ADR register,exper。编译源程序时,汇编器首先计算当前PC值(当前指令位置)到exper的距离,然后用一条ADD或者SUB指令替换这条伪指令, 例如:ADD register,PC,#offset_to_exper。 注意,标号exper与指...
1 引言随着汽车等各种车辆交通工具的普及,车辆导航设备的需求也变得日益旺盛。作为车载设备。不仅要有可靠的性能,而且需要具有便携、低功耗和低价格等特点。而采用基于ARM微处理器的嵌入式系统与GPS模块相配合的GPS导航终端机的设计方案,可以很好的满足这一系统需求。为此,本文介绍了一种利用ARM9开发板和GPS模块实现GPS导航功能的终端机的软硬件结构...
10月18日,威世集团(Vishay Intertechnology)宣布推出业界首款高压芯片分压器。该分压器采用棱纹模制封装,带有兼容的表面贴装引线。该Vishay Techno CDMM旨在减少组件数量并提高汽车和工业设备中的TC(温度系数)追踪性能和比率稳定性,在4527封装中可实现最大工作电压1500 V。(图片来源:威世)最新的芯片分压器由集成在一个模制封装中的两个电阻...

史海拾趣

问答坊 | AI 解惑

微波及毫米波技术在网络通信中的应用研究。

    对于日益发达的网络通信,如何寻找一条经济有效的物理传输线路无疑是颇具吸引和挑战的课题。目前,有显著宽带优势的光纤通信系统已被基本采纳,且在低误码大业务量高速传输中有绝对的优势。然而,随着通信事业的进一步发展,无 ...…

查看全部问答∨

怎么获得这个论坛的鸟币啊??

怎么获得这个论坛的鸟币啊??…

查看全部问答∨

山寨电子企业面临生死抉择 缺乏技术无新品支撑

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 机遇与挑战: 山寨产品缺乏技术无新品支撑山寨手机利润急剧下滑电子书难成新支柱 市场数据: 山寨平板电脑制造成本800元左右   “现在山寨产品真的不好做,手机利润非常低,电子书出货量 ...…

查看全部问答∨

请教使用ChipScope时出现的问题

Successfully read project E:\\project\\a.cdccopy E:\\project\\a.ngc => E:\\project\\_ngo\\a_cs_signalbrowser.ngo<ERROR> ReadAsXdm Failed for E:\\project\\_ngo\\a_cs_signalbrowser.ngo<ERROR> XDMDesign::getBlockForPath() - ...…

查看全部问答∨

utu2440上的彩色液晶YC 35B的驱动程序谁搞过吗?

我显示图片时,最下面几行出现错位,不知道什么原因…

查看全部问答∨

寻找开发过Tek示波器控制软件的高人!在VC++.2008怎么用第三方SDK?

我现在要用VC++.2008写一个tek 2024b的示波器远程控制软件,想用的是TekVISA接口,但没有软件开发经验。应该从什么地方入手?欢迎任何帮助,万分谢谢!…

查看全部问答∨

flash擦除不了请看是什么问题

今天新做了个板 用jtag下载到擦flash时候过不去了 重新编了以后加入调试语句发现擦了flash的block 0后去判断status寄存器 得到的值是0x00a800a8 好象说供电不足 但是拿万用表量了一下Vpen得到3.3v 不懂是什么问题了,而且flash的id读到也对…

查看全部问答∨

NDIS6.0的filter怎么丢包?

微软例子里的 VOID FilterSendNetBufferLists(         IN  NDIS_HANDLE        FilterModuleContext,         IN  PNET_BUFF ...…

查看全部问答∨

关于linux自定制,请教-:新手上路

新手中的新手!望大家慷慨相助或是提供帮助信息、教程之类的:) 想要自定制一个剪裁过的linux系统,现在手里有一套Dell Optilex745 n 系列电脑赠送的red hat 安装盘,请问是否能够靠它剪裁出自己希望的小规模系统。 目标硬件平台为PC104,CPU: ...…

查看全部问答∨

单片机和嵌入式

我是从软件转到嵌入式的,最近在学习S3C2440(ARM9T),想自己写一个类似Uboot的程序,于是开始看芯片技术文档。发现看不懂,阅读uboot的原代码,那些芯片的配置也已经让我焦头烂额了,现在是举步维艰。还请高人给指条路。先谢过了。…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved