基于STM32μCOS_II贪吃蛇的课程设计报告_第1页
基于STM32μCOS_II贪吃蛇的课程设计报告_第2页
基于STM32μCOS_II贪吃蛇的课程设计报告_第3页
基于STM32μCOS_II贪吃蛇的课程设计报告_第4页
基于STM32μCOS_II贪吃蛇的课程设计报告_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

1、学院课程设计题目基于STM32 “C/OS-H贪吃蛇的设计学生028解斐025朱利昭002徐雷指导教师 志来讲师年级2012级专业电子信息工程二级学院(系、部)信息工程学院学院信息工程学院(系、部)2015年7月基于STM32C/OS-II贪吃蛇的设计摘要进入新世纪的TFT液晶显示屏的技术和产业都取得了长足的发展,作为重要的现代信息, 发布媒体之一 TFT液晶显示屏在证券交易、金融、交通、体育、广告等领域被广泛的应用。 伴随社会化信息的推进,TFT液晶屏技术也在不断地推出新,应用领域愈加广泛。现基于 STM32的TFT液晶显示可以更好的满足各种需求,也更便于操作和实现。基于STM32在TFT

2、液晶屏幕上可显示文本及图形,包括汉字和时钟显示。关键词:TFT液晶显示 STM32开发板 C/OS-II贪吃蛇word格式.摘要1前 言31背景介绍31.1选题背景3L2 MiniSTM32开发板介绍32系统硬件设计42.1开发板简介42. 2 LED 灯62. 3按键102.4 TFTLCD 模块103系统软件设计143.1 LED驱动143.2 按键驱动143.3 TFT-LCD 驱动163.4 贪吃蛇实现C语言代码183.5 uC/OS-II软件设计23结论27参考文献28前言目前已有超过85%的无线通信设备采用了 ARM技术,ARM以其高性能和低成本,在该 领域的地位日益巩固。ARM在

3、此方面的应用如:手提式计算机、移动、PDA等。 随着宽 带技术的推广,采用ARM技术的ADSL芯片正逐步获得竞争优势。此外,ARM在语音及视频 欠理上进行了优化,并获得广泛支持。UC/OS-II由Micriuni公司提供,是一个可移植、可固化的、可裁剪的、占先式多任务 实时核,它适用于多种微欠理器,微控制器和数字欠理芯片(已经移植到超过100种以上 的微欠理器应用中)。同时,该系统源代码开放、整洁、一致,注释详尽,适合系统开发。 UC/OS-II已经通过联邦航空局(FAA)商用航行器认证,符合航空无线电技术委员会(RTCA) DOT78B 标准。1背景介绍1.1 选题背景随着信息技术的飞速发展

4、,形式多样的数字化产品已经开始成为继PC机后的信息欠 理工具,在这种数字化潮流下,嵌入式系统已成为当前研究和应用的热点之一,嵌入式手 持设备的视图多媒体应用也越来越广泛。由于嵌入式系统的应用要求及成本因素决定了嵌 入式系统在系统资源,包括硬件资源和软件资源方面都是非常精简和高效的。1.2 MiniSTM32开发板介绍MiniSTM32设计精良,结构小巧!板子的设计充分考虑了成本与功能这两个矛盾面, 再结合实际使用的经验及STM32的特点,最终确定了这样的设计。STM32的优异性体现在如下几个方面:以8位机的价格,得到32位机,是STM32最大的优势。STM32拥有包括:FSMC、 TIMER、

5、SPI、I IC、USB、CAN、I IS、SDK)、ADC、DAC、RTC、DMA 等众多外设及功能,具 有极高的集成度。STM32 仅 M3 核就拥有 F100 F101 F102 F103 F105 F107 F207、 F217等8个系列上百种型号,具有QFN、LQFP、BGA等封装可供选择。同时STM32还推 出了 STM32L和STM32W等超低功耗和无线应用型的M3芯片。84个中断,16级可编 程优先级,并且所有的引脚都可以作为中断输入。STM32各个外设都有自己的独立时钟开 关,可以通过关闭相应外设的时钟来降低功耗。STM32的开发不需要昂贵的仿真器,只需 要一个串口即可下载代

6、码,并且支持SWD和JTAG两种调试口 oSM)调试可以为你的设 计带来跟多的方便,只需要2个10 口,即可实现仿真调试。2系统硬件设计2.1开发板简介ALIENTEK MiniSTM32开发板是一款迷你型的STM32F103开发板,小巧而不小气,简约而不简单。该开发板自推出以来,深得广大STM32学习者喜爱,总销量超过1.6W套。目前最新版本为V3. 0 最新MiniSTM32开发板资源图如图 所示:红外&温度传感器连接口HS003K红外接收头三个LED灯DS18B2O 预留接口0usb J24C02E EPROMJTAG/SWDCH34OGUSB转 由口接口STM3启动 I电源 闻?S选择

7、I 西示灯NRF24L01模块接口GPIOC&D 引出I。口W25Q64t4M FLASHSD卡接口 (在背面)STM32F GP1OBAC103RCTl 引出 I。口GPIOA 引电10 口 Hi .,;!OLEDALCD 共用接口技世PS/2跳标/ 这盘接口3.3V电源 输出雕人5V电源增 出儆入电源 书片ALIENTEK MiniSTM32开发板板载资源如下: CPU : STM32F103RBT6 , LQFP64 , FLASH:128K , SRAM : 20K ; 1个标准的JTAG/SWD调试下载口 1个电源指示灯(蓝色) 2个状态指示灯(DSO :红色,DS1 :绿色) 1个

8、红外接收头,配备一款小巧的红外遥控器 1个IIC接口的EEPROM芯片,24C02,容量256字节 1个SPI FLASH芯片,W25X16,容量为2M字节 1个DS18B20/DS1820温度传感器预留接口 1个标准的2. 4/2. 8寸LCD接口,支持触摸屏 1个OLED模块接口 1个USB串口,可用于程序下载和代码调试 1个USB SLAVE接口,用于USB通信 1个SD卡接口 1个PS/2接口,可外接鼠标、键盘 1组5V电源供应/接入口 1组3. 3V电源供应/接入口 1个启动模式选择配置接口 2个2.4G无线通信接口 (24L01和JF24c) 1个RTC后备电池座,并带电池 1个复

9、位按钮,可用于复位MCU和LCD 3个功能按钮,其中WKJJP兼具唤醒功能 1个电源开关,控制整个板的电源 3. 3V与5V电源TVS保护,有效防止烧坏芯片。 独创的一键下载功能 除晶振占用的10 口外,其余所有10 口全部引出,其中GPIOA和GPIOB按顺序引 出,整个板子尺寸为8cm*10cm*2cin板上除晶振外的所有的10 口全部引出,特别还有 GPI0A和GPI0B的10 口是按顺序引出的,可以极大的方便大家扩展及使用,另外板载 独特的一键下载功能,避免了频繁设置BO B1带来的麻烦,直接在电脑上一键下载。板 载十多种外设及接口,可以充分挖掘STM32的潜质。沉金PCB+全新优质元

10、器件+定制全 铜镀金排针/排座+电源TVS保护,坚若磐石。各个接口都有丝印标注,使用起来一目了 然;接口位置设计安排合理,方便顺手。资源搭配合理,物尽其用。2.2 LED 灯ALIENTEK MiniSTM32开发板板载了 2个LED,DS0和DS1,STM32的10 口可以由软件 配置成8种模式:1、输入浮空2、输入上拉3、输入下拉4、模拟输入5、开漏输出6、推挽输出7、推挽式复用功能8、开漏复用功能每个10 口可以自由编程,单10 口寄存器必须要按32位字被访问。STM32的很多10 口都是5V兼容的,这些10 口在与5V电平的外设连接的时候很有优势,具体哪些10 口是 5V兼容的,可以从

11、该芯片的数据手册管脚描述章节查到(I/O Level标FT的就是5V电平 兼容的)。STM32的每个10端口都有7个寄存器来控制。他们分别是:配置模式的2个32位的 端口配置寄存器CRL和CRH ; 2个32位的数据寄存器IDR和0DR ; 1个32位的置位/复位 寄存器BSRR ; 一个16位的复位寄存器BRR ; 1个32位的锁存寄存器LCKR ;这里我们仅介 绍常用的几个寄存器,我们常用的10端口寄存器只有4个:CRL CRH n)R、0DR。CRL和CRH控制着每个10 口的模式及输出速率。STM32的10 口位配置表如表3.1.1,1所示:配置模式CNF1CNF0MODE1 MODE

