久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4130|回復: 5
收起左側

基于LCD12864和51單片機的簡單小游戲Proteus仿真程序

[復制鏈接]
ID:658359 發表于 2019-12-26 10:50 | 顯示全部樓層 |閱讀模式
        lcd12864作為顯示屏,實現一個按鈕控制的簡單小游戲。主要工作集中于游戲的圖形化以及相關邏輯的實現。人物場景設計通過字模提取軟件轉換成為段碼預先儲存在單片機中,動畫的實現采取局部刷新的方式以提高顯示的速度。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png


0.jpg

單片機源程序如下:
  1. #include <reg51.h>

  2. #define LCDLCDDisp_Off   0x3e
  3. #define LCDLCDDisp_On    0x3f
  4. #define Page_Add     0xb8//ye

  5. #define LCDCol_Add     0x40//lie
  6. #define Start_Line     0xC0//hang
  7. /*****液晶顯示器的端口定義*****/
  8. #define data_ora P1 /*液晶數據總線*/
  9. sbit LCDMcs=P2^4 ;    /*片選1*/
  10. sbit LCDScs=P2^3 ;    /*片選2*/
  11. sbit LCDDi=P2^2 ;     /*數據/指令 選擇*/
  12. sbit LCDRW=P2^1 ;     /*讀/寫 選擇*/
  13. sbit LCDEnable=P2^0 ;     /*讀/寫 使能*/
  14. unsigned char flag;//flag=0,死亡,flag=1,閃避成功
  15. unsigned char code Ph[] =                  
  16. {
  17. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  18. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  19. 0x00,0x00,0x04,0x74,0x44,0x5C,0xC0,0x00,0x00,0x00,0x00,0x00,0xE0,0x10,0x48,0xA4,

  20. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00


  21. };
  22.         
  23. void LCDdelay(unsigned int t)
  24. {
  25.         unsigned int i,j;
  26.         for(i=0;i<t;i++);
  27.         for(j=0;j<10;j++);
  28. }
  29. void CheckState()               
  30. {
  31.    unsigned char dat,DATA;//狀態信息(判斷是否忙)
  32.    LCDDi=0; // 數據\指令選擇,D/I(RS)="L" ,表示 DB7∽DB0 為顯示指令數據
  33.    LCDRW=1; //R/W="H" ,E="H"數據被讀到DB7∽DB0
  34.    do
  35.    {
  36.       DATA=0x00;
  37.       LCDEnable=1;        //EN下降源
  38.           LCDdelay(2);//延時
  39.           dat=DATA;
  40.       LCDEnable=0;
  41.       dat=0x80 & dat; //僅當第7位為0時才可操作(判別busy信號)
  42.     }
  43.     while(!(dat==0x00));
  44. }
  45. void write_com(unsigned char cmdcode)
  46. {
  47.     CheckState();//檢測LCD是否忙
  48.         LCDDi=0;
  49.         LCDRW=0;
  50.         P1=cmdcode;               
  51.         LCDdelay(2);
  52.         LCDEnable=1;
  53.         LCDdelay(2);
  54.         LCDEnable=0;
  55. }
  56. void init_lcd()
  57. {
  58.         LCDdelay(100);        
  59.         LCDMcs=1;//剛開始關閉兩屏
  60.         LCDScs=1;
  61.         LCDdelay(100);
  62.         write_com(LCDLCDDisp_Off);         //寫初始化命令
  63.         write_com(Page_Add+0);
  64.         write_com(Start_Line+0);
  65.         write_com(LCDCol_Add+0);
  66.         write_com(LCDLCDDisp_On);
  67. }        
  68. void write_data(unsigned char LCDDispdata)
  69. {
  70.     CheckState();//檢測LCD是否忙
  71.         LCDDi=1;
  72.         LCDRW=0;
  73.         P1=LCDDispdata;
  74.         LCDdelay(2);
  75.         LCDEnable=1;
  76.         LCDdelay(2);
  77.         LCDEnable=0;
  78. }
  79. //清屏函數
  80. void Clr_Scr()
  81. {
  82.         unsigned char j,k;
  83.         LCDMcs=0; //左、右屏均開顯示
  84.         LCDScs=0;
  85.          write_com(Page_Add+0);
  86.          write_com(LCDCol_Add+0);
  87.          for(k=0;k<8;k++)
  88.          {
  89.                 write_com(Page_Add+k);
  90.                   for(j=0;j<64;j++)  
  91.                 {
  92.                       write_com(LCDCol_Add+j);
  93.                         write_data(0x00);
  94.                 }
  95.         }
  96. }        
  97. //顯示函數
  98. void Display(unsigned char page,unsigned char column,unsigned char code *Bmp,unsigned char j,unsigned char i,
  99. unsigned char jm,unsigned char im,unsigned char dw)
  100. {
  101.         unsigned char j1,i1;
  102.         for(j1=j;j1<jm;j1++)
  103.         {
  104.                 write_com(Page_Add+page+j1);
  105.                 write_com(LCDCol_Add+column);
  106.                 for(i1=i;i1<im;i1++)
  107.                         write_data(Bmp[dw*j1+i1]);
  108.         }
  109. }
  110. /*******************局部擦除*************************/
  111. void ClearL(unsigned char page,unsigned char column)
  112. {
  113.         unsigned char j=0,i=0;
  114.         for(j=0;j<4;j++)
  115.         {
  116.                 write_com(Page_Add+page+j);
  117.                 write_com(LCDCol_Add+column);
  118.                 for(i=0;i<64;i++)
  119.                         write_data(0x00);
  120.         }
  121. }
  122. void Clear_Crash(unsigned char page,unsigned char column)
  123. {
  124.         unsigned char j=0,i=0;
  125.         for(j=0;j<2;j++)
  126.         {
  127.                 write_com(Page_Add+page+j);
  128.                 write_com(LCDCol_Add+column);
  129.                 for(i=0;i<16;i++)
  130.                         write_data(0x00);
  131.         }
  132. }
  133. /***********************************/


  134. //碰撞函數
  135. void Crash()
  136. {
  137.         char i;
  138.         LCDMcs=1; //右屏開顯示
  139.     LCDScs=0;
  140.         for(i=48;i>=0;i=i-16)
  141.         {
  142.                 Display(6,i,Ph1,0,0,2,16,16);         //Bmp_Right_Disp(6,i,Ph1);
  143.                 LCDdelay(360000);
  144.                 Clear_Crash(6,i);
  145.                 if(i<=16)
  146.                 {
  147.                         EA=1; //總中斷允許
  148.                         EX0=1;//外部中斷0允許
  149.                         IT1=1;//外部中斷0為下降沿觸發
  150.                 }
  151.         }
  152. }
  153. //成功躲閃函數
  154. void Miss()
  155. {
  156.         char i,j,k;
  157.         LCDMcs=0; //左屏開顯示
  158.         LCDScs=1;
  159.         for(i=3,j=48,k=0;i>=0,j>=0;k++,j=j-16)
  160.         {
  161.                 Display(i,0,Ph,0,0,4,64,64);//Bmp_Left_Disp(i,0,Ph);
  162.                 Display(6,j,Ph1,0,0,2,16,16);//Bmp_Right_Disp(6,j,Ph1);
  163.                 LCDdelay(360000);
  164.                 ClearL(i,0);
  165.                 Clear_Crash(6,j);
  166.                 if(k<2)
  167.                         i--;
  168.                 else
  169.                         i=i+2;
  170.         }               
  171. }
  172. //死亡函數
  173. void Died()
  174. {
  175.         LCDMcs=0; //左屏開顯示
  176.         LCDScs=1;
  177.     Display(0,0,Ph2,0,0,8,64,128);//Died_DispL(0,0,Ph2);
  178.         
  179.     LCDMcs=1; //右屏開顯示
  180.     LCDScs=0;
  181.         Display(0,0,Ph2,0,64,8,128,128);//Died_DispR(0,0,Ph2);

  182.         LCDdelay(100000000);

  183. }
  184. //總體過程函數
  185. void Whole()
  186. {
  187.         LCDMcs=0; //左屏開顯示
  188.         LCDScs=1;
  189.     Display(4,0,Ph,0,0,4,64,64);
  190.         
  191.     LCDMcs=1; //右屏開顯示
  192.     LCDScs=0;
  193.         Display(6,48,Ph1,0,0,2,16,16);

  194.         flag=0;
  195.         Crash();
  196.         if(flag==1)
  197.                 Miss();
  198.         else
  199.             Died();
  200.         
  201. }
  202. //按鍵服務函數
  203. void PressButton() interrupt 0
  204. {
  205.         flag=1;
  206. }

  207. void main()
  208. {
  209.         init_lcd();
  210.         

  211.         while(1)
  212.         {
  213.                 Clr_Scr();
  214.                 Whole();
  215.         }

  216. }
