AVR 单片机小学期 12864液晶 双人贪吃蛇游戏

2020-02-15来源: eefocus关键字:AVR  单片机  12864液晶  双人贪吃蛇游戏

我就负责编,刚开始因为12864他把管脚插错了,总是不行,刚开始我还比较急躁。


觉得他连硬件电路都搭不好我怎么编,而且眼看着只剩两三天时间就验收了。


好在后来电路搭好了(就一个管脚接错了而已!),而且我编程顺利,最后验收效果不错。


我觉得玩起来挺爽的,加速键用着爽。


算一个纪念吧。


•  #include  

•  #include  

•  #define uchar unsigned char  

•  #define uint  unsigned int  

•  /********************端口************************/  

•  #define RS_0 PORTB&=~(1<<0)  

•  #define RS_1 PORTB|=(1<<0)  

•  #define RW_0 PORTB&=~(1<<1)  

•  #define RW_1 PORTB|=(1<<1)  

•  #define E_0  PORTB&=~(1<<2)  

•  #define E_1  PORTB|=(1<<2)  

•  #define RESET_0 PORTB&= ~(1<<4)   

•  #define RESET_1 PORTB|= (1<<4)  

•  /**************** 常用操作命令和参数定义 *****************/     

•       

•  #define DisplayClear 0x01 //清屏指令(00000001)     

•  #define ReturnHome   0x02 //光标回到"00H"(0000001X)     

•  #define EntryMode    0x06 //进入点设定,光标右移,AC加1(00000110)     

•  #define DisplayOn    0x0c //整体显示开,游标显示关,反白显示关     

•  #define DisplayOff   0x08 //整体显示关     

•  #define CursorOn     0x0e //光标显示开     

•  #define Reverse      0x0d //反白显示开     

•  #define Basic        0x30 //基本指令     

•  #define FAST         0x03;  

•  #define SLOW         0x05;  

•  #define NORM       0x04;  

•  #define Up 0  

•  #define Down 1  

•  #define Left 2  

•  #define Right 3  

•  /******************************延迟函数***********************************/  

•  uchar snakex1[16]={32,31,30,29,28,27,26,25,0,0};  

•  uchar snakey1[16]={16,16,16,16,16,16,16,16,0,0};  

•  uchar snakex2[16]={82,81,80,79,78,77,26,25,0,0};  

•  uchar snakey2[16]={16,16,16,16,16,16,16,16,0,0};  

•  uchar count1,count2;  

•  uchar stonex1[9]={31,50,10,15,20,2,22,44,47/*,8,5,55,12,34,10*/};  

•  uchar stoney1[9]={3,21,22,20,35,40,24,11,22/*,41,35,10,5,27,33*/};  

•  uchar stonex2[9]={70,77,80,100,120,112,90,99,88/*,78,96,111,122,64,100*/};  

•  uchar stoney2[9]={3,13,11,20,35,15,24,11,22/*,39,25,10,5,41,33*/};  

•  uchar len1,len2;  

•  uchar nowdir1,nowdir2;  

•  uchar flag1;//游戏结束的标志  

•  uchar flag2;  

•  uchar stop1,stop2;  

•  uchar Movex[4]={0,0,-1,1};//依次是上下左右  

•  uchar Movey[4]={-1,1,0,0};  

•  uchar speed;  

•  uchar player;  

•  void delay(uint ms)  

