51單片機(jī)游戲(推箱子)
一、電路設(shè)計
此電路由AT89C51最小系統(tǒng)、LCD12864顯示模塊、74LS08芯片和四個獨(dú)立按鍵組成。
LCD12864顯示模塊
帶中文字庫的128X64 是一種具有4 位/8 位并行、2 線或3 線串行多種接口方式,內(nèi)部含有國標(biāo)一級、二級簡體
中文字庫的點陣圖形液晶顯示模塊;其顯示分辨率為128×64, 內(nèi)置8192 個16 16 點漢字,和128 個16 8 點ASCII 字符
集.利用該模塊靈活的接口方式和簡單、方便的操作指令,可構(gòu)成全中文人機(jī)交互圖形界面。可以顯示8×4 行16×16 點 陣的漢字.
也可完成圖形顯示.低電壓低功耗是其又一顯著特點。由該模塊構(gòu)成的液晶顯示方案與同類型的圖形點陣液晶
顯示模塊相比,不論硬件電路結(jié)構(gòu)或顯示程序都要簡潔得多,且該模塊的價格也略低于相同點陣的圖形液晶模塊。
== 控制器接口信號說明 ==
1、RS,R/W的配合選擇決定控制界面的4種模式:
2、E信號
●忙標(biāo)志:BFBF標(biāo)志提供內(nèi)部工作情況.BF=1表示模塊在進(jìn)行內(nèi)部操作,此時模塊不接受外部指令和數(shù)據(jù).BF=0時,模塊為準(zhǔn)備狀態(tài),隨時可接受外部指令和數(shù)據(jù)。利用STATUSRD指令,可以將BF讀到DB7總線,從而檢驗?zāi)K之工作狀態(tài)。
●字型產(chǎn)生ROM(CGROM)字型產(chǎn)生ROM(CGROM)提供8192個此觸發(fā)器是用于模塊屏幕顯示開和關(guān)的控制。DFF=1為開顯示(DISPLAYON),DDRAM的內(nèi)容就顯示在屏幕上,DFF=0為關(guān)顯示(DISPLAYOFF)。DFF的狀態(tài)是指令DISPLAYON/OFF和RST信號控制的。
●顯示數(shù)據(jù)RAM(DDRAM)模塊內(nèi)部顯示數(shù)據(jù)RAM提供64×2個位元組的空間,最多可控制4行16字(64個字)的中文字型顯示,當(dāng)寫入顯示數(shù)據(jù)RAM時,可分別顯示CGROM與CGRAM的字型;此模塊可顯示三種字型,分別是半角英數(shù)字型(16*8)、CGRAM字型及CGROM的中文字型,三種字型的選擇,由在DDRAM中寫入的編碼選擇,在0000H—0006H的編碼中(其代碼分別是0000、0002、0004、0006共4個)將選擇CGRAM的自定義字型,02H—7FH的編碼中將選擇半角英數(shù)字的字型,至于A1以上的編碼將自動的結(jié)合下一個位元組,組成兩個位元組的編碼形成中文字型的編碼BIG5(A140—D75F),GB(A1A0-F7FFH)。
●字型產(chǎn)生RAM(CGRAM)字型產(chǎn)生RAM提供圖象定義(造字)功能,可以提供四組16×16點的自定義圖象空間,使用者可以將內(nèi)部字型沒有提供的圖象字型自行定義到CGRAM中,便可和CGROM中的定義一樣地通過DDRAM顯示在屏幕中。
●地址計數(shù)器AC地址計數(shù)器是用來貯存DDRAM/CGRAM之一的地址,它可由設(shè)定指令暫存器來改變,之后只要讀取或是寫入DDRAM/CGRAM的值時,地址計數(shù)器的值就會自動加一,當(dāng)RS為“0”時而R/W為“1”時,地址計數(shù)器的值會被讀取到DB6——DB0中。
光標(biāo)/閃爍控制電路
此模塊提供硬體光標(biāo)及閃爍控制電路,由地址計數(shù)器的值來指定DDRAM中的光標(biāo)或閃爍位置。
lcd12864指令說明
備注:當(dāng)IC1在接受指令前,微處理器必須先確認(rèn)其內(nèi)部處于非忙碌狀態(tài),即讀取BF標(biāo)志時,BF需為零,方可接受新的指令;如果在送出一個指令前并不檢查BF標(biāo)志,那么在前一個指令和這個指令中間必須延長一段較長的時間,即是等待前一個指令確實執(zhí)行完成。
74LS08芯片
詳細(xì)地說是4二輸入與門,即一片74LS08芯片內(nèi)有共四路二個輸入端的與門。內(nèi)部線路如下圖:
二、運(yùn)行效果
三、部分代碼
?文章來源:http://www.zghlxwxcb.cn/news/detail-831921.html
#include
#include "data.h"
#include "order.h"
#include "lcdinit.c"
#include "function.c"
void int1(void) interrupt 2
{
keyboard();
}
int main(){
uchar i=1;
error0=0;
error1=0;
error2=0;
delay(50);
EA=1;
IT1=1;
EX1=1;
lcd_init(0x00,0x00,0x14,0x50,0x01,0x14,0x00,MOD_XOR,0x0c);
set_cgram();
wirte_cgrom();
cls();
start();
cls();
pushbox();
guan();
while(1){
}
return(0);
}
void keyboard(){
switch(P1&0x1f){
case 0x1e: /*上 cury > 0 && */
if(level_temp[curx][cury-1]==0||level_temp[curx][cury-1]==4){
if(level[g][cury][curx]==4||level[g][cury][curx]==5){
level_temp[curx][cury]=4;
printc(curx,cury,4);
}
else{
level_temp[curx][cury]=0;
printc(curx,cury,0);
}
cury=cury-1;
level_temp[curx][cury]=1;
printc(curx,cury,1);
}
else if(level_temp[curx][cury-1]==3){
if(level_temp[curx][cury-2]==0){
if(level[g][cury][curx]==4||level[g][cury][curx]==5){
level_temp[curx][cury]=4;
printc(curx,cury,4);
}
else{
level_temp[curx][cury]=0;
printc(curx,cury,0);
}
cury=cury-1;
level_temp[curx][cury]=1;
printc(curx,cury,1);
level_temp[curx][cury-1]=3;
printc(curx,cury-1,3);
}
else if(level_temp[curx][cury-2]==4){
if(level[g][cury][curx]==4||level[g][cury][curx]==5){
level_temp[curx][cury]=4;
printc(curx,cury,4);
}
else{
level_temp[curx][cury]=0;
printc(curx,cury,0);
}
cury=cury-1;
level_temp[curx][cury]=1;
printc(curx,cury,1);
level_temp[curx][cury-1]=5;
printc(curx,cury-1,5);
pass();
}
}
else if(level_temp[curx][cury-1]==5){
if(level_temp[curx][cury-2]==0){
if(level[g][cury][curx]==4||level[g][cury][curx]==5){
level_temp[curx][cury]=4;
printc(curx,cury,4);
}
else{
level_temp[curx][cury]=0;
printc(curx,cury,0);
}
cury=cury-1;
level_temp[curx][cury]=1;
printc(curx,cury,1);
level_temp[curx][cury-1]=3;
printc(curx,cury-1,3);
}
else if(level_temp[curx][cury-2]==4){
if(level[g][cury][curx]==4||level[g][cury][curx]==5){
level_temp[curx][cury]=4;
printc(curx,cury,4);
}
else{
level_temp[curx][cury]=0;
printc(curx,cury,0);
}
cury=cury-1;
level_temp[curx][cury]=1;
printc(curx,cury,1);
level_temp[curx][cury-1]=5;
printc(curx,cury-1,5);
pass();
}
pass();
}
while((P1&0x01)==0);
break;
case 0x1d: /*下 cury < 7 && */
if(level_temp[curx][cury+1]==0||level_temp[curx][cury+1]==4){
if(level[g][cury][curx]==4||level[g][cury][curx]==5){
level_temp[curx][cury]=4;
printc(curx,cury,4);
}
else{
level_temp[curx][cury]=0;
printc(curx,cury,0);
}
cury=cury+1;
level_temp[curx][cury]=1;
printc(curx,cury,1);
}
else if(level_temp[curx][cury+1]==3){
if(level_temp[curx][cury+2]==0){
if(level[g][cury][curx]==4||level[g][cury][curx]==5){
level_temp[curx][cury]=4;
printc(curx,cury,4);
}
else{
level_temp[curx][cury]=0;
printc(curx,cury,0);
}
cury=cury+1;
level_temp[curx][cury]=1;
printc(curx,cury,1);
level_temp[curx][cury+1]=3;
printc(curx,cury+1,3);
}
else if(level_temp[curx][cury+2]==4){
if(level[g][cury][curx]==4||level[g][cury][curx]==5){
level_temp[curx][cury]=4;
printc(curx,cury,4);
}
else{
level_temp[curx][cury]=0;
printc(curx,cury,0);
}
cury=cury+1;
level_temp[curx][cury]=1;
printc(curx,cury,1);
level_temp[curx][cury+1]=5;
printc(curx,cury+1,5);
pass();
}
}
else if(level_temp[curx][cury+1]==5){
if(level_temp[curx][cury+2]==0){
if(level[g][cury][curx]==4||level[g][cury][curx]==5){
level_temp[curx][cury]=4;
printc(curx,cury,4);
}
else{
level_temp[curx][cury]=0;
printc(curx,cury,0);
}
cury=cury+1;
level_temp[curx][cury]=1;
printc(curx,cury,1);
level_temp[curx][cury+1]=3;
printc(curx,cury+1,3);
}
else if(level_temp[curx][cury+2]==4){
if(level[g][cury][curx]==4||level[g][cury][curx]==5){
level_temp[curx][cury]=4;
printc(curx,cury,4);
}
else{
level_temp[curx][cury]=0;
printc(curx,cury,0);
}
cury=cury+1;
level_temp[curx][cury]=1;
printc(curx,cury,1);
level_temp[curx][cury+1]=5;
printc(curx,cury+1,5);
pass();
}
pass();
}
while((P1&0x02)==0);
break;
case 0x1b: /*左 curx > 0 && */
if(level_temp[curx-1][cury]==0||level_temp[curx-1][cury]==4){
if(level[g][cury][curx]==4||level[g][cury][curx]==5){
level_temp[curx][cury]=4;
printc(curx,cury,4);
}
else{
level_temp[curx][cury]=0;
printc(curx,cury,0);
}
curx=curx-1;
level_temp[curx][cury]=1;
printc(curx,cury,1);
}
else if(level_temp[curx-1][cury]==3){
if(level_temp[curx-2][cury]==0){
if(level[g][cury][curx]==4||level[g][cury][curx]==5){
level_temp[curx][cury]=4;
printc(curx,cury,4);
}
else{
level_temp[curx][cury]=0;
printc(curx,cury,0);
}
curx=curx-1;
level_temp[curx][cury]=1;
printc(curx,cury,1);
level_temp[curx-1][cury]=3;
printc(curx-1,cury,3);
}
else if(level_temp[curx-2][cury]==4){
if(level[g][cury][curx]==4||level[g][cury][curx]==5){
level_temp[curx][cury]=4;
printc(curx,cury,4);
}
else{
level_temp[curx][cury]=0;
printc(curx,cury,0);
}
curx=curx-1;
level_temp[curx][cury]=1;
printc(curx,cury,1);
level_temp[curx-1][cury]=5;
printc(curx-1,cury,5);
pass();
}
}
else if(level_temp[curx-1][cury]==5){
if(level_temp[curx-2][cury]==0){
if(level[g][cury][curx]==4||level[g][cury][curx]==5){
level_temp[curx][cury]=4;
printc(curx,cury,4);
}
else{
level_temp[curx][cury]=0;
printc(curx,cury,0);
}
curx=curx-1;
level_temp[curx][cury]=1;
printc(curx,cury,1);
level_temp[curx-1][cury]=3;
printc(curx-1,cury,3);
}
else if(level_temp[curx-2][cury]==4){
if(level[g][cury][curx]==4||level[g][cury][curx]==5){
level_temp[curx][cury]=4;
printc(curx,cury,4);
}
else{
level_temp[curx][cury]=0;
printc(curx,cury,0);
}
curx=curx-1;
level_temp[curx][cury]=1;
printc(curx,cury,1);
level_temp[curx-1][cury]=5;
printc(curx-1,cury,5);
pass();
}
pass();
}
while((P1&0x04)==0);
break;
case 0x17: /*右 curx < 9 && */
if(level_temp[curx+1][cury]==0||level_temp[curx+1][cury]==4){
if(level[g][cury][curx]==4||level[g][cury][curx]==5){
level_temp[curx][cury]=4;
printc(curx,cury,4);
}
else{
level_temp[curx][cury]=0;
printc(curx,cury,0);
}
curx=curx+1;
level_temp[curx][cury]=1;
printc(curx,cury,1);
}
else if(level_temp[curx+1][cury]==3){
if(level_temp[curx+2][cury]==0){
if(level[g][cury][curx]==4||level[g][cury][curx]==5){
level_temp[curx][cury]=4;
printc(curx,cury,4);
}
else{
level_temp[curx][cury]=0;
printc(curx,cury,0);
}
curx=curx+1;
level_temp[curx][cury]=1;
printc(curx,cury,1);
level_temp[curx+1][cury]=3;
printc(curx+1,cury,3);
}
else if(level_temp[curx+2][cury]==4){
if(level[g][cury][curx]==4||level[g][cury][curx]==5){
level_temp[curx][cury]=4;
printc(curx,cury,4);
}
else{
level_temp[curx][cury]=0;
printc(curx,cury,0);
}
curx=curx+1;
level_temp[curx][cury]=1;
printc(curx,cury,1);
level_temp[curx+1][cury]=5;
printc(curx+1,cury,5);
pass();
}
}
else if(level_temp[curx+1][cury]==5){
if(level_temp[curx+2][cury]==0){
if(level[g][cury][curx]==4||level[g][cury][curx]==5){
level_temp[curx][cury]=4;
printc(curx,cury,4);
}
else{
level_temp[curx][cury]=0;
printc(curx,cury,0);
}
curx=curx+1;
level_temp[curx][cury]=1;
printc(curx,cury,1);
level_temp[curx+1][cury]=3;
printc(curx+1,cury,3);
}
else if(level_temp[curx+2][cury]==4){
if(level[g][cury][curx]==4||level[g][cury][curx]==5){
level_temp[curx][cury]=4;
printc(curx,cury,4);
}
else{
level_temp[curx][cury]=0;
printc(curx,cury,0);
}
curx=curx+1;
level_temp[curx][cury]=1;
printc(curx,cury,1);
level_temp[curx+1][cury]=5;
printc(curx+1,cury,5);
pass();
}
pass();
}
while((P1&0x08)==0);
break;
case 0x0f: /*確定*/
break;
}
}
項目獲取:
https://gitee.com/feifei1122/simulation-project文章來源地址http://www.zghlxwxcb.cn/news/detail-831921.html
到了這里,關(guān)于畢業(yè)設(shè)計 單片機(jī)推箱子游戲(AT89C51)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!