12、OPXODR寄春器通用输电布挽式(PUS4RJII)000110IIALS3.1.20或1JTife(Open-Drain)1。或1豆用功能 物出推挽式(Push Pull)10不使用开浜(Open-Drain)1不使用输入模拟输入00():不使用浮空输入1不使用下拉输入100上拉输入1表3.1.1.1 STM32的IO 口位配置表STM32输出模式配置如表3.1,1.2所示:MODE1:0意义00保留01最大输出速度为10MHz10最大输出速度为2MHz11是大输出速度为50MHz表3.1.1.2 STM32输出模式配置表端口低配置寄存器CRL的描述,如下图所示:31302928272625

13、242322212019181716CNF?1:0M0DE7L:0CNF6l:0MODE6:1:0CNF5:1:OM0DE5l:0CNF41:OJM0DE41:0rk rv rw ry rv rv rvrw iv ry rw iv zry rw rw1514131211 IC 98 i 5543210CNFS1:OMODES L:OJCNF2l:0MODE2:1:0CXF1L1:OMODE11:OCNFO1:OMODtOEliOft rir rw ru rv ru rv ri rar iv nr rw ru rw rw rw位 31:30 27:2623:22 I9:1815:1411:107

14、:S3:2CNFy1:0J:端口x配置位(y = 07)架件通过这些幽置相应的I/O端口,请参考麦15端口也配置表.在输入樵式(MODE1:0j=00卜00:模拟输入模式C1:浮空输入模式(熨位后的状态)10:上拉下拉希人穆。11:保宙在输出模式(MODE1:0|(M四00:通川推换输出模式01:通用升漏筑出模式10:复川劝螂挽输出腹11:复川功能开漏输出模丈位 29:28 25:2421:2017:1613:129:8,5:41:0MODEy1:0:靠口x的模式位y = 07)软件通过这些位里置相屯的I/O端口,请参考表15端口位配置表,00:谕人模式(复位后的状杰)01:输出模式,最大速度

15、10MHZ10:检出模式,最夫速度2MHz1h卷出模式,最大速度50MHZ图3.LL1端口低配置寄存器CRL各位描述该寄存器的复位值为0X4444 4444,从上图可以看到,复位值其实就是配置端口为浮 空输入模式。从上图还可以得出:STM32的CRL控制着每个10端口(AG)的低8位的模 式。每个10端口的位占用CRL的4个位,高两位为CNF,低两位为MODE。这里我们可以 记住几个常用的配置,比如0X0表示模拟输入模式(ADC用)、0X3表示推挽输出模式(做 输出口用,50M速率)、0X8表示上/下拉输入模式(做输入口用)、OXB表示复用输出(使 用10 口的第二功能,50M速率)。CRH的

16、作用和CRL完全一样,只是CRL控制的是低8位输出口,而CRH控制的是高8 位输出口。I DR是一个端口输入数据寄存器,只用了低16位。该寄存器为只读寄存器,并且只能 以16位的形式读出。该寄存器各位的描述如下图所示:31302928272B25242322212019181716保留1514131211109876543210IDE 131DK241DRL31DK12LDK111DE1O1DK9IDR8LDK71DR6IDRo1DK11DK31DK2IDK1LDHUrrrrrrrrrrrrrrrr位31:16保印.始函也为0.位15。IDRy15:0J:端口输入数和尸。15) 这些位为只读并

17、只能以字(16阳的版太议出,诂;I的值为对应IQU的状态图3.LL2端口输入数据寄存器IDR各位描述要想知道某个I0 口的状态,你只要读这个寄存器,再看某个位的状态就可以了。01米 是一个端口输出数据寄存器,也只用了低16位。该寄存器为可读写,从该寄存器读出来 的数据可以用于判断当前10 口的输出状态。而向该寄存器写数据,则可以控制某个10 口 的输出电平。该寄存器的各位描述如下图所示:31302928272625212322212019181716保留1514131211109876543210ODR 13ODR110DR130DR12ODR119DR100DR9ODRSODR70DE60D

18、R5ODS40DR30DR2ODR!ODXOrwrwrviwIFipiwrwrwrvrrwrwrvTWrwrr位31:16保曲,始终读为0。图3.LL3端口输出数据寄存器ODR各位描述ALIENTEK MiniSTM32开发板板载的LED硬件连接:L53/J1 DO/1 KACtbWO PD2/TIM3_ETRPC12 PC11 PC10 PA15/JTDIPA14/JTCIGSWCLK VDD VSSPA13/JTMS/SWDIO 1X/USBDP/TIM1_ETR XUSBDM TIMl CH4 10/U1 RXTIM1 CH3 A9/B1 TXTIM1 CH2 PA8/TIM1 CHI

19、MCO54PD2 |LED1L53PC12I1C SCL52PC11I1(;SDA51PC10I一CD BL50PA15JTDII49PA14JTCKLEDO48VCC3.3C947GND; 10hLEDl46PA13JTMS45PA12IJSB D十44PA11IJSB D43PA10UI RXD42PA9J:L TXD41PA8I一 EDO.R24 edTR25 edF510VCC3.32.3 按键ALIENTEK MiniSTM32开发板总共有3个按键,其原理图如下:KEYO和KEY1用作普通按键输入,分别连接在PC5和PA15上,其中PA15和JTDI共用了,所以,在使用KEYO和KE

20、Y1的时候,就不能使用JTAG来调试了,但是 可以用SWI)调试,这点在使用的时候要注意。KEYO和KEY1还和PS/2的DAT和CLK 线共用。WK_UP按键连接到PA0(STM32的WKUP引脚),它除了可以用作普通输入按键 外,还可以用作STM32的唤醒输入。该按键是高电平触发的。由于PAO还是DS18B20的 输入引脚,而18B20是有上拉电阻的,所以在使用WK_UP按键的时候,请一定要断开PAO和DS18B20的跳线帽。2.4 TFTLCD 模块TFT-LCD即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display

21、TFT-LCD与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的 每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示 液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD也被叫做真彩液 晶显示器。该模块有如下特点:1,2.4 /2.8两种大小的屏幕可选。2,320x240的分辨率。3,16位真彩显示。4,自带触摸屏,可以用来作为控制输入。5,通用的接口,除了 ALIENTEKMiniSTM32开发板,该液晶模块还可以使用在优异特、 STMSKY、红牛等开发板上。ALIENTEK MiniSTM32开发板的该模块采用的是显尚光电的D

22、ST2001PH TFTLCD, DST2001PH的控制器为ILI9320,采用26万色的TFTLCD屏,分辨率为320x240,采用16 位的80并口。2.4 28LCD OLEDLCt) VR 3nrr Ky v pn4 LCD KbRESET 5VVK.L-,LNKU6 LCD DOLCD DI 7Dd X8 LCD D2LCD D3 910 LCD D4LCD D5 11UdjrrKCal12 LCD D6LCD D7 15UoOLJD 9DBSDBiO14 LCD DSLCD D9 1516 LCD DIOLCD_D1117Ud 11 DRKTYR1418 LCD_D12LCDP1

23、319LJD I P na i an 口 i &16 LCD-bl4LCD D1521UdIjD251Onn 17cvn6 一LCD BL 25LJD 1 1kJlXUBLVDD3.3ten? i24 VCC3.3VCCl.j 252627v IZDJ .JkJlvU28 VCC5T xnsx) 293SLJ DL V DUMISO 34OSI30 T MOSIT PEN 3132T CS 331 rt-Nl r34 TSCKGND-|LCD CS 1 匕/匕m 2 LCD KSTFT LCDCS : TFTLCI)片选信号。WR :向TFTLCD写入数据。RI):从TFTLCD读取数据。D1

