疯狂单片机

一个普普通通的单片机、嵌入式学习个人博客站

基于AVR单片机和TFT的山寨俄罗斯方块

        单片机写个游戏只是突然的自我(想法)~

液晶是网上买来的,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!

« 上一篇 | 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Arwen Build 90619 and Theme By BokeZhuti.cn

Copyright 2009-2010 www.mculover.com All Rights Reserved. 京ICP备09098861号
站长:莫旭冬 联系邮箱:moxudong@yeah.net