我就负责编,刚开始因为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;
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』