基于TFT_LCD显示屏的MSP430单片机实验.doc

上传人:飞****2 文档编号:56717217 上传时间:2022-11-03 格式:DOC 页数:24 大小:457KB
返回 下载 相关 举报
基于TFT_LCD显示屏的MSP430单片机实验.doc_第1页
第1页 / 共24页
基于TFT_LCD显示屏的MSP430单片机实验.doc_第2页
第2页 / 共24页
点击查看更多>>
资源描述

《基于TFT_LCD显示屏的MSP430单片机实验.doc》由会员分享,可在线阅读,更多相关《基于TFT_LCD显示屏的MSP430单片机实验.doc(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、太空大战小游戏 基于TFT_LCD显示屏的MSP430单片机实验 SJTU ME 目录一、实验硬件11、概述12、 应用模块2A. LCD模块2B. TM16384二、 实验程序51、 程序实现效果52、 程序封装模块51、图形产生与移动52、我方战机的控制53、敌机与奖励的产生及移动64、击落敌机与获得奖励75、关卡升级76、施放大招:7三、 感想与思考8附页(实验程序代码)9一、实验硬件1、概述 本次课程设计是在MSP430单片机液晶屏字符显示功能的基础上,编程设计游戏。程序的设计基于F6638实验指导手册中,“TFT-LCD 实验-字符显示”的程序点亮TFT-LCD屏幕,编写游戏程序,与

2、IO控制结合,实现游戏的可视化和游戏操作。由于Code Composer Studio v5.5.0难以对该程序样例实现编译,采用的开发工具为Code Composer Studio v6.0。MSP430系列单片机是由美国TI公司生产的新一代16位单片机,因以其集成密度高、运算速度快、外设接口丰富等优势受到越来越多的产品开发人员的青睐,是当前使用最多的单片机之一。在很多具体应用中,甚至只利用一片MSP430单片机,就可以完成一个系统的全部功能。下面给出实验中使用的MSP430F66单片机的封装图和功能框图。图1-MSP430F6638封装图图2-MSP430F6638功能框图2、 应用模块A

3、. LCD模块本次编写的程序所用的主要模块为LCD模块,在功能框图中显示为 LCD_B。硬件电路设计如下所示。其中 U21 (TPS75105DSKR)是 LCD 屏背光控制芯片,由 LCD_BL_EN 引脚控制使能端。图3-MSP430F6638LCD硬件设计电路PIN NO. FUNCTION DESCRIPTIONS SYMBOL(模块引脚定义以及各个引脚的功能)NO.Symbol Description1, 2GND地3, 4VCC电源(2.8-3.4V)5NC1空脚6NC2空脚7NC3空脚8RESET复位9A0LCD寄存器选择段10SDALCD数据传输线11SCK1LCD CLK 时

4、钟线12LCD_CSLCD片选13SCKSD卡CLK时钟线14MISOSD卡主输入,从输出15MOSISD卡从输入,主输出16CS_SDSD卡片选17, 18LED+背光正极19, 20LED-背光负极 LCD的全称是Liquid Crystal Display,即液晶显示器,因功耗低而备受工程师青睐,大规模应用于电子设备中。而MSP430单片机中的TFT-LCD则是指薄膜晶体管,Thin-Film Transistor。薄膜晶体管液晶显示器(TFT-LCD)具有重量轻、平板化、低功耗、无辐射、显示品质优良等特点,其应用领域正在逐步扩大,已经从音像制品、笔记本电脑等显示器发展到台式计算机、工程

5、工作站(EWS)用监视器。对液晶显示器的要求也正在向高分辨率、高彩色化发展。MSP430F6638所采用的TFT-LCD 液晶屏的工作参数如下:X320 点 TFT 透射式点阵液晶显示模块驱动duty:1/240 Duty2.4“ (COG 式)可视角度:12 时ILI9328 LCD 驱动程序或同等能力逻辑电压:2.8V数据接口:80的系统 8/9/16/18bit 总线接口触摸面板白色背光B. TM1638在我们所制作的游戏中有一部分用到了矩阵键盘的一个按键,矩阵键盘隶属于TM1638电路,TM1638是带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口

6、、数据锁存器、LED 高压驱动、键盘扫描等电路。其对于矩阵键盘的读取如下图所示:图4-TM1638键盘读取电路其中A-F分别对应KS1-KS6。一旦有按键按下,TM1638中相关的寄存器的值就会改变(按键按下时相应字节由0变1)。二、 实验程序1、 程序实现效果在TFT-LCD屏上进行飞机大战小游戏。规则如下:1、 击中敌机得一分,敌机触及底线扣除一点生命值,生命值为零时游戏结束。2、 随机出现红黄蓝三种奖励,红色奖励增加攻击范围,蓝色奖励增加移动速度,黄色奖励增加一点生命值。3、 随得分增长游戏难度提升,逐步增加敌机出现频率及移动速度,共15关。4、 按“1”键可施放大招,消灭屏幕上所有敌机

7、,冷却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_Fil

8、lRectangle(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”,在按键时将战机参

9、考点分别向左或向右移动sp个单元。 如向左移动主要语句为: 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随机数,将

10、其与某数(sp0)比较以决定是否产生该颜色敌机,改变sp0值即可改变敌机出现频率;第二次产生一个14到305的随机数以决定敌机出现的位置参考点y坐标。奖励的产生同样如此。 敌机和奖励的移动速度可由两个参量改变,即时间间隔sp1及移动距离sp2。 如敌机向下移动的函数为:void moveenemy(i)if(enemyi=1)if(ttti sp1)ttti+;elseti=ti+sp2;Drawenemy(ti-sp2,ri,BLACK);if(ri500)Drawenemy(ti,ri,enemycolori);ttti=1;4、击落敌机与获得奖励 通过比较敌机与我方战机的相对位置来判断是

11、否击落,击落后将及时位置图形描为背景色,并将各参数重置,由数组enemy7来标志某颜色敌机是否存在于画面,若不存在则允许产生。奖励的获得同上,其中加速效果通过改变sp达到,增加攻击范围效果通过addweapon()函数在画面上呈现,同时通过改变在判断击落时所用的参量range来达到改变攻击范围的效果。详见程序附页。5、关卡升级 通过一系列参量数组以及判断是否升级,然后通过增加sp0与sp2的值分别增加敌机出现频率及敌机移动速度完成关卡升级。以下为关卡升级内容的主要函数,其中各个细节因关系到游戏难度,所以都是由我们多次测试所得到的。void levelup(i)if(leveli=0)sp0=s

12、p0+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;6、施放大招 参考关于矩阵键盘的样例程序“MatrixKeyboard_DigitalTube”,利用内置函数判断“1”键是否按下,尔后通过循环语句执行函数kill(i)中部分指令来消灭所有敌机,同时通过drawdazhao()函数在画面上呈现。尔后借用简单的循环语

13、句完成大招冷却时间倒计时。 详见程序中dazhao()函数。附页(实验程序代码)#include Hardware_Profile.h /处理器硬件配置文件 #include /产生随机数所需头文件#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

14、(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.cvoid dazhao()

15、;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=R

16、ED,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 mai

17、n(void) mClose_WDT; / 关闭看门狗 mDisable_GIE; /关闭中断Osccon_Initial(); /晶振初始化函数:定义相关晶振参数mEnable_GIE; / 开启总中断/good 放在初始化最后面 / enable interruptInit_LCD_TFT_ILI9325(); /彩屏LCD_TFT_ILI9325 初使化: 所有相关资源的初始化volatile unsigned int i;/按键消抖初始化volatile unsigned int count=0;WDTCTL = WDTPW+WDTHOLD; / Stop WDTinit_port()

18、;init_TM1638();/dazhaoLCD_TFT_Clear(BLACK); while(1) levup(y); levelup(lev); if(life=0) LCD_TFT_ShowString(110,125,GAMEOVER,FONT1608,BLACK,RED); printlife(); printscore(); printlevel(); int m; for(m=0;m=6;m+) produceenemy(m); for(m=0;m=2;m+) producebuff(m); addweapon(); movebird(); for(m=0;m=6;m+) m

19、oveenemy(m); kill(m); for(m=0;m=2;m+) movebuff(m); getbuff(m); dazhao(); if(Is_sw1_pressed()=1) / is key 1 pressed / yes s=s-sp; else if(Is_sw2_pressed()=1) / is key 2 pressed / yes s=s+sp; P4DIR &= (BIT2+BIT3);/setting IO for input void produceenemy(i)if (enemyi=0)/enemy1ri=600;possible=rand()%1000

20、;if(possiblesp0)ri=rand()%320;if(ri14)Drawenemy(ti,ri,enemycolori);enemyi=1;elseri=600;void producebuff(i)if (buffi=0)/enemy1ri+7=600;possible=rand()%2000;if(possible=possibuffi)ri+7=rand()%320;if(ri+714)Drawbuff(ti+7,ri+7,buffcolori);buffi=1;elseri+7=600;void moveenemy(i)if(enemyi=1)if(ttti sp1)ttt

21、i+;elseti=ti+sp2;Drawenemy(ti-sp2,ri,BLACK);if(ri500)Drawenemy(ti,ri,enemycolori);ttti=1;void movebuff(i)if(buffi=1)if(ttti+7 1)ttti+7+;elseti+7=ti+7+buffspeed;Drawbuff(ti+7-buffspeed,ri+7,BLACK);if(ri+7500)Drawbuff(ti+7,ri+7,buffcolori);ttti+7=1;void kill(i)if(enemyi=1)if(ri-range)=s & s=(ri+range)

22、 & ti230)Drawenemy(ti,ri,BLACK);if(life0)life-;ri=600;enemyi=0;ti=0;void getbuff(i)if(ri+7-8)=s & s=200)Drawbuff(ti+7,ri+7,BLACK);ri+7=600;buffi=0;ti+7=0;if(i=2)if(life=99)life+;if(i=1)if(sp=120)sp+;if(i=0)if(weapon230)Drawbuff(ti+7,ri+7,BLACK);ri+7=600;buffi=0;ti+7=0;void levup()if(lev=upscorey)y+;

23、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

24、%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(

25、220,290,printlevb,FONT1608,WHITE,BLACK);LCD_TFT_ShowString(220,300,printlevc,FONT1608,WHITE,BLACK); LCD_TFT_ShowString(220,310,printlevd,FONT1608,WHITE,BLACK);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,

26、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(10

27、0,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_

28、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)

29、; LCD_TFT_DrawLine(155,s-sp+20,175,s-sp+20,BLACK); if(weapon5) 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_Dr

30、awLine(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(

31、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_TF

32、T_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);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