/********************************************************
*
* 北京四维卓信电子有限公司
* http://www.openadsp.com
*
* 【OpenADSP开源社区】
* http://www.openadsp.com/bbs/
*
********************************************************/
#include <cdefBF533.h>
#include <stdio.h>
#include "ff.h"
extern unsigned char DisplayBuffer[272][1440] ;
extern unsigned char DisplayBuffer_565[272][960] ;
extern unsigned char TempBuffer_img[272][960] ;
extern unsigned char Inputdata[];
unsigned short ptx[9];
unsigned short pty[9];
unsigned short pax[3];
unsigned short pay[3];
extern unsigned char audio_1[59904];
extern unsigned char audio_15[73728];
extern unsigned char audio_2[64512];
extern unsigned char audio_25[69120];
extern unsigned char audio_3[82944];
extern unsigned char audio_4[82944];
extern unsigned char audio_45[78336];
extern unsigned char audio_5[92160];
extern unsigned char audio_55[87552];
extern unsigned char audio_6[82944];
extern unsigned char audio_65[87552];
extern unsigned char audio_7[69120];
extern unsigned char audio_8[87552];
int sportdam_flag = 1;
void main(void)
{
int i;
unsigned int tem_x = 0,tem_y=0;
signed short dlXDiff0,dlXDiff1,dlXDiff2;
signed short dlYDiff0,dlYDiff1,dlYDiff2;
WORD len;
FIL fp;
FRESULT retval = 0;
Set_PLL(16,4);
Init_EBIU();
Init_SDRAM();
LCD_Enable();
IIC_Enable();
init_aic23b();
LCDBK_Disable();
SD_Enable();
f_mountdrv();
retval = f_open(&fp, "/organ/1.snd", FA_OPEN_ALWAYS | FA_READ);
if (retval != 0){
printf("can't open:%s","/1.txt");
exit(-1);
}
f_read(&fp, audio_1, 59904, &len);
f_close(&fp);
f_open(&fp, "/organ/15.snd", FA_OPEN_ALWAYS | FA_READ);
f_read(&fp, audio_15, 73728, &len);
f_close(&fp);
f_open(&fp, "/organ/2.snd", FA_OPEN_ALWAYS | FA_READ);
f_read(&fp, audio_2, 64512, &len);
f_close(&fp);
f_open(&fp, "/organ/25.snd", FA_OPEN_ALWAYS | FA_READ);
f_read(&fp, audio_25, 69120, &len);
f_close(&fp);
f_open(&fp, "/organ/3.snd", FA_OPEN_ALWAYS | FA_READ);
f_read(&fp, audio_3, 82944, &len);
f_close(&fp);
f_open(&fp, "/organ/4.snd", FA_OPEN_ALWAYS | FA_READ);
f_read(&fp, audio_4, 82944, &len);
f_close(&fp);
f_open(&fp, "/organ/45.snd", FA_OPEN_ALWAYS | FA_READ);
f_read(&fp, audio_45, 78336, &len);
f_close(&fp);
f_open(&fp, "/organ/5.snd", FA_OPEN_ALWAYS | FA_READ);
f_read(&fp, audio_5, 92160, &len);
f_close(&fp);
f_open(&fp, "/organ/55.snd", FA_OPEN_ALWAYS | FA_READ);
f_read(&fp, audio_55, 87552, &len);
f_close(&fp);
f_open(&fp, "/organ/6.snd", FA_OPEN_ALWAYS | FA_READ);
f_read(&fp, audio_6, 82944, &len);
f_close(&fp);
f_open(&fp, "/organ/65.snd", FA_OPEN_ALWAYS | FA_READ);
f_read(&fp, audio_65, 87552, &len);
f_close(&fp);
f_open(&fp, "/organ/7.snd", FA_OPEN_ALWAYS | FA_READ);
f_read(&fp, audio_7, 69120, &len);
f_close(&fp);
f_open(&fp, "/organ/8.snd", FA_OPEN_ALWAYS | FA_READ);
f_read(&fp, audio_8, 87552, &len);
f_close(&fp);
Touch_Enable();
SPIinit();
InitDMA();
InitPPI();
InitTimer();
PPI_TMR_DMA_Enable();
LCDBK_Enable();
Init_Timers0(1999);//1~1999 控制背光亮度
Enable_Timers0();
Init_Interrupts();
Init_Sport0_TX();
Init_DMA2_Sport0_TX();
memcpy(DisplayBuffer_565,TempBuffer_img,261120);
while(1)
{
for(i=0;i<9;i++)
{
ptx[i] = read_x();
pty[i] = read_y();
}
pax[0]=(ptx[0]+ptx[1]+ptx[2])/3;
pax[1]=(ptx[3]+ptx[4]+ptx[5])/3;
pax[2]=(ptx[6]+ptx[7]+ptx[8])/3;
dlXDiff0 = pax[ 0 ] - pax[ 1 ];
dlXDiff1 = pax[ 1 ] - pax[ 2 ];
dlXDiff2 = pax[ 2 ] - pax[ 0 ];
dlXDiff0 = dlXDiff0 > 0 ? dlXDiff0 : -dlXDiff0;
dlXDiff1 = dlXDiff1 > 0 ? dlXDiff1 : -dlXDiff1;
dlXDiff2 = dlXDiff2 > 0 ? dlXDiff2 : -dlXDiff2;
if ( dlXDiff0 < dlXDiff1 )
{
if ( dlXDiff2 < dlXDiff0 )
{
tem_x = ( ( pax[ 0 ] + pax[ 2 ] ) >> 1 ) ;
}
else
{
tem_x = ( ( pax[ 0 ] + pax[ 1 ] ) >> 1 );
}
}
else if ( dlXDiff2 < dlXDiff1 )
{
tem_x = ( ( pax[ 0 ] + pax[ 2 ] ) >> 1 ) ;
}
else
{
tem_x= ( ( pax[ 1 ] + pax[ 2 ] ) >> 1 ) ;
}
pay[0]=(pty[0]+pty[1]+pty[2])/3;
pay[1]=(pty[3]+pty[4]+pty[5])/3;
pay[2]=(pty[6]+pty[7]+pty[8])/3;
dlYDiff0 = pay[ 0 ] - pay[ 1 ];
dlYDiff1 = pay[ 1 ] - pay[ 2 ];
dlYDiff2 = pay[ 2 ] - pay[ 0 ];
dlYDiff0 = dlYDiff0 > 0 ? dlYDiff0 : -dlYDiff0;
dlYDiff1 = dlYDiff1 > 0 ? dlYDiff1 : -dlYDiff1;
dlYDiff2 = dlYDiff2 > 0 ? dlYDiff2 : -dlYDiff2;
if ( dlYDiff0 < dlYDiff1 )
{
if ( dlYDiff2 < dlYDiff0 )
{
tem_y = ( ( pay[ 0 ] + pay[ 2 ] ) >> 1 ) ;
}
else
{
tem_y = ( ( pay[ 0 ] + pay[ 1 ] ) >> 1 );
}
}
else if ( dlYDiff2 < dlYDiff1 )
{
tem_y = ( ( pay[ 0 ] + pay[ 2 ] ) >> 1 ) ;
}
else
{
tem_y= ( ( pay[ 1 ] + pay[ 2 ] ) >> 1 ) ;
}
if(tem_x !=0 )
{
if( tem_y != 0xfff)
{
if(tem_x<0xb0)
tem_x = 0xb0;
if(tem_y<0x150)
tem_y = 0x150;
tem_x = (tem_x-0xb0)*100/800;
tem_y = (tem_y-0x150) *100/1288;
memcpy(DisplayBuffer_565,TempBuffer_img,261120);
Mouse(tem_x,tem_y,DisplayBuffer_565);
if(sportdam_flag == 1)
{
*pSIC_IMASK = (*pSIC_IMASK | 0x00000400);
sportdam_flag = 0;
if(tem_y>154 && tem_y<280)
{
if(tem_x>0 && tem_x<46)
{
audio1();
}
else if(tem_x>46 && tem_x<101)
{
audio2();
}
else if(tem_x>101 && tem_x<164)
{
audio3();
}
else if(tem_x>164 && tem_x<226)
{
audio4();
}
else if(tem_x>226 && tem_x<288)
{
audio5();
}
else if(tem_x>288 && tem_x<351)
{
audio6();
}
else if(tem_x>351 && tem_x<413)
{
audio7();
}
else if(tem_x>413 && tem_x<470)
{
audio8();
}
else sportdam_flag = 1;
}
else if(tem_y>0 && tem_y<154)
{
if(tem_x>29 && tem_x<63)
{
audio15();
}
else if(tem_x>85 && tem_x<120)
{
audio25();
}
else if(tem_x>208 && tem_x<244)
{
audio45();
}
else if(tem_x>268 && tem_x<303)
{
audio55();
}
else if(tem_x>330 && tem_x<367)
{
audio65();
}
else sportdam_flag = 1;
}
else sportdam_flag = 1;
}
tem_y = 0xfff;
tem_x = 0;
}
}
}
}
ADSP-BF533的例程源码59:钢琴小游戏例程
需积分: 0 58 浏览量
更新于2024-06-05
收藏 230KB ZIP 举报
《ADSP-BF533钢琴小游戏例程解析》
在嵌入式系统开发领域,Blackfin系列处理器因其高效能和低功耗的特性而备受青睐。其中,ADSP-BF533是一款广泛应用于音频处理、视频编码、工业控制等领域的数字信号处理器。本文将详尽解析基于ADSP-BF533的钢琴小游戏例程,帮助开发者更好地理解和应用此类程序。
让我们了解ADSP-BF533的核心特性。该处理器集成了浮点运算单元,支持单指令多数据流(SIMD)操作,具有强大的数字信号处理能力。它拥有丰富的外围接口,如串行端口、定时器、DMA控制器等,为实现各种复杂应用提供了便利。
在这个“钢琴小游戏”例程中,ADSP-BF533主要负责音乐信号的处理和控制。游戏可能利用了BF53x触摸屏接口(bf53x_touch_organ)来模拟钢琴键盘,玩家可以直接通过触摸屏触发音符,实现演奏效果。bf53x_touch_organ这个文件很可能是例程中的关键部分,包含了触摸屏的驱动代码和交互逻辑。
对于触摸屏驱动,开发者需要理解ADSP-BF533如何读取并解析来自触摸屏的输入数据。这通常涉及到中断服务程序,当屏幕被触碰时,处理器会接收到中断请求,并执行相应的处理代码,识别出触碰的位置,将其映射到虚拟琴键上。
游戏的音效部分则涉及音频处理技术。ADSP-BF533具有内置的音频处理硬件,能够快速生成和播放音符。开发者可能使用了某种音序器算法,根据用户触摸的位置和时间生成相应的音频波形。此外,可能还使用了DMA(直接存储器访问)来提高音频数据传输的效率,减少CPU的负担。
为了实现钢琴声音的真实感,例程可能利用了FFT(快速傅里叶变换)来合成不同频率的正弦波,组合成复杂的音符。同时,音调、音量和音色的控制也至关重要,这些都可能通过调整波形参数来实现。
此外,考虑到实时性和响应性,例程可能采用了多任务调度机制。例如,一个任务处理用户输入,另一个任务负责播放音频,两者通过中断或消息队列进行通信,确保游戏流畅运行。
这个“钢琴小游戏”例程展示了ADSP-BF533在多媒体应用中的强大功能,涵盖了触摸屏驱动、音频处理、实时系统设计等多个方面。对于希望在嵌入式领域深入学习的开发者来说,这是一个很好的实践案例,值得深入研究和借鉴。通过理解并分析这个例程,不仅可以提升对ADSP-BF533处理器的理解,也能掌握更多与嵌入式系统开发相关的技术。

ADI_OP
- 粉丝: 6137
最新资源
- 2018移动互联网概念及产品介绍ppt模板.pptx
- MACOSX上安装Windows全攻略.doc
- JAVA手机游戏(堡垒)的设计方案与开发.doc
- 网站HTTPS加密应用交付解决方案.pdf
- (源码)基于Arduino IDE的Bruin Supermileage HS板控制系统.zip
- vb+SQL学生信息管理系统-毕业论文.doc
- 论翻转课堂在士官计算机项目化教学中的应用.docx
- 单片机课设自动打铃器设计方案.doc
- EPSON软件常用指令介绍.ppt
- 小学计算机教学中小学生信息素养的培养策略.docx
- 基于单片机的数字温度计大学本科方案设计书.doc
- 基于入侵检测技术在电力信息网络安全中的应用探析.docx
- Java和SQL-Server2000开发职工和工资管理(全过程及代码).doc
- 基于网络平台的高校思政课实践教学构建分析.docx
- (源码)基于C++语言的数据结构与算法实践.zip
- 现代企业计算机辅助决策系统的探究.docx