24、5:0 : 16位双向数据线。RST :硬复位 TFTLCD。RS :命令/数据标志(0,读写命令;1,读写数据)。80并口在上一节我们已经有详细的介绍了,这里我们就不在介绍,需要说明的是, TFTLCD模块的RST信号线和OLED模块一样,也是直接接到STM32的复位脚上,并不由软 件控制,这样可以省下来一个10 口。另外我们还需要一个背光控制线来控制TFTLCI)的背 光。所以,我们总共需要的10 口数目为21个。模块的控制器为ILI9320 (可能为其他型号,但是他们的设置很相似,除了初始化序 列有些区别,其他大都是一摸一样的,这里仅以9320为例介绍),该控制器自带显存, 其显存总大小

25、为172820 (240*320*18/8),即18位模式(26万色)下的显存量。模块的 16位数据线与显寸的对应关系为565方式,如下图所示:最低5位代表蓝色,中间6位为绿色,最高5位为红色。数值越大,表示该颜色越深。接下来,我们介绍一下ILI9320的几个重要命令,因为ILI9320的命令很多,我们这 里不可能一一介绍,有兴趣的大家可以找到ILI9320的datasheet看看。里面对这些命令 有详细的介绍。这里我们要介绍的命令列表如下:编号用令名岳盾述命令1幽D15D14D13D1231DIOD9比D7D6D5D4氏D2DIDDR0)01k*+*+*OSC打开振新福债取在制 箫型号101

