以lcd12864作為顯示屏,實現一個按鈕控制的簡單小游戲。主要工作集中于游戲的圖形化以及相關邏輯的實現。人物場景設計通過字模提取軟件轉換成為段碼預先儲存在單片機中,動畫的實現采取局部刷新的方式以提高顯示的速度。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #include <reg51.h>
- #define LCDLCDDisp_Off 0x3e
- #define LCDLCDDisp_On 0x3f
- #define Page_Add 0xb8//ye
- #define LCDCol_Add 0x40//lie
- #define Start_Line 0xC0//hang
- /*****液晶顯示器的端口定義*****/
- #define data_ora P1 /*液晶數據總線*/
- sbit LCDMcs=P2^4 ; /*片選1*/
- sbit LCDScs=P2^3 ; /*片選2*/
- sbit LCDDi=P2^2 ; /*數據/指令 選擇*/
- sbit LCDRW=P2^1 ; /*讀/寫 選擇*/
- sbit LCDEnable=P2^0 ; /*讀/寫 使能*/
- unsigned char flag;//flag=0,死亡,flag=1,閃避成功
- unsigned char code Ph[] =
- {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x04,0x74,0x44,0x5C,0xC0,0x00,0x00,0x00,0x00,0x00,0xE0,0x10,0x48,0xA4,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- };
-
- void LCDdelay(unsigned int t)
- {
- unsigned int i,j;
- for(i=0;i<t;i++);
- for(j=0;j<10;j++);
- }
- void CheckState()
- {
- unsigned char dat,DATA;//狀態信息(判斷是否忙)
- LCDDi=0; // 數據\指令選擇,D/I(RS)="L" ,表示 DB7∽DB0 為顯示指令數據
- LCDRW=1; //R/W="H" ,E="H"數據被讀到DB7∽DB0
- do
- {
- DATA=0x00;
- LCDEnable=1; //EN下降源
- LCDdelay(2);//延時
- dat=DATA;
- LCDEnable=0;
- dat=0x80 & dat; //僅當第7位為0時才可操作(判別busy信號)
- }
- while(!(dat==0x00));
- }
- void write_com(unsigned char cmdcode)
- {
- CheckState();//檢測LCD是否忙
- LCDDi=0;
- LCDRW=0;
- P1=cmdcode;
- LCDdelay(2);
- LCDEnable=1;
- LCDdelay(2);
- LCDEnable=0;
- }
- void init_lcd()
- {
- LCDdelay(100);
- LCDMcs=1;//剛開始關閉兩屏
- LCDScs=1;
- LCDdelay(100);
- write_com(LCDLCDDisp_Off); //寫初始化命令
- write_com(Page_Add+0);
- write_com(Start_Line+0);
- write_com(LCDCol_Add+0);
- write_com(LCDLCDDisp_On);
- }
- void write_data(unsigned char LCDDispdata)
- {
- CheckState();//檢測LCD是否忙
- LCDDi=1;
- LCDRW=0;
- P1=LCDDispdata;
- LCDdelay(2);
- LCDEnable=1;
- LCDdelay(2);
- LCDEnable=0;
- }
- //清屏函數
- void Clr_Scr()
- {
- unsigned char j,k;
- LCDMcs=0; //左、右屏均開顯示
- LCDScs=0;
- write_com(Page_Add+0);
- write_com(LCDCol_Add+0);
- for(k=0;k<8;k++)
- {
- write_com(Page_Add+k);
- for(j=0;j<64;j++)
- {
- write_com(LCDCol_Add+j);
- write_data(0x00);
- }
- }
- }
- //顯示函數
- void Display(unsigned char page,unsigned char column,unsigned char code *Bmp,unsigned char j,unsigned char i,
- unsigned char jm,unsigned char im,unsigned char dw)
- {
- unsigned char j1,i1;
- for(j1=j;j1<jm;j1++)
- {
- write_com(Page_Add+page+j1);
- write_com(LCDCol_Add+column);
- for(i1=i;i1<im;i1++)
- write_data(Bmp[dw*j1+i1]);
- }
- }
- /*******************局部擦除*************************/
- void ClearL(unsigned char page,unsigned char column)
- {
- unsigned char j=0,i=0;
- for(j=0;j<4;j++)
- {
- write_com(Page_Add+page+j);
- write_com(LCDCol_Add+column);
- for(i=0;i<64;i++)
- write_data(0x00);
- }
- }
- void Clear_Crash(unsigned char page,unsigned char column)
- {
- unsigned char j=0,i=0;
- for(j=0;j<2;j++)
- {
- write_com(Page_Add+page+j);
- write_com(LCDCol_Add+column);
- for(i=0;i<16;i++)
- write_data(0x00);
- }
- }
- /***********************************/
- //碰撞函數
- void Crash()
- {
- char i;
- LCDMcs=1; //右屏開顯示
- LCDScs=0;
- for(i=48;i>=0;i=i-16)
- {
- Display(6,i,Ph1,0,0,2,16,16); //Bmp_Right_Disp(6,i,Ph1);
- LCDdelay(360000);
- Clear_Crash(6,i);
- if(i<=16)
- {
- EA=1; //總中斷允許
- EX0=1;//外部中斷0允許
- IT1=1;//外部中斷0為下降沿觸發
- }
- }
- }
- //成功躲閃函數
- void Miss()
- {
- char i,j,k;
- LCDMcs=0; //左屏開顯示
- LCDScs=1;
- for(i=3,j=48,k=0;i>=0,j>=0;k++,j=j-16)
- {
- Display(i,0,Ph,0,0,4,64,64);//Bmp_Left_Disp(i,0,Ph);
- Display(6,j,Ph1,0,0,2,16,16);//Bmp_Right_Disp(6,j,Ph1);
- LCDdelay(360000);
- ClearL(i,0);
- Clear_Crash(6,j);
- if(k<2)
- i--;
- else
- i=i+2;
- }
- }
- //死亡函數
- void Died()
- {
- LCDMcs=0; //左屏開顯示
- LCDScs=1;
- Display(0,0,Ph2,0,0,8,64,128);//Died_DispL(0,0,Ph2);
-
- LCDMcs=1; //右屏開顯示
- LCDScs=0;
- Display(0,0,Ph2,0,64,8,128,128);//Died_DispR(0,0,Ph2);
- LCDdelay(100000000);
- }
- //總體過程函數
- void Whole()
- {
- LCDMcs=0; //左屏開顯示
- LCDScs=1;
- Display(4,0,Ph,0,0,4,64,64);
-
- LCDMcs=1; //右屏開顯示
- LCDScs=0;
- Display(6,48,Ph1,0,0,2,16,16);
- flag=0;
- Crash();
- if(flag==1)
- Miss();
- else
- Died();
-
- }
- //按鍵服務函數
- void PressButton() interrupt 0
- {
- flag=1;
- }
- void main()
- {
- init_lcd();
-
- while(1)
- {
- Clr_Scr();
- Whole();
- }
- }
復制代碼
所有資料51hei提供下載:
基于12864和51的小游戲.rar
(69.49 KB, 下載次數: 80)
2019-12-26 10:49 上傳
點擊文件名下載附件
源工程
|