復制代碼

所有資料51hei提供下載:
基于12864和51的小游戲.rar (69.49 KB, 下載次數: 80)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:102963 發表于 2020-2-14 22:03 | 顯示全部樓層
樓主,
這個馬小白小人圖像怎么做的呢?
回復

使用道具 舉報

ID:658359 發表于 2020-2-20 10:54 | 顯示全部樓層
songxia8013 發表于 2020-2-14 22:03
樓主,
這個馬小白小人圖像怎么做的呢?

自己先繪圖,然后用字模軟件提取成數據矩陣
回復

使用道具 舉報

ID:709456 發表于 2020-3-19 08:30 | 顯示全部樓層
LCD1602可以嗎?換1602程序是不是也得改?
回復

使用道具 舉報

ID:740717 發表于 2020-5-11 15:31 | 顯示全部樓層
壓縮包打不開了,嗚嗚
回復

使用道具 舉報

ID:749570 發表于 2020-5-12 01:08 | 顯示全部樓層
嘿嘿非常需要啊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品电影网 | 精品在线 | 欧美久久一级特黄毛片 | 国产成人综合亚洲欧美94在线 | 伊人伊人伊人 | 成人欧美一区二区三区黑人孕妇 | 亚洲成人一区二区三区 | 精品久久久网站 | 免费一区二区 | 久久三级影院 | 国产一区久久 | 欧美日韩在线一区二区 | 国产色在线 | 91天堂网 | 能免费看的av | 精品在线一区二区 | 99爱国产 | 成人三级网址 | 99re视频在线 | 日韩欧美1区2区 | 男女污污动态图 | 一级黄片一级毛片 | 在线国产一区 | 日韩精品久久久久 | 国产欧美精品 | 日韩欧美国产一区二区 | 国产偷录视频叫床高潮对白 | 欧美簧片| 欧美一区二区三区在线观看视频 | 欧美xxxⅹ性欧美大片 | 国产精品久久久久久久免费大片 | 亚洲人的av| 网站黄色在线免费观看 | 日韩综合一区 | 中文字幕国产一区 | 日韩免费看片 | 三级成人在线 | 成人久久18免费网站图片 | 日本三级在线 | 久久久久国产 | 亚洲狠狠爱 |