26、0101100111010:00CR3您3TFJ皿10及R0DmI)DRC0I/DlI/DOM00C人脏R7)X070F7DE1PTDE)0109 03ASEB00GONDTECL0DlDi)显示岩制底)X20000001 0xf 06D7由(,由5创AD3AD2ADIM0行地址8/告歌)X210, 00F 100,D,0血6砒加送AD13AD12AD11AD109AES列地址ffi itS晚)X22吃IfC吸cNCNCNCICHCNCMCNCNCNCNCNC写数据史GMR8()X5000000000HSA7HSA5HSA5HSMHS/.3HSA2HSA1HSAO行起始标1 区)设詈R81)X

27、510000000I)HEA?HE松HEA5HBA4HE3HEA2HEA1heao行结束地址於设置烟2X520000000V*8VSA7VSA5琳A5VSA4区假VSA2VSMVSAO列网飒设冒厥您30000000VHA8VEA7VEA5VEA5VEMW.3m23VEAO列结束飒M设置表3.1O.L1IU932O常用命令表这个命令,有两个功能,如果对它写,则最低位为OSC,用于开启或关闭振荡器。而 如果对它读操作,则返回的是控制器的型号。这个命令最大的功能就是通过读它可以得到 控制器的型号,而我们代码在知道了控制器的型号之后,可以针对不同型号的控制器,进 行不同的初始化。因为93xx系列的初始

28、化,其实都比较类似,我们完全可以用一个代码 兼容好几个控制器。R3,入口模式命令。我们重点关注的是I/DO I/D1、AM这3个位,因为这3个位控 制了屏幕的显示方向。AM :控制GRAM更新方向。当AM=O的时候,地址以行方向更新。当AM=1的时候,地 址以列方向更新。:当更新了一个数据之后,根据这两个位的设置来控制地址计数器自动增加 /减少1 其关系如下图:通过这几个位的设置,我们就可以控制屏幕的显示方向了。R7,显示控制命令。该命令CL位用来控制是8位彩色,还是26万色。为。时26万 色,为1时八位色。DI DO、BASEE这三个位用来控制显示开关与否的。当全部设置为1 的时候开启显示,

29、全0是关闭。我们一般通过该命令的设置来开启或关闭显示器,以降低 功耗。R32,R33,设置GRAM的行地址和列地址。R32用于设置列地址(X坐标,0239), R33用于设置行地址(Y坐标,0319)。当我们要在某个指定点写入一个颜色的时候,光 通过这两个命令设置到改点,然后写入颜色值就可以了。R34,写数据到GRAM命令,当写入了这个命令之后,地址计数器才会自动的增加和减 少。该命令是我们要介绍的这一组命令里面唯一的单个操作的命令,只需要写入该值就可 以了,其他的都是要先写入命令编号,然后写入操作数。R80-R83,行列GRAM地址位置设置。这几个命令用于设定你显示区域的大小,我们整 个屏的

30、大小为240*320,但是有时候我们只需要在其中的一部分区域写入数据,如果用先 写坐标,后写数据这样的方式来实现,则速度大打折扣。此时我们就可以通过这几个命令, 在其中开辟一个区域,然后不停的丢数据,地址计数器就会根据R3的设置自动增加/减少, 这样就不需要频繁的写地址了,大大提高了刷新的速度。3系统软件设计3.1 LED驱动/初始化PA8和PD2为输出口.并使能这两个口的时钟/LED 10初始化void LEI)_Init(void)RCC-APB2ENR|=15;/使能PORTI)时钟word格式.RCC-APB2ENR|=12;使能PORTA时钟GPIOA-CRH&=OXFFFFFFFO

31、;GPIOA-CRH I =0X00000003; /PA8 推挽输出GPIOA-ODR|=18; /PA8 输出高GPIOD-CRL&=OXFFFFFOFF;GPIOD-CRL I =0X00000300 ;/PD. 2 推挽输出GPIOD-ODR|=12; /PD. 2 输出高3.2 按键驱动按键初始化函数/特别注意:在该函数之后,JTAG将无法使用(SWD也无法使用)/如果想JTAG仿真,可以屏蔽该函数。/PA0.13.15设置成输入void KEY_Init(void)(RCC-APB2ENR|=12; 使能 PORTA 时钟GPIOA-CRL&=OXFFFFFFFO ;/PA0 设置

32、成输入GPIOA-CRL1=0X00000008;GPIOA-CRH&=OXOFOFFFFF; /PA 13,15 设置成输入GPIOA-CRH1=0X80800000;GPIOA-ODR|=113; /PA 13 上拉,PAO 默认下拉word格式.GPIOA-ODR|=115;PA15上拉按键处理函数返回按键值/0,没有任何按键按下/I,KEYO 按下/2,KEY1 按下/3,KEY2 按下 WK.UP注意此函数有响应优先级,KEYOKEY1KEY2!u8 KEY_Scan(void)(static u8 key_up=l;/按键按松开标志JTAG.Set(JTAG_SWD_DISABLE

33、);if(key_up&(KEYO=O| |KEY1=O| |KEY2=D) delay_ms(10);去抖动key_up=O;if(KEYO=O)(JTAG_Set(SWD_ENABLE);return 1;else if(KEYl=O)JTAG_Set(SWD_ENABLE);return 2;else if(KEY2=l)(JTAG_Set(SWD_ENABLE);return 3;else if(KEYO=1&KEY1=1&KEY2=0)key_up=1;JTAG_Set(SW_ENABLE);return 0;/无按键按下3.3 TFT-LCI) 4区动/画笔颜色#define WH

34、ITEOxFFFF#define BLACK0x0000#define BLUEOxOOlF#define BRED0XF81F#define GREI)OXFFEO#define GBLUE0X07FF#def ine REI)0xF800#define MAGENTA0xF81F#define GREEN0x07E0#define CYAN0x7FFF#define YELLOWOxFFEO#define BROWN0XBC40 棕色#define BRREI)0XFC07 棕红色#define GRAY0X8430 灰色/GUI颜色#define DARKBLUE0X01CF/深蓝色#d

35、efine LIGHTBLUE0X7D7C/浅蓝色#define GRAYBLUE0X5458 灰蓝色/以上三色为PANEL的颜色#define LIGHTGREEN0X841F /浅绿色/#define LIGHTGRAY0XEF5B 浅灰色(PANNED#define LGRAY0XC618 /浅灰色(PANNED,窗体背景色#define LGRAYBLUE0XA651 /浅灰蓝色(中间层颜色)#define LBBLUE0X2B12 /浅棕蓝色(选择条目的反色)extern ul6 BACK.COLOR,POINT.COLOR ;void LCD_Init(void);void LCD

36、_DisplayOn(void);void LCI)_I)isplayOff(void);void LCD_Clear(ul6 Color);void LCl)_SetCursor(ul6 Xpos, ul6 Ypos);void LCD_ScanJ)ir(u8 dir);void LCD_I)rawPoint(u 16 x, ul6 y);画点ul6 LCD_ReadPoint(u 16 x, ul6 y); 读点void I)raw_Circle(ul6 xO, ul6 yO, u8 r);void LCDJ)rawLine(ul6 xl, ul6 yl, ul6 x2, ul6 y2);

37、void LCDJ)rawRectang1e(u16 xl, ul6 yl, ul6 x2, ul6 y2);void LCD_Fi1l(ul6 sx,ul6 sy,ul6 ex,ul6 ey,ul6 color);void LCD_ShowChar(u 16 x,ul6 y,u8 num,u8 size,u8 mode);显示一个字符void LCD_ShowNum(ul6 x, ul6 y, u32 num, u8 len, u8 size); 显示一个数字void LCD_Show2Num(u 16 x ul6 y, ul6 num, u8 len, u8 size, u8 mode);

38、显示 2 个数字void LCD_ShowString(u 16 x, ul6 y, const u8 *p);/显示一个字符串,16 字体ul6 LCD_RD_DATA(void);读取 LCD 数据void LCD_WriteReg(u8 LCD_Reg, ul6 LCD_RegValue);ul6 LCD_ReadReg(u8 LCI)_Reg);void LCD_WriteRAM_Prepare(void);void LCD_WriteRAM(ul6 RGB_Code);ul6 LCD_ReadRAM(void);ul6 LCD_BGR2RGB(ul6 c);3.4 贪吃蛇实现C语言代

39、码#include snake, h#include Icd.h*include key.hextern u8 key_value;u8 key_temp;extern int dir_x, dir_y;#de f ine SNAKE_MAX_LONG 10 最大长度 10 structu8 XSNAKE_MAX_LONG;u8 YSNAKE_MAX_LONG;u8 Long;u8 Life;u8 Score;u8 Level; Snake;蛇结构体struct(u8 X;u8 Y;u8 Yes;Food;食物结构体/绘制小方块,那8 void Turn-Off(u8 x,u8 y)LCDJi

40、ll(x*8), (y*8), (x*8+8), (y*8+8), BLACK); /8*8 小矩形 void Turn_0n(u8 x, u8 y)/8*8小矩形LCDJill(x*8), (y*8), (x*8+8), (y*8+8), RED);初始化贪吃蛇 void Snake-Init(void)u8 i;*米米米米米米米米米米初始化蛇参数米米米米米米米米米米米米米米米米米米米米Snake. Long=2;Snake. Life=0;Snake. Score=0;Food.Yes=l;/定义初始化蛇的长度初始化蛇还活着放食物标志for(i =0; iSnake. Long; i+)

41、初始化蛇的位置Snake. Xi=i+14;Snake. Yi=7;)for(i=0; iSnake. Long; i+)/将蛇画出来(Turn_0n(Snake. Xi, Snake. Yi);)void Snake_Move( int dir_x, int dir_y) 移动蛇(u8 i;Turn_Off(Snake. X0, Snake. Y0);/向上for(i=0; iSnake. Long-1; i+)初始化蛇的位置/向右1 0Snake. X i =Snake. X i+1 ;/向左 0 1Snake. Y i =Snake. Y i+1 ;/向下-1 0/向上0 -1Snake

42、. XSnake. Long-1=Snake. XSnake. Long-2+dir_x;Snake. YSnake. Long-1 =Snake. YSnake. Long-2 +dir_y; 蛇头向你要求的方向移/将蛇画出来for(i=0;iSnake. Long;i +)Turn_0n(Snake. Xi,Snake.Yi);)void Food_Place(u8 Food_x, 118 Food_y)放食物(Food. X=Food_x;Food. Y=Food_y;Turn_0n(Food. X, Food. Y);void Run_Snake(void)游戏运行(u8 i;Snak

43、e_Move(dir_x, dir_y);判断是否吃到食物,若吃到长度加1,而且再放一个if(Snake. XSnake. Long-1=Food. X)&(Snake. YSnake. Long-1=Food. Y) (Snake. Long+4-;Snake. XSnake. Long-1=Food. X;Snake. YSnake. Long-1=Food. Y;Food. X=0;Food. Y=0;Snake. Score+=1;Food. Yes= 1; 吃完一个后,再放一个食物LCI)_ShowNuni(50, 300, (u32)Snake. Score, 4,16); 显示分

44、数)if (Food. Yes=0) Food_P lace (Food. X, Food. Y);放食物if (Food. Yes=l)获得随机食物坐标whiled)(Food. X=rand()%28+1;Food. Y=rand()%2811;for(i =0; iSnake. Long; i+)/将蛇画出来(if(Snake. XSnake. Long=Food. X)&(Snake. YSnake. Long=Food. Y)(break;/如果放的食物和蛇身重合则跳出来,不放食物Food. Yes=0;break;for(i=0; iSnake. Long; i+)/将蛇画出来(i

45、f(Snake. Xi=Snake. XSnake. Long&Snake. Yi=Snake. YSnake.Long)(Game_0ver();蛇头碰到蛇身,游戏结束if(Snake. XSnake. Long-1=30)|I(Snake.YSnake.Long-1=33)Game_0ver();)/delay_ms(300);void Game_Start(void)/u8 i;POI NT_COLOR = WHITE;画笔颜色BACILCOLOR 二 BLACK; 背景色米米米米米米米米米米米绘制游戏 界 面米米米米米米米米米米米米米米米米米米米米LCDJilKO, 0, 8, 280

46、, DARKBLUE);/Rectangle(8, 8-1, 85,120, Oxaa);绘制一个矩形 框,0-127LCD.Fil1(232, 0, 240, 280, DARKBLUE);/LCDJilKO, 0, 240, 8, DARKBLUE);/LCDJilKO, 272, 240, 280, DARKBLUE);/LCILShowString(20, 300,n Score1); /Show ScoreLCILShowStringCl50, 300, “LEVEL);/Show LevelLCILShowNum(50, 300, (u32)Snake. Score, 4, 16)

47、;显示分数LCD_ShowNum(180, 300, (u32)Snake. Level,4,16);void Game_Over(void)LCILC1ear(BLACK);LCD_ShowString(60,150, MGAME OVER! M);LCD_ShowString(25,170, MPRESS ENTER TO RESTART11);LCD_ShowString(60,190, MSCORE:M);LCD_ShowNum(100,190, (u32)Snake. Score, 4,16);显示分数whiled);/Game_Start();/Snake_Init();3.5 u

48、C/OS-I I软件设计uC/OS 11 (Micro Control Operation System Two)是一个可以基于 ROM 运行的、可裁 减的、抢占式、实时多任务核,具有高度可移植性,特别适合于微欠理器和控制器,适合 很多商业操作系统性能相当的实时操作系统(RTOS)。为了提供最好的移植性能,uC/OS II 最大程度上使用ANSI C语言进行开发,并且已经移植到近40多种处理器体系上,涵盖了 从8位到64位各种CPU(包括DSP)。uC/OS II可以简单的视为一个多任务调度器,在这 个任务调度器之上完善并添加了和多任务操作系统相关的系统服务,如信号量、等。其主 要特点有公开源

49、代码,代码结构清晰、明了,注释详尽,组织有条理,可移植性好,可裁 剪,可固化。核属于抢占式,最多可以管理60个任务。从1992年开始,由于高度可靠性、 移植性和安全性,uC/OS II已经广泛使用在从照相机到航空电子产品的各种应用中。zC/OS-II可以大致分成核心、任务欠理、时间处理、任务同步与通信,CPU的移植 等5个部分。(1)核心部分(OSCore.c) 是操作系统的处理核心,包括操作系统初始化、操作系 统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。能够维持系统基本 工作的部分都在这里。(2)任务欠理部分(OSTask.c)任务欠理部分中的容都是与任务的操作密切相关 的

50、。包括任务的建立、删除、挂起、恢复等等。因为Z/C/OS-II是以任务为基本单位调度 的,所以这部分容也相当重要。(3)时钟部分(OSTime. c) /zC/OS-I I中的最小时钟单位是timetick(时钟节拍)。 任务延时等操作是在这里完成的。(4)任务同步和通信部分 为事件欠理部分,包括信号量、消息队列、事件标志 等部分;主要用于任务间的互相联系和对临界资源的访问。(5)与CPU的接口部分 是指zzC/OS-II针对所使用的CPU的移植部分。由于 “C/OS-II是一个通用性的操作系统,所以对于关键问题上的实现,还是需要根据具体CPU 的具体客和要求作相应的移植。这部分容由于牵涉到S

51、P等系统指针,所以通常用汇编语 言编写。主要包括中断级任务切换的底层实现、任务级任务切换的底层实现、时钟节拍的 产生和处理、中断的相关处理部分等容。uC/OS-II采用的是可剥夺型实时多任务核。可剥夺型的实时核在任何时候都运行就 绪了的最高优先级的任务。uC/os-II的任务调度是完全基于任务优先级的抢占式调度, 也就是最高优先级的任务一旦欠于就绪状态,则立即抢占正在运行的低优先级任务的欠理 器资源。为了简化系统设计*uC/0S-II规定所有任务的优先级不同,因而任务的优先级也 同时唯一标志了该任务本身。uC/OS-II中最多可以支持64个任务,分别对应优先级。63,其中0为最高优先级。 63为最低级,系统保留了 4个最高优先级的任务和4个最低优先级的任务,所有用户可以 使用的任务数有56个。 uC/OS-II提供了任务管理的各种

温馨提示

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

最新文档

评论

0/150

提交评论