•  {  

•      uint i,j;  

•      for(i=0;i

•      {  

•          for(j=0;j<1141;j++);  

•      }  

•  }  

•  /************************检测LCD是否忙***************************/  

•  void check_busy(void)   

•  {  

•      DDRD =0xff;  

•      RS_0;  

•      RW_1;  

•      E_1;  

•      DDRD =0x00;  

•      delay(1);  

•      while(PIND&0x80);  

•      E_0;  

•      DDRD =0xff;   

•    

•  }  

•    

•  /***********************************写指令**********************************/  

•  void write_com(uchar com)  

•  {         

•         check_busy();  

•         RS_0;  

•         RW_0;  

•         PORTD=com;  

•         E_1;  

•         delay(1);  

•         E_0;  

•         

•  }  

•  /***********************************写数据*********************/  

•  void write_data(uchar write_data)  

•  {      

•         check_busy();  

•         RS_1;  

•         RW_0;  

•         PORTD=write_data;  

•         E_1;  

•         delay(1);  

•         E_0;  

•    

•  }  

•  void DisplayCLR()//GDRAM清屏,如果没有清屏,会出现花屏现象。  

•  {  

•      uchar i,j,k;  

•      write_com(0x36);  

•      delay(1);  

•      for(i=0;i<2;i++)  

•      {  

•          for(j=0;j<32;j++)  

•          {  

•              write_com(0x80+j);  

•              delay(1);  

•              if(i==0)  

•              {  

•              write_com(0x80);  

•              delay(1);  

•              }  

•              else//写下半屏  

•              {  

•                  write_com(0x88);  

•              }  

•              for(k=0;k<16;k++)  

•              {  

•                  write_data(0x00);  

•                  delay(1);  

•              }  

•          }  

•      }  

•      write_com(0x30);  

•  }  

•  /********************************初始化**********************************/  

•  void init(void)  

•  {  

•      DDRD=0XFF;  

•      DDRB|=0x1f;  

•      E_0;  

•      RESET_1;  

•      len1=5;  

•      len2=5;  

•      nowdir1=Right;  

•      nowdir2=Right;  

•      flag1=0;  

•      flag2=0;  

•      count1=0;  

•      count2=0;  

•      delay(50);  

•      RESET_1;  

•      RESET_0;  

•      RESET_1;  

•      delay(50);  

•      write_com(Basic);  

•      delay(50);  

•      write_com(Basic);  

•      delay(50);  

•      write_com(DisplayOn);//开显示  

•      delay(500);  

•      write_com(DisplayClear);//清屏  

•      delay(50);  

•      write_com(EntryMode);//显示模式  

•      delay(50);  

•    

•  }  

•  uchar read_write_dataa()  

•  {  

•      uchar i;  

•      check_busy();  

•      RW_1;  

•      RS_1;      

•      delay(1);  

•      E_0;  

•      delay(1);  

•      E_1;  

•      delay(1);  

•      DDRD=0X00;  

•      delay(1);//缺了这句话则不行!!!  

•      i=PIND;  

•      delay(1);  

•      E_0;  

•      delay(1);  

• DDRD=0XFF;

[1] [2] [3] [4] [5]
关键字:AVR  单片机  12864液晶  双人贪吃蛇游戏 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic488338.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:AVR端口先设置方向还是先赋值?
下一篇:最后一页

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

AVR单片机实现对步进电机的细分控制及其应用
需求分析本方案中使用的仪表具有如下特点和设计参数:●指针响应灵敏、走位准确,即收到驱动脉冲后不能丢步;●指针转动平稳,即指针从当前位置到目标位置之间的走位要平稳,正、反转都不能出现抖动;●两相、步距角10o、转动范围300o。根据技术参数可知,采用两相四拍和两相八拍时的步距角为10o和5o,在300o的范围内只能作30和60个刻度划分,在实际应用中,会发现指针步距角不能满足要求而且抖动不可避免。为了实现指针高精度的准确走位和平稳运转,要对步进电机步距进行高分辨率细分,这也是设计的难点所在。步进电机步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况下,电机转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载
发表于 2020-02-08
AVR单片机实现对步进电机的细分控制及其应用
有关AVR芯片后缀解释
下面是目前市面上两种常见的后缀:AVR MEGA8-16PU AVR MEGA8-16AU AVR MEGA8L-8PU AVR MEGA8L-8AU,前面黑色部分为芯片型号,后面数字一般会带有容量信息(8即是8K、16即16K)。(L)表示芯片支持低压,有效电压:3.3V-5V。(16)红色数字部分表示芯片最高工作频率,16即是0-16M,8即是0-8M。(PU)黄色:PU代表DIP直插封装,后面U表示工业级环保型。AU即TQFP帖片封装。AVR MEGA48-20PU AVR MEGA48-20AU AVR MEGA48V-10PU AVR MEGA48V-10AU前面黑色部分为芯片型号,后面数字一般会带有容量信息(48即是
发表于 2020-02-08
AVR单片机熔丝位的配置
(1)在AVR的器件手册中,对熔丝位使用已编程(Programmed)和未编程(Unprogrammed)定义熔丝位的状态, “Unprogrammed”表示熔丝状态为“1”(禁止);“Programmed”表示熔丝状态为“0”(允许)。因此,配置熔丝位的过程实际上是 “配置熔丝位成为未编程状态“1”或成为已编程状态“0””。(2)在使用通过选择打钩“√”方式确定熔丝位状态值的编程工具软件时,请首先仔细阅读软件的使用说明,弄清楚“√”表示设置熔丝位状态为“0”还是为“1”。(3)使用CVAVR中的编程下载程序时应特别注意,由于CVAVR编程下载界面初始打开时,大部分熔丝位的初始状态定义为“1”,因此不要使用其编程菜单选项中的
发表于 2020-02-08
AVR单片机性能简介
什么是AVR单片机?AVR单片机有什么优点?为什么要选择AVR单片机?AVR单片机是ATMEL公司研制开发的一种新型单片机,它与51单片机、PIC单片机相比具有一系列的优点:1:在相同的系统时钟下AVR运行速度最快;2: 芯片内部的Flsah、EEPROM、SRAM容量较大;3:所有型号的Flash、EEPROM都可以反复烧写、全部支持在线编程烧写(ISP);4:多种频率的内部RC振荡器、上电自动复位、看门狗、启动延时等功能,零外围电路也可以工作;5:每个IO口都可以以推换驱动的方式输出高、低电平,驱动能力强;6:内部资源丰富,一般都集成AD、DA模数器;PWM;SPI、USART、TWI、I2C通信口;丰富的中断源等。目前支持
发表于 2020-02-08
AVR单片机硬件电路设计方法详解
Mega16已经内置了上电复位设计。并且在熔丝位里,可以控制复位时的额外时间,故AVR外部的复位线路在上电时,可以设计得很简单:直接拉一只10K的电阻到VCC即可 (R0)。为了可靠,再加上一只0.1uF的电容(C0)以消除干扰、杂波。D3(1N4148($0.0054))的作用有两个:作用一是将复位输入的最高电压钳在 Vcc+0.5V 左右,另一作用是系统断电时,将R0(10K)电阻短路,让C0快速放电,让下一次来电时,能产生有效的复位。当AVR在工作时,按下S0开关时,复位脚变成低电平,触发AVR芯片复位。重要说明:实际应用时,如果你不需要复位按钮,复位脚可以不接任何的零件,AVR芯片也能稳定工作。即这部分不需要任何的外围零件
发表于 2020-02-08
AVR单片机硬件电路设计方法详解
基于AVR的GSM无线智能变压器综合报警系统
一、项目概述1.1 引言本项目设计的基于AVR的GSM 无线智能变压器综合报警系统,其目的在于提供一种无线智能变压器综合报警系统,可以识别系统停电,杜绝误报的发生;可以测量变压器油温并在油温超温时报警;具有“人体非正常接近报警”功能;具备断电工作保护功能,当电源线被破坏或由于其它原因断电时,系统仍能继续工作;可以对电力变压器综合运行参数进行检测,并对故障运行状态(过流、过压、欠压等)进行预警(可选)。该装置可以用在电力系统和大型工业企业领域中,并且本系统稍加改进后,可用于各种无线报警、控制装置中。例如,可以将本装置运用在电力节能方向,如通过该系统的语音、短信功能来控制路灯的开关,实现路灯的防盗与节能。1.2 项目背景/选题动机
发表于 2020-02-08
小广播
何立民专栏 单片机及嵌入式宝典

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

更多每日新闻
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved