for(j=0;j<113;j++);//更改数值,增加稳定性
}
//读状态
voidlcd_check_busy(void)
{
DDRB=0X00;
lcd_data_o=0xFF;
//lcd_delay_nms
(1);
lcd_rs_l;
lcd_rw_h;
lcd_en_l;
lcd_en_h;
while(lcd_data_i&0X80);//检测忙信号
lcd_en_l;
DDRB=0XFF;
lcd_data_o=0xff;
//lcd_delay_nms
(1);
}
//1表示数据0表示命令
voidlcd_write_data(ucharon_data,uchardata)//发送指令或数据
{
lcd_check_busy();
if(on_data)
lcd_rs_h;
else
lcd_rs_l;
lcd_rw_l;
lcd_data_o=data;
lcd_delay_nms
(2);//等待当前工作完成
lcd_en_h;
lcd_delay_nms
(2);//等待当前工作完成
lcd_en_l;
}
//读数据
ucharlcd_read_data(void)
{
uchardata;
lcd_check_busy();
lcd_data_o=0xFF;
DDRB=0X00;
lcd_rs_h;
lcd_rw_h;
lcd_en_h;
lcd_delay_nms
(1);
data=lcd_data_i;
lcd_en_l;
return(data);
}
/*
以屏幕的左上角为原点,X左——右增大0——7两个字节为单位
Y上——下增大0——63位为单位
*/
voidlcd_set_xy(ucharx,uchary)
{
if(y>31)
{
lcd_write_data(0,0x80+y-32);//y轴
lcd_write_data(0,0x88+x);//x轴
}
else
{
lcd_write_data(0,0x80+y);//y轴
lcd_write_data(0,0x80+x);//x轴
}
}
voidlcd_init(void)//LCM初始化
{
DDRA|=0X7;PORTA|=0X07;
DDRB=0XFF;PORTB=0XFF;
set_bit(DDRC,0);set_bit(PORTC,0);//并行模式
lcd_write_data(0,0x30);//八位数据端口,进入基本指令集
lcd_write_data(0,0x01);//显示清屏
lcd_write_data(0,0x06);//光标自增,画面不动
lcd_write_data(0,0x0c);//整体显示,游标关,不反白
}
//写内存,为空
voiddisplay(void)//图形方式12864显示字模逐行式顺向
{
unsignedchari,j;
lcd_write_data(0,0x34);//图形方式
for(i=0;i<32;i++)
{
lcd_write_data(0,0x80+i);//Y
lcd_write_data(0,0x80);//X
for(j=0;j<16;j++)
{
lcd_write_data(1,0x00);
}
}
for(i=0;i<32;i++)
{
lcd_write_data(0,0x80+i);//Y
lcd_write_data(0,0x88);//X
for(j=0;j<16;j++)
{
lcd_write_data(1,0x00);
}
}
//lcd_write_data(0,0x80+22);
//lcd_write_data(0,0x88);
//for(j=0;j<16;j++)
//lcd_write_data(1,0xff);
lcd_write_data(0,0x36);
}
//显示图片,逐行式顺向
voidshow_picture(constunsignedchartu[])
{
unsignedchari,j;uintk=0;
lcd_write_data(0,0x34);//图形方式
for(i=0;i<32;i++)
{
lcd_write_data(0,0x80+i);//Y
lcd_write_data(0,0x80);//X
for(j=0;j<16;j++)
{
lcd_write_data(1,tu[k]);
k++;
}
}
for(i=0;i<32;i++)
{
lcd_write_data(0,0x80+i);//Y
lcd_write_data(0,0x88);//X
for(j=0;j<16;j++)
{
lcd_write_data(1,tu[k]);
k++;
}
}
lcd_write_data(0,0x36);
}
/*
voidLCDClear(void)//清屏
{
lcd_write_data(0,0x01);//显示清屏
}
voidLCDFlash(void)//闪烁效果
{
lcd_write_data(0,0x08);//显示清屏
lcd_delay_nms(4);
lcd_write_data(0,0x0c);//显示开及光标设置
lcd_delay_nms(4);
lcd_write_data(0,0x08);//显示清屏
lcd_delay_nms(4);
lcd_write_data(0,0x0c);//显示开及光标设置
lcd_delay_nms(4);
lcd_write_data(0,0x08);//显示清屏
lcd_delay_nms(4);
}
voidlcd_draw_jpg(void)
{
lcd_write_data(0,0x34);//绘图模式设置
lcd_set_xy(0,34);//设置坐标xy
lcd_write_data(1,0xff);//高八位
lcd_write_data(1,0xf1);//低八位
lcd_write_data(0,0x36);
}
*/
/*
并行通信开始信号代码发送数据:
0XFA
发送命令:
0XF8
接收数据:
0XFE
指令代码进入基本指令集0x30
清屏0x01
光标右移0x06
显示打开游标关游标位置关0x0c
进入扩充指令集设定状态、关闭显示0X34
开启绘图显示0x36
配置lcd必须先进入相关的指令集
设置地址先垂直后水平读写都会改变AC的值
显示图片之前必须对对所有的GDRAM赋值,否则乱码
据网友说,读取数据只支持并行通信,试了多次,感觉网友说的没有错
读取数据之前必须空读一次
*/
******************************************************************************************************************************************
game.h
******************************************************************************************************************************************
/******************************************************************************/
//Name:
游戏主函数*/*/
/*Designedby:
Date:
2016/5/25*/
/*开发环境:
ICCAVR*/
/*QQ:
1460467003飘*/
/******************************************************************************/
//坐标点设定方块的左上方点
//方向参考屏幕正放
structsnake_type//定义一个砖块的结构体每次只写八位数据
{
unsignedcharx_head;//头x坐标0~63
unsignedchary_head;//头y坐标0~63
unsignedchardirec_head;//头前进的方向
unsignedcharx_end;//尾x坐标0~63
unsignedchary_end;//尾y坐标0~63
unsignedchardirec_end;//尾前进的方向
}snake;
//随机数据的缓存指针
unsignedintsuiji_num=0;
#defineDOT_NUMBER_MAX40
//x0~63两位为单位y(偶数)0~63
//点亮坐标对应的像素点
voidsnake_data_add(ucharx,uchary)
{
uchardata_h,data_l;
switch(x&0x07)
{
case0:
{
lcd_set_xy(x>>3,y);
lcd_read_data();
data_h=lcd_read_data();
//data_l=lcd_read_data();
lcd_set_xy(x>>3,y);
lcd_write_data(1,data_h|0xc0);
//lcd_write_data(1,data_l|(data<<6));
break;
}
case1:
{
lcd_set_xy(x>>3,y);
lcd_read_data();
data_h=lcd_read_data();
//data_l=lcd_read_data();
lcd_set_xy(x>>3,y);
lcd_write_data(1,data_h|0x30);
//lcd_write_data(1,data_l|(data<<6));
break;
}
case2:
{
lcd_set_xy(x>>3,y);
lcd_read_data();
data_h=lcd_read_data();
//data_l=lcd_read_data();
lcd_set_xy(x>>3,y);
lcd_write_data(1,data_h|0x0c);
//lcd_write_data(1,data_l|(data<<6));
break;
}
case3:
{
lcd_set_xy(x>>3,y);
lcd_read_data();
data_h=lcd_read_data();
//data_l=lcd_read_data();
lcd_set_xy(x>>3,y);
lcd_write_data(1,data_h|0x03);
//lcd_write_data(1,data_l|(data<<6));
break;
}
case4:
{
lcd_set_xy(x>>3,y);
lcd_read_data();
data_h=lcd_read_data();
data_l=lcd_read_data();
lcd_set_xy(x>>3,y);
lcd_write_data(1,data_h);
lcd_write_data(1,data_l|0xc0);
break;
}
case5:
{
lcd_set_xy(x>>3,y);
lcd_read_data();
data_h=lcd_read_data();
data_l=lcd_read_data();
lcd_set_xy(x>>3,y);
lcd_write_data(1,data_h);
lcd_write_data(1,data_l|0x30);
break;
}
case6:
{
lcd_set_xy(x>>3,y);
lcd_read_data();
data_h=lcd_read_data();
data_l=lcd_read_data();
lcd_set_xy(x>>3,y);
lcd_write_data(1,data_h);
lcd_write_data(1,data_l|0x0c);
break;
}
case7:
{
lcd_set_xy(x>>3,y);
lcd_read_data();
data_h=lcd_read_data();
data_l=lcd_read_data();
lcd_set_xy(x>>3,y);
lcd_write_data(1,data_h);
lcd_write_data(1,data_l|0x03);
break;
}
default:
break;
}
}
//x0~63两位为单位y(偶数)0~63
//熄灭坐标对应的像素点
voidsnake_data_dele(ucharx,uchary)
{
uchardata_h,data_l;
switch(x&0x07)
{
case0:
{
lcd_set_xy(x>>3,y);
lcd_read_data();
data_h=lcd_read_data();
//data_l=lcd_read_data();
lcd_set_xy(x>>3,y);
lcd_write_data(1,data_h&0x3f);
//lcd_write_data(1,data_l&(~(data<<6)));
break;
}
case1:
{
lcd_set_xy(x>>3,y);
lcd_read_data();
data_h=lcd_read_data();
//data_l=lcd_read_data();
lcd_set_xy(x>>3,y);
lcd_write_data(1,data_h&0xcf);
//lcd_write_data(1,data_l&(~(data<<6)));
break;
}
case2:
{
lcd_set_xy(x>>3,y);
lcd_read_data();
data_h=lcd_read_data();
//data_l=lcd_read_data();
lcd_set_xy(x>>3,y);
lcd_write_data(1,data_h&0xf3);
//lcd_write_data(1,data_l&(~(data<<6)));
break;
}
case3:
{
lcd_set_xy(x>>3,y);
lcd_read_data();
data_h=lcd_read_data();
//data_l=lcd_read_data();
lcd_set_xy(x>>3,y);
lcd_write_data(1,data_h&0xfc);
//lcd_write_data(1,data_l&(~(data<<6)));
break;
}
case4:
{
lcd_set_xy(x>