基于tft_lcd显示屏的msp430单片机实验_第1页
基于tft_lcd显示屏的msp430单片机实验_第2页
基于tft_lcd显示屏的msp430单片机实验_第3页
基于tft_lcd显示屏的msp430单片机实验_第4页
基于tft_lcd显示屏的msp430单片机实验_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

太空大战小游戏 基于 TFT_LCD 显示屏的 MSP430 单片机实验 SJTU ME 5120209353 基于 TFT_LCD 的 MSP430 单片机实验 - - 太空大战 目录 一、实验硬件 1 1、概述1 2、 应用模块2 A. LCD 模块.2 B. TM1638.4 二、 实验程序 5 1、 程序实现效果 .5 2、 程序封装模块 .5 1、图形产生与移动.5 2、我方战机的控制.5 3、敌机与奖励的产生及移动 6 4、击落敌机与获得奖励.7 5、关卡升级7 6、施放大招: .7 三、 感想与思考8 附页(实验程序代码)9 一、实验硬件一、实验硬件 1、概述 本次课程设计是在 MSP430 单片机液晶屏字符显示功能的基础上,编程设计游戏。程 序的设计基于F6638 实验指导手册中, “TFT-LCD 实验-字符显示”的程序点亮 TFT- LCD 屏幕,编写游戏程序,与 IO 控制结合,实现游戏的可视化和游戏操作。由于 Code Composer Studio v5.5.0 难以对该程序样例实现编译,采用的开发工具为 Code Composer Studio v6.0。 MSP430 系列单片机是由美国 TI 公司生产的新一代 16 位单片机,因以其集成密度高、 运算速度快、外设接口丰富等优势受到越来越多的产品开发人员的青睐,是当前使用最多 的单片机之一。在很多具体应用中,甚至只利用一片 MSP430 单片机,就可以完成一个系统 的全部功能。下面给出实验中使用的 MSP430F66 单片机的封装图和功能框图。 图 1-MSP430F6638 封装图 基于 TFT_LCD 的 MSP430 单片机实验 - - 太空大战 1 图 2-MSP430F6638 功能框图 2、应用模块 A. LCD 模块模块 本次编写的程序所用的主要模块为 LCD 模块,在功能框图中显示为 LCD_B。硬件电路 设计如下所示。其中 U21 (TPS75105DSKR)是 LCD 屏背光控制芯片,由 LCD_BL_EN 引脚 控制使能端。 图 3-MSP430F6638LCD 硬件设计电路 PIN NO. FUNCTION DESCRIPTIONS SYMBOL(模块引脚定义以及各个引脚的功能) NO.NO.SymbolSymbol DescriptionDescription 1,1, 2 2GND 地 3,3, 4 4VCC 电源(2.8-3.4V) 5 5NC1 空脚 6 6NC2 空脚 7 7NC3 空脚 8 8RESET 复位 9 9A0 LCD 寄存器选择段 1010SDA LCD 数据传输线 1111SCK1 LCD CLK 时钟线 1212LCD_CS LCD 片选 1313SCK SD 卡 CLK 时钟线 1414MISO SD 卡主输入,从输出 1515MOSI SD 卡从输入,主输出 1616CS_SD SD 卡片选 17,17, 1818LED+ 背光正极 19,19, 2020LED- 背光负极 LCD 的全称是 Liquid Crystal Display,即液晶显示器,因功耗低而备受工程师青睐, 大规模应用于电子设备中。而 MSP430 单片机中的 TFT-LCD 则是指薄膜晶体管,Thin-Film Transistor。薄膜晶体管液晶显示器(TFT-LCD)具有重量轻、平板化、低功耗、无辐射、 显示品质优良等特点,其应用领域正在逐步扩大,已经从音像制品、笔记本电脑等显示器 发展到台式计算机、工程工作站(EWS)用监视器。对液晶显示器的要求也正在向高分辨率、 高彩色化发展。 MSP430F6638 所采用的 TFT-LCD 液晶屏的工作参数如下: X320X320 点点 TFTTFT 透射式点阵液晶显示模块透射式点阵液晶显示模块 驱动驱动 dutyduty:1/2401/240 DutyDuty 2.4“2.4“ (COGCOG 式)式) 可视角度:可视角度:1212 时时 ILI9328ILI9328 LCDLCD 驱动程序或同等能力驱动程序或同等能力 逻辑电压:逻辑电压:2.8V2.8V 数据接口:数据接口:8080 的系统的系统 8/9/16/18bit8/9/16/18bit 总线接口总线接口 触摸面板触摸面板 白色背光白色背光 基于 TFT_LCD 的 MSP430 单片机实验 - - 太空大战 3 B. TM1638 在我们所制作的游戏中有一部分用到了矩阵键盘的一个按键,矩阵键盘隶属于 TM1638 电路,TM1638 是带键盘扫描接口的 LED(发光二极管显示器)驱动控制专用电 路,内部集成有 MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。其对于 矩阵键盘的读取如下图所示: 图 4-TM1638 键盘读取电路 其中 A-F 分别对应 KS1-KS6。一旦有按键按下,TM1638 中相关的寄存器的值就会改 变(按键按下时相应字节由 0 变 1) 。 2、实验程序实验程序 1、程序实现效果 在 TFT-LCD 屏上进行飞机大战小游戏。规则如下: 1、击中敌机得一分,敌机触及底线扣除一点生命值,生命值为零时游戏结束。 2、随机出现红黄蓝三种奖励,红色奖励增加攻击范围,蓝色奖励增加移动速度,黄色 奖励增加一点生命值。 3、随得分增长游戏难度提升,逐步增加敌机出现频率及移动速度,共 15 关。 4、按“1”键可施放大招,消灭屏幕上所有敌机,冷却 30 秒后可再次施放。 2、程序封装模块 1、图形产生与移动、图形产生与移动 基于示例程序“SPI_LCD_TFT”中所含头文件,利用其中各函数进行绘图。在绘制各 图形时选取其上一点为相对参考点,然后用相对于它的坐标画出整个图形。需要移动图形 时通过参量“sp”控制其移动距离,移动参考点,并在新的位置画出图形,同时将原来位 置图形用背景色描一遍以擦除。在移动我方战机时,程序为先擦除左右两边原来图形,再 显示即时位置图形,这样可以防止擦除行为影响到新图形。 如绘制敌机的函数为: void Drawenemy(x,y,c) LCD_TFT_FillRectangle(x,y-4,x+2,y-1,c); LCD_TFT_FillRectangle(x,y+1,x+2,y+4,c); LCD_TFT_FillRectangle(x+2,y-5,x+6,y+5,c); LCD_TFT_DrawLine(x+2,y-9,x+2,y+9,c); LCD_TFT_DrawLine(x+2,y-9,x+6,y-5,c); LCD_TFT_DrawLine(x+2,y+9,x+6,y+5,c); LCD_TFT_DrawLine(x+6,y-3,x+9,y,c); LCD_TFT_DrawLine(x+6,y+3,x+9,y,c); 2、我方战机的控制、我方战机的控制 参考按键消抖示例程序“msp430f6638_Key_debounce” ,在按键时将战机参考点分别向 左或向右移动 sp 个单元。 如向左移动主要语句为: 基于 TFT_LCD 的 MSP430 单片机实验 - - 太空大战 5 if(Is_sw1_pressed()=1) / is key 1 pressed / yes s=s-sp; void movebird() Drawbird(s-sp,BLACK); LCD_TFT_DrawLine(205,s-sp,1,s-sp,BLACK); Drawbird(s+sp,BLACK); LCD_TFT_DrawLine(205,s+sp,1,s+sp,BLACK); Drawbird(s,YELLOW); 3、敌机与奖励的产生及移动、敌机与奖励的产生及移动 两次利用随机数函数 rand()。对于某种颜色的敌机,第一次产生一个 0 到 1000 随机数, 将其与某数(sp0)比较以决定是否产生该颜色敌机,改变 sp0 值即可改变敌机出现频率; 第二次产生一个 14 到 305 的随机数以决定敌机出现的位置参考点 y 坐标。奖励的产生同样 如此。 敌机和奖励的移动速度可由两个参量改变,即时间间隔 sp1 及移动距离 sp2。 如敌机向下移动的函数为: void moveenemy(i) if(enemyi=1) if(ttti /产生随机数所需头文件 #include #include /#include /按键消抖所需函数 void delay_ms(unsigned int duration); unsigned char Is_sw1_pressed(void); unsigned char Is_sw2_pressed(void); void Osccon_Initial(void); /晶振初始化函数:配置相关晶振参数 void Drawbird(x,c); void movebird(); void Drawenemy(x,y,c); void Drawbuff(x,y,c); void produceenemy(i); void producebuff(i); void moveenemy(i); void movebuff(i); void kill(i); void getbuff(i); void addweapon(); void levelup(i); void levup(); void printlife(); void printscore(); void printlevel(); /#include “TM1638.c“ void dazhao(); void drawdazhao(); void init_port(void); int s=160; int r10=10,10,10,10,10,10,10,10; int possible=0; int enemy7=0,0,0,0,0; int buff3=0,0,0; int y=0; int t10=1,1,1,1,1,1,1,1; int sp0=35; int sp1=3; int sp2=5; int sp=5; int buffspeed=4; int ttt10=1,1,1,1,1,1,1,1; int score=0; int life=5; int range=8; int enemycolor7=RED,BLUE,WHITE,GRAY,OLIVE,BROWN,MAGENTA; int buffcolor3=RED,BLUE,YELLOW; int weapon=1; int level15=1,0,0,0,0,0,0,0,0,0,0,0,0,0,0; int lev=0; int possibuff3=18,21,70; int upscore15=10,20,50,80,130,180,250,350,500,700,900,1100,1300,1500; int dazhaot=0; int dazhaohao=1; u8* printlev10=“0“,“1“,“2“,“3“,“4“,“5“,“6“,“7“,“8“,“9“; int main(void) mClose_WDT; / 关闭看门狗 mDisable_GIE; /关闭中断 Osccon_Initial(); /晶振初始化函数:定义相关晶振参数 mEnable_GIE; / 开启总中断/good 放在初始化最后面 / enable interrupt Init_LCD_TFT_ILI9325(); /“彩屏 LCD_TFT_ILI9325“ 初使化: 所有相关资源的初始化 volatile unsigned int i;/按键消抖初始化 volatile unsigned int count=0; WDTCTL = WDTPW+WDTHOLD; / Stop WDT init_port(); init_TM1638();/dazhao LCD_TFT_Clear(BLACK); while(1) levup(y); levelup(lev); if(life14) Drawenemy(ti,ri,enemycolori); enemyi=1; else ri=600; void producebuff(i) if (buffi=0)/enemy1 ri+7=600; possible=rand()%2000; if(possible14) Drawbuff(ti+7,ri+7,buffcolori); buffi=1; else ri+7=600; 基于 TFT_LCD 的 MSP430 单片机实验 - - 太空大战 11 void moveenemy(i) if(enemyi=1) if(ttti 230) Drawenemy(ti,ri,BLACK); if(life0) life-; ri=600; enemyi=0; ti=0; void getbuff(i) if(ri+7-8)=200) Drawbuff(ti+7,ri+7,BLACK); ri+7=600; buffi=0; ti+7=0; if(i=2) if(life230) Drawbuff(ti+7,ri+7,BLACK); ri+7=600; buffi=0; ti+7=0; void levup() if(lev=upscorey) y+; lev+; void levelup(i) if(leveli=0) sp0=sp0+30; if(i=1|i=3|i=5|i=7|i=9|i=10|i=11|i=12|i=13|i=14) sp2=sp2+3; buffspeed+; if(i=12|i=13|i=14) sp2=sp2+2; if(i=3|i=7|i=9|i=12|i=13|i=14) possibuff2=possibuff2+70; leveli=1; void printlife() /LCD_TFT_ShowString(170,260,“Life:“,FONT1608,WHITE,BLACK); int a,b; a=life/10; b=life%10; LCD_TFT_ShowString(200,300,printleva,FONT1608,WHITE,BLACK); LCD_TFT_ShowString(200,310,printlevb,FONT1608,WHITE,BLACK); void printscore() int a,b,c,d; a=score/1000; b=(score-a*1000)/100; c=(score-a*1000-b*100)/10; d=score%10; LCD_TFT_ShowString(220,280,printleva,FONT1608,WHITE,BLACK); LCD_TFT_ShowString(220,290,printlevb,FONT1608,WHITE,BLACK); LCD_TFT_ShowString(220,300,printlevc,FONT1608,WHITE,BLACK); LCD_TFT_ShowString(220,310,printlevd,FONT1608,WHITE,BLACK); 基于 TFT_LCD 的 MSP430 单片机实验 - - 太空大战 15 void printlevel() int a,b; a=(lev+1)/10; b=(lev+1)%10; LCD_TFT_ShowString(190,2,“LEVEL:“,FONT1608,WHITE,BLACK); LCD_TFT_ShowString(190,50,printleva,FONT1608,WHITE,BLACK); LCD_TFT_ShowString(190,60,printlevb,FONT1608,WHITE,BLACK); / void delay_ms(unsigned int duration) unsigned int i; for(i=0;i1) LCD_TFT_DrawLine(100,s-sp-5,110,s-sp-5,BLACK); LCD_TFT_DrawLine(100,s-sp+5,110,s-sp+5,BLACK); LCD_TFT_DrawLine(100,s+sp-5,110,s+sp-5,BLACK); LCD_TFT_DrawLine(100,s+sp+5,110,s+sp+5,BLACK); if(weapon2) LCD_TFT_DrawLine(120,s+sp-10,135,s+sp-10,BLACK); LCD_TFT_DrawLine(120,s+sp+10,135,s+sp+10,BLACK); LCD_TFT_DrawLine(120,s-sp-10,135,s-sp-10,BLACK); LCD_TFT_DrawLine(120,s-sp+10,135,s-sp+10,BLACK); if(weapon3) LCD_TFT_DrawLine(140,s+sp-15,160,s+sp-15,BLACK); LCD_TFT_DrawLine(140,s+sp+15,160,s+sp+15,BLACK); LCD_TFT_DrawLine(140,s-sp-15,160,s-sp-15,BLACK); LCD_TFT_DrawLine(140,s-sp+15,160,s-sp+15,BLACK); if(weapon4) LCD_TFT_DrawLine(155,s+sp-20,175,s+sp-20,BLACK); LCD_TFT_DrawLine(155,s+sp+20,175,s+sp+20,BLACK); LCD_TFT_DrawLine(155,s-sp-20,175,s-sp-20,BLACK); LCD_TFT_DrawLine(155,s-sp+20,175,s-sp+20,BLACK); if(weapon5) 基于 TFT_LCD 的 MSP430 单片机实验 - - 太空大战 17 LCD_TFT_DrawLine(100,s-25-sp,1,s-25-sp,BLACK); LCD_TFT_DrawLine(100,s-25+sp,1,s-25+sp,BLACK); LCD_TFT_DrawLine(100,s-25,1,s-25,RED); LCD_TFT_DrawLine(100,s+25-sp,1,s+25-sp,BLACK); LCD_TFT_DrawLine(100,s+25+sp,1,s+25+sp,BLACK); LCD_TFT_DrawLine(100,s+25,1,s+25,RED); LCD_TFT_DrawLine(155,s-20,175,s-20,CYAN); LCD_TFT_DrawLine(155,s+20,175,s+20,CYAN); LCD_TFT_DrawLine(140,s-15,160,s-15,BLUE); LCD_TFT_DrawLine(140,s+15,160,s+15,BLUE); LCD_TFT_DrawLine(120,s-10,135,s-10,LBLUE); LCD_TFT_DrawLine(120,s+10,135,s+10,LBLUE); LCD_TFT_DrawLine(100,s-5,110,s-5,WHITE); LCD_TFT_DrawLine(100,s+5,110,s+5,WHITE); void Drawbird(x,c) LCD_TFT_DrawLine(210,x,214,x+4,c); LCD_TFT_DrawLine(210,x,214,x-4,c); LCD_TFT_DrawLine(214,x-4,224,x-5,c); LCD_TFT_DrawLine(214,x+4,224,x+5,c); LCD_TFT_DrawLine(222,x-3,224,x-5,c); LCD_TFT_DrawLine(222,x+3,224,x+5,c); LCD_TFT_DrawLine(225,x-5,230,x-5,c); LCD_TFT_DrawLine(225,x+5,230,x+5,c); LCD_TFT_DrawLine(225,x-5,225,x-8,c); LCD_TFT_DrawLine(225,x+5,225,x+8,c); LCD_TFT_DrawLine(225,x-8,230,x-13,c); LCD_TFT_DrawLine(225,x+8,230,x+13,c); LCD_TFT_DrawLine(230,x-5,230,x-13,c); LCD_TFT_DrawLine(230,x+5,230,x+13,c); LCD_TFT_DrawLine(230,x-5,232,x-3,c); LCD_TFT_DrawLine(230,x+5,232,x+3,c); LCD_TFT_DrawLine(232,x-3,232,x+3,c); LCD_TFT_DrawLine(232,x-2,234,x,c); LCD_TFT_DrawLine(232,x+2,234,x,c); LCD_TFT_FillRectangle(213,x-1,223,x+1,c); void movebird() Drawbird(s-sp,BLACK); LCD_TFT_DrawLine(205,s-sp,1,s-sp,BLACK); Drawbird(s+sp,BLACK); LCD_TFT_DrawLine(205,s+sp,1,s+sp,BLACK); Drawbird(s,YELLOW); LCD_TFT_DrawLine(205,s,1,s,WHITE); void dazhao() if(dazhaohao=1) LCD_TFT_DrawCircle(225,5,3,RED); int i=5,k=5; k=Read_key(); if(k=1) for(i=0;i=200) dazhaohao=1;/大招冷却 30 秒 基于 TFT_LCD 的 MSP430 单片机实验 - - 太空大战 19 void drawdazhao() LCD_TFT_DrawLine(210,20,0,20,RED); LCD_TFT_DrawLine(210,40,0,40,YELLOW); LCD_TFT_DrawLine(210,60,0,60,GREEN); LCD_TFT_DrawLine(210,80,0,80,BLUE); LCD_TFT_DrawLine(210,100,0,100,PURPLE); LCD_TFT_DrawLine(210,120,0,120,WHITE); LCD_TFT_DrawLine(210,140,0,140,RED); LCD_TFT_DrawLine(210,160,0,160,YELLOW); LCD_TFT_DrawLine(210,180,0,180,GREEN); LCD_TFT_DrawLine(210,200,0,200,BLUE); LCD_TFT_DrawLine(210,220,0,220,PURPLE); LCD_TFT_DrawLine(210,240,0,240,WHITE); LCD_TFT_DrawLine(210,260,0,260,RED); LCD_TFT_DrawLine(210,280,0,280,YELLOW); LCD_TFT_DrawLine(210,300,0,300,GREEN);/ LCD_TFT_DrawLine(210,20,0,20,BLACK); LCD_TFT_DrawLine(210,40,0,40,BLACK); LCD_TFT_DrawLine(210,60,0,60,BLACK); LCD_TFT_DrawLine(210,80,0,80,BLACK); LCD_TFT_DrawLine(210,100,0,100,BLACK); LCD_TFT_DrawLine(210,120,0,120,BLACK); LCD_TFT_DrawLine(210,140,0,140,BLACK); LCD_TFT_DrawLine(210,160,0,160,BLACK); LCD_TFT_DrawLine(210,180,0,180,BLACK); LCD_TFT_DrawLine(210,200,0,200,BLACK); LCD_TFT_DrawLine(210,220,0,220,BLACK); LCD_TFT_DrawLine(210,240,0,240,BLACK); LCD_TFT_DrawLine(210,260,0,260,BLACK); LCD_TFT_DrawLine(210,280,0,280,BLACK); LCD_TFT_DrawLine(210,300,0,300,BLACK); void init_port(void) P3DIR |= BIT5; P3DIR |= BIT4 + BIT2; P1DIR |= BIT0; / ACLK set out to pins P1SEL |= BIT0; void Osccon_Initial(void) /晶振初始化函数:配置相关晶振参数 /IO 初始化,在放在“晶振“配置的前面 /P1DIR |= BIT0; / ACLK set out to pins /P1SEL |= BIT0; /=care=下面之两句一定要有,不知道为什么?/ /P3DIR |= BIT4; / SMCLK set out to pins /P3SEL |= BIT4; /*/ SetVCore(PMMCOREV_3); / Set Vcore to accomodate for max. allowed system speed UCSCTL3 |= SELREF_2; / Set DCO FLL reference = REFO _bis_SR_register(SCG0); / Disable the FLL control loop UCSCTL0 = 0x0000; / Set lowest possible DCOx, MODx UCSCTL1 = DCORSEL_5

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论