我就负责编,刚开始因为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; • return i; • } • void Showdot(uchar x, uchar y,uchar i)//在128*64的lcd矩阵中显示单个像素点 • { • uchar x_byte,x_bit; • uchar y_byte,y_bit; • x_byte=x/16; • x_bit=x%16; • y_byte=y/32; • y_bit=y%32; • write_com(0x36);//开扩展指令集 • delay(1); • write_com(0x80+y_bit); • delay(1); • write_com(0x80+x_byte+8*y_byte); • delay(1); • read_write_dataa(); • delay(1); • uchar check_busy1;
上一篇:AVR端口先设置方向还是先赋值?
下一篇:基于AVR单片机的U盘MP3设计与实现
推荐阅读最新更新时间:2024-11-18 12:56