单片机写个游戏只是突然的自我(想法)~
液晶是网上买来的,TFT 2.4寸240x320竖屏的(当然也可以横屏使用,但是看上去效果肯定不如竖屏使用),RGB565也就是65K色的~
看看效果先,相机+拍照水平不行~所以……
凑合吧:

上面是游戏的启动界面,说到这里我必须推荐一个字模工具zimo221(软件在底下的附件连接里)
液晶参数:
2.4寸 TFT材质,分辨率位240x320,65K色。
控制器用的是ILI9325。
在单片机驱动时采用的是8位模式,它的高八位数据口是有效的。
驱动程序如下(AVR版本)
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/pgmspace.h> //字库放在flash中需要用的
#include "symbol_16x8.h" /*这个是英文和符号的字库*/
#define A00 (PORTD &= 0XFE)/*可根据具体情况修改引脚 A0就是RS数据和指令的选择控制线*/
#define A01 (PORTD |= 0X01)
#define RES0 (PORTD &= 0XFD)
#define RES1 (PORTD |= 0X02)
#define WRB0 (PORTD &= 0XFB)
#define WRB1 (PORTD |= 0X04)
#define RDB0 (PORTD &= 0XF7)
#define RDB1 (PORTD |= 0X08)
#define CS_MAIN0 (PORTD &= 0XEF)
#define CS_MAIN1 (PORTD |= 0X10)
/***
主体程序****/
void delayms(unsigned int count) // /* X10ms */
{
unsigned int i;
for(i=0;i<count;i++)
_delay_ms(1);
}
void port_init()
{
PORTA = 0Xff;/*数据端口低位对应液晶的*/
DDRA = 0XFF;
PORTD = 0Xff;
DDRD = 0XFF;
}
void main_Write_COM(unsigned int CH) //8位数据接口发送数据
{
A00;
CS_MAIN0;
PORTA = CH>>8;
WRB0;
WRB1;
PORTA = CH&0XFF;
WRB0;
WRB1;
CS_MAIN1;
}
void main_Write_DATA(unsigned int DH) //8位数据接口发送数据
{
A01;
CS_MAIN0;
PORTA = DH>>8;
WRB0;
WRB1;
PORTA = DH&0xff;
WRB0;
WRB1;
CS_MAIN1;
}
void main_W_com_data(unsigned int com1,unsigned int dat1)
{
main_Write_COM(com1);
main_Write_DATA(dat1);
}
void address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)
{
main_W_com_data(0x0020,x1);//设置X坐标位置
main_W_com_data(0x0021,y1);//设置Y坐标位置
main_W_com_data(0x0050,x1); //开始X
main_W_com_data(0x0052,y1); //开始Y
main_W_com_data(0x0051,x2); //结束X
main_W_com_data(0x0053,y2); //结束Y
main_Write_COM(0x0022);
}
void main_init(void)
{
port_init();
RES1;
delayms(5);
RES0;
delayms(10);
RES1;
delayms(20);
//************* Start Initial Sequence **********//
main_Write_COM(0x00E5); main_Write_DATA(0x78F0); // set SRAM internal timing
main_Write_COM(0x0001); main_Write_DATA(0x0100); // set SS and SM bit
main_Write_COM(0x0002); main_Write_DATA(0x0700); // set 1 line inversion
/*屏幕方向*/
main_Write_COM(0x0003); main_Write_DATA(0x1030/*0x1018*/); // set GRAM write direction and BGR=1.正常的竖屏
//main_Write_COM(0x0003); main_Write_DATA(0x1018/*0x1018*/); // set GRAM write direction and BGR=1.此时屏幕是横屏
main_Write_COM(0x0004); main_Write_DATA(0x0000); // Resize register
main_Write_COM(0x0008); main_Write_DATA(0x0207); // set the back porch and front porch
main_Write_COM(0x0009); main_Write_DATA(0x0000); // set non-display area refresh cycle ISC[3:0]
main_Write_COM(0x000A); main_Write_DATA(0x0000); // FMARK function
main_Write_COM(0x000C); main_Write_DATA(0x0000); // RGB interface setting
main_Write_COM(0x000D); main_Write_DATA(0x0000); // Frame marker Position
main_Write_COM(0x000F); main_Write_DATA(0x0000); // RGB interface polarity
//*************Power On sequence ****************//
main_Write_COM(0x0010); main_Write_DATA(0x0000); // SAP, BT[3:0], AP, DSTB, SLP, STB
main_Write_COM(0x0011); main_Write_DATA(0x0007); // DC1[2:0], DC0[2:0], VC[2:0]
main_Write_COM(0x0012); main_Write_DATA(0x0000); // VREG1OUT voltage
main_Write_COM(0x0013); main_Write_DATA(0x0000); // VDV[4:0] for VCOM amplitude
main_Write_COM(0x0007); main_Write_DATA(0x0001);
delayms(200); // Dis-charge capacitor power voltage
main_Write_COM(0x0010); main_Write_DATA(0x1090); // 1490//SAP, BT[3:0], AP, DSTB, SLP, STB
main_Write_COM(0x0011); main_Write_DATA(0x0227); // DC1[2:0], DC0[2:0], VC[2:0]
delayms(50); // Delay 50ms
main_Write_COM(0x0012); main_Write_DATA(0x001F); //001C// Internal reference voltage= Vci;
delayms(50); // Delay 50ms
main_Write_COM(0x0013); main_Write_DATA(0x1500); //0x1000//1400 Set VDV[4:0] for VCOM amplitude 1A00
main_Write_COM(0x0029); main_Write_DATA(0x0027); //0x0012 //001a Set VCM[5:0] for VCOMH //0x0025 0034
main_Write_COM(0x002B); main_Write_DATA(0x000D); // Set Frame Rate 000C
delayms(50); // Delay 50ms
main_Write_COM(0x0020); main_Write_DATA(0x0000); // GRAM horizontal Address
main_Write_COM(0x0021); main_Write_DATA(0x0000); // GRAM Vertical Address
// ----------- Adjust the Gamma Curve ----------//
main_Write_COM(0x0030); main_Write_DATA(0x0000);
main_Write_COM(0x0031); main_Write_DATA(0x0707);
main_Write_COM(0x0032); main_Write_DATA(0x0307);
main_Write_COM(0x0035); main_Write_DATA(0x0200);
main_Write_COM(0x0036); main_Write_DATA(0x0008);//0207
main_Write_COM(0x0037); main_Write_DATA(0x0004);//0306
main_Write_COM(0x0038); main_Write_DATA(0x0000);//0102
main_Write_COM(0x0039); main_Write_DATA(0x0707);//0707
main_Write_COM(0x003C); main_Write_DATA(0x0002);//0702
main_Write_COM(0x003D); main_Write_DATA(0x1D04);//1604
//------------------ Set GRAM area ---------------//
main_Write_COM(0x0050); main_Write_DATA(0x0000); // Horizontal GRAM Start Address
main_Write_COM(0x0051); main_Write_DATA(0x00EF); // Horizontal GRAM End Address
main_Write_COM(0x0052); main_Write_DATA(0x0000); // Vertical GRAM Start Address
main_Write_COM(0x0053); main_Write_DATA(0x013F); // Vertical GRAM Start Address
main_Write_COM(0x0060); main_Write_DATA(0xA700); // Gate Scan Line
main_Write_COM(0x0061); main_Write_DATA(0x0001); // NDL,VLE, REV
main_Write_COM(0x006A); main_Write_DATA(0x0000); // set scrolling line
//-------------- Partial Display Control ---------//
main_Write_COM(0x0080); main_Write_DATA(0x0000);
main_Write_COM(0x0081); main_Write_DATA(0x0000);
main_Write_COM(0x0082); main_Write_DATA(0x0000);
main_Write_COM(0x0083); main_Write_DATA(0x0000);
main_Write_COM(0x0084); main_Write_DATA(0x0000);
main_Write_COM(0x0085); main_Write_DATA(0x0000);
//-------------- Panel Control -------------------//
main_Write_COM(0x0090); main_Write_DATA(0x0010);
main_Write_COM(0x0092); main_Write_DATA(0x0600);
main_Write_COM(0x0007); main_Write_DATA(0x0133); // 262K color and display ON
}
void Pant(unsigned int color)
{
unsigned int i=320,j=240;
address_set(0,0,239,319);
for(i=0;i<320;i++)
{
for (j=0;j<240;j++)
{
main_Write_DATA(color);
}
}
}
void put_en_string
(
const unsigned char *str, /*字符串*/
unsigned int fcolor, /*文字颜色*/
unsigned int bcolor, /*文字背景色*/
unsigned int x,unsigned int y /*起始坐标*/
)
{
unsigned char dat=0,i=0,j=0,k=0;//更改
while(*str++)
{
address_set(x+8*k,y,x+7+8*k++,y+15);
for(i=0;i<16;i++)
{
dat=pgm_read_byte(&symbol[*(str-1)-32][i]);
for(j=0;j<8;j++)
{
if(dat&0x80)
main_Write_DATA(0x0000);
else
main_Write_DATA(0xFFFF);
dat <<= 1;
}
}
}
}
void put_chs_string
(
const unsigned char source[][32], /*中文数据*/
unsigned int fcolor, /*文字颜色*/
unsigned int bcolor, /*文字背景色*/
unsigned char chslenght, /*中文字符长度,这个可以改进*/
unsigned int x,unsigned int y /*坐标*/
)
{
unsigned int dattmp=0;
unsigned char i=0,j=0,k=0;
while(chslenght--)
{
address_set(x+16*k,y,x+15+16*k++,y+15);
for(i=0;i<32;i+=2)
{
dattmp = pgm_read_byte(&source[k-1][i+1]);
dattmp |= pgm_read_byte(&source[k-1][i])<<8;
for(j=0;j<16;j++)
{
if(dattmp&0x8000)
main_Write_DATA(0x0000);
else
main_Write_DATA(0xFFFF);
dattmp <<= 1;
}
}
}
}
int main(void)
{
main_init(); //tft初始化
Pant(0xffff);
put_en_string("Hello World!",0,300);
while(1);
}
上面是简单的测试驱动程序。具体的由于时间问题还没写完俄罗斯程序呢~~暂时先不放出了。
接下来showshow俄罗斯的界面吧~黑白配!

当然要玩游戏键盘不可少&……可怜的四键。

附件字模工具:字模软件2.2最终版本.rar
OVER!