|
51單片機(jī)+(lm3229液晶屏)T6963C芯片主控 做的推箱子游戲 帶上下左右 選關(guān)和開(kāi)始按鈕.
推箱子游戲的proteus仿真原理圖(附件中可下載工程文件):
0.png (23.39 KB, 下載次數(shù): 61)
下載附件
2017-5-26 01:38 上傳
0.png (28.83 KB, 下載次數(shù): 88)
下載附件
2017-5-26 01:38 上傳
0.png (68.56 KB, 下載次數(shù): 78)
下載附件
2017-5-26 01:37 上傳
(lm3229)T6963C中文資料:
0.png (33.69 KB, 下載次數(shù): 67)
下載附件
2017-5-26 01:41 上傳
(lm3229)T6963C引腳圖:
0.png (116.51 KB, 下載次數(shù): 53)
下載附件
2017-5-26 01:42 上傳
0.png (190.28 KB, 下載次數(shù): 76)
下載附件
2017-5-26 01:42 上傳
目 錄
前 言2
注意事項(xiàng)2
第一章:T6963C一般介紹4
第二章:6963C的引腳說(shuō)明及其功能4
一、 T6963C外形圖4
二、 T6963C引腳說(shuō)明5
第三章:T6963C指令集6
第四章:內(nèi)藏T6963C控制器的液晶顯示器的外特性10
第五章、內(nèi)藏T6963C的液晶顯示模塊與MPU的接口方法12
第六章、T6963C控制器液晶模塊應(yīng)用程序示例16
推箱子游戲的51單片機(jī)源程序如下:
- #include <reg52.h>
- #include <Text1.h> //關(guān)卡的界面
- #include <Text2.h> //在此文件中定義了漢字編碼,用點(diǎn)陣液晶字模提取軟件
- #define uc unsigned char
- #define ui unsigned int
- #define d P0 //數(shù)據(jù)口
- sbit cd=P2^0; //=0,數(shù)據(jù)通道;=1,命令通道
- sbit rd=P2^1; //=0,讀選通有效
- sbit wr=P2^2; //=0,寫(xiě)選通有效
- uc renh=6,renl=4,bu=0,startf=1,guan=1;
- static uc rammap[8][10];
- void lcddatw(uc dat) //寫(xiě)數(shù)據(jù)
- {
- cd=0;
- wr=0;
- d=dat;
- wr=1;
- }
- void lcdcmd0(uc cmd) //寫(xiě)命令
- {
- cd=1;
- wr=0;
- d=cmd;
- wr=1;
- }
- void lcdcmd1(uc dat1,uc cmd) //寫(xiě)帶有一個(gè)參數(shù)的命令
- {
- lcddatw(dat1);
- lcdcmd0(cmd);
- }
- void lcdcmd2(uc dat1,uc dat2,uc cmd) //寫(xiě)帶有兩個(gè)參數(shù)的命令
- {
- lcddatw(dat1);
- lcddatw(dat2);
- lcdcmd0(cmd);
- }
- void lcdinit() //LCD初始化
- {
- lcdcmd2(0x00,0x10,0x40); //設(shè)置文本顯示區(qū)首地址
- lcdcmd2(30,0x00,0x41); //設(shè)置文本顯示區(qū)寬度
- lcdcmd2(0x00,0x00,0x42); //設(shè)置圖形顯示區(qū)首地址
- lcdcmd2(30,0x00,0x43); //設(shè)置圖形顯示區(qū)寬度
- lcdcmd0(0xa2); //設(shè)置光標(biāo)形狀
- lcdcmd0(0x80); //設(shè)置顯示方式,文本圖形“或”
- lcdcmd0(0x9e); //設(shè)置光標(biāo)閃爍,不顯示,文本與圖形顯示
- }
- void dischar(uc row,uc col,uc cha) //寫(xiě)ASCII碼字符,row字符行(=8圖形行),col字符列(=8圖形列),chaASCII碼
- { //顯示ASCII碼時(shí),16行x30列
- ui address;
- uc dat1,dat2;
- address=row*30+col+0x1000; //計(jì)算文本顯示區(qū)地址
- dat1=address;
- dat2=address>>8;
- lcdcmd2(dat1,dat2,0x24);//地址指針定位
- lcdcmd1(cha,0xc4); //寫(xiě)字符,地址指針不變
- }
- //數(shù)字和漢字代碼寫(xiě)入自定義字符存儲(chǔ)區(qū)
- void setcgram(uc count) //count是要寫(xiě)的漢字個(gè)數(shù)
- {//定義自定義字符在GCRAM中存儲(chǔ)區(qū)地址,自定義字符首地址0x80(固定值),一個(gè)字符8x8=8字節(jié),對(duì)應(yīng)字節(jié)地址0x0400
- ui i;
- lcdcmd2(0x03,0x00,0x22); //定義自定義字符(在GCRAM中)存儲(chǔ)區(qū)字節(jié)地址高5位為0x03,
- lcdcmd2(0x00,0x1c,0x24); //0x03<<11+0x0400=0x1c00(字節(jié)地址)
- for(i=0;i<16*8*12/8;i++)
- lcdcmd1(shucode[i],0xc0); //寫(xiě)數(shù)字(每個(gè)16*8)*12(0-9,:)到GCRAM
- for(i=0;i<16*16*count/8;i++)
- lcdcmd1(hancode[i],0xc0); //寫(xiě)漢字(每個(gè)16*16)*count到GCRAM
- }
- //寫(xiě)漢字代碼,row行,col列,sit漢字在自定義字符中的位置,每個(gè)漢字相當(dāng)于4個(gè)字符(2行2列)
- void dishan(uc row,uc col,uc sit)// sit位置用han[]描述
- {
- dischar(row,col,sit);//每個(gè)漢字按左上,左下,右上,右下存放
- dischar(row+1,col,sit+1);
- dischar(row,col+1,sit+2);
- dischar(row+1,col+1,sit+3);
- }
- //寫(xiě)數(shù)字代碼,row行,col列,sit數(shù)字在自定義字符中的位置,每個(gè)數(shù)字相當(dāng)于2個(gè)字符(2行1列)
- void disshu(uc row,uc col,uc sit)// sit位置用shu[]描述
- {
- dischar(row,col,sit);//每個(gè)漢字按左上,左下,右上,右下存放
- dischar(row+1,col,sit+1);
- }
- void bushu() //顯示步數(shù)
- {
- uc b1=0,b2=0,b3=0;
- if(bu>999) {b1=9;b2=9;b3=9;}
- else {b1=bu/100;b2=bu/10;b3=bu%10;}
- disshu(10,23,shu[b1]);disshu(10,24,shu[b2]);disshu(10,25,shu[b3]);
- dishan(10,26,han[6]);
- }
- void huamap() //畫(huà)關(guān)卡地圖
- {
- uc i,j;
- for(i=0;i<8;i++)
- for(j=0;j<10;j++)
- {
- dishan(2*i,2*j,han[map[guan-1][i][j]]);
- rammap[i][j]=map[guan-1][i][j];
- if(rammap[i][j]==0x07) rammap[i][j]=0x00;
- }
- dishan(4,22,han[4]);
- disshu(4,24,shu[0]);
- disshu(4,25,shu[guan]);
- dishan(4,26,han[5]);
- bushu();
- dishan(2*renh,2*renl,han[1]);
- }
- void disxg() //顯示選關(guān)提示
- {
- dishan(0,22,han[8]);
- dishan(0,24,han[9]);
- dishan(0,26,han[5]);
- disshu(0,28,shu[10]);
- }
- void shengli() //過(guò)關(guān)判斷
- {
- uc i,j,s1=0,s2=0;
- for(i=0;i<8;i++)
- for(j=0;j<10;j++)
- {
- if(map[guan-1][i][j]==0x07) //檢視目標(biāo)
- {
- s1++; //目標(biāo)計(jì)數(shù)
- if(rammap[i][j]==0x02) s2++; //目標(biāo)上箱子計(jì)數(shù)
- }
- }
- if(s1==s2) //目標(biāo)計(jì)數(shù)和目標(biāo)上箱子計(jì)數(shù)相同,則過(guò)關(guān)
- {
- dishan(2,20,han[10]); //顯示過(guò)關(guān)提示
- dishan(2,22,han[11]);
- dishan(2,24,han[12]);
- dishan(2,26,han[5]);
- disshu(2,28,shu[11]);
- startf=0; //停止游戲
- disxg(); //顯示選關(guān)提示
- }
- }
- void delay() //延時(shí)
- {
- ui x;
- for(x=0;x<1000;x++);
- }
- uc key() //檢測(cè)按鍵
- {
- uc x,k=0;
- P3=0xff;
- x=P3;
- if(x==0xff) //沒(méi)按鍵跳出
- goto over;
- else
- {
- delay(); //有按鍵,延時(shí)
- P3=0xff;
- x=P3;
- if(x==0xff) //再測(cè)
- goto over;
- else
- {
- switch(x) //獲取鍵值
- {
- case 0xfe:k=1;break;
- case 0xfd:k=2;break;
- case 0xfb:k=3;break;
- case 0xf7:k=4;break;
- case 0xef:k=5;break;
- case 0xdf:k=6;break;
- case 0xbf:k=7;break;
- case 0x7f:k=8;break;
- default:break;
- }
- wait: //等待按鍵釋放
- P3=0xff;
- x=P3;
- if(x==0xff) goto over;
- else goto wait;
- }
- }
- over:
- return k;
- }
- void xuanguan(uc k) //選關(guān)處理
- {
- if((k==1||k==3)&&guan<3) {guan++;renh=6;renl=4;huamap();}
- if((k==2||k==4)&&guan>1) {guan--;renh=6;renl=4;huamap();}
- }
- void huifumubiao() //恢復(fù)目標(biāo)顯示,(被人踩的目標(biāo))
- {
- uc i,j;
- for(i=0;i<8;i++)
- for(j=0;j<10;j++)
- {
- if(map[guan-1][i][j]==0x07&&rammap[i][j]!=0x02) //有目標(biāo)且沒(méi)有箱子
- {
- if(renh!=i||renl!=j) dishan(2*i,2*j,han[7]);
- }
- }
- }
- void game(uc k) //游戲控制
- {
- if(k==1) //向上
- {
- if(rammap[renh-1][renl]==0x00) //上面是空白
- {
- dishan(2*renh,2*renl,han[0]); //人原來(lái)的位置清0
- renh--; //上移一行
- dishan(2*renh,2*renl,han[1]); //人新位置顯示
- bu++; //步數(shù)加1
- }
- else if((rammap[renh-1][renl]==0x02)&&(rammap[renh-2][renl]==0x00)) //上面是箱子,箱子上是空格
- {
- dishan(2*renh,2*renl,han[0]);dishan(2*(renh-1),2*renl,han[0]);
- renh--;
- dishan(2*renh,2*renl,han[1]);dishan(2*(renh-1),2*renl,han[2]);
- rammap[renh][renl]=0x00;rammap[renh-1][renl]=0x02;
- bu++;
- }
- }
- if(k==4)
- {
- if(rammap[renh+1][renl]==0x00)
- {
- dishan(2*renh,2*renl,han[0]);
- renh++;
- dishan(2*renh,2*renl,han[1]);
- bu++;
- }
- else if((rammap[renh+1][renl]==0x02)&&(rammap[renh+2][renl]==0x00))
- {
- dishan(2*renh,2*renl,han[0]);dishan(2*(renh+1),2*renl,han[0]);
- renh++;
- dishan(2*renh,2*renl,han[1]);dishan(2*(renh+1),2*renl,han[2]);
- rammap[renh][renl]=0x00;rammap[renh+1][renl]=0x02;
- bu++;
- }
- }
- if(k==2)
- {
- if(rammap[renh][renl-1]==0x00)
- {
- dishan(2*renh,2*renl,han[0]);
- renl--;
- dishan(2*renh,2*renl,han[1]);
- bu++;
- }
- else if((rammap[renh][renl-1]==0x02)&&(rammap[renh][renl-2]==0x00))
- {
- dishan(2*renh,2*renl,han[0]);dishan(2*renh,2*(renl-1),han[0]);
- renl--;
- dishan(2*renh,2*renl,han[1]);dishan(2*renh,2*(renl-1),han[2]);
- rammap[renh][renl]=0x00;rammap[renh][renl-1]=0x02;
- bu++;
- }
- }
- if(k==3)
- {
- if(rammap[renh][renl+1]==0x00)
- {
- dishan(2*renh,2*renl,han[0]);
- renl++;
- dishan(2*renh,2*renl,han[1]);
- bu++;
- }
- else if((rammap[renh][renl+1]==0x02)&&(rammap[renh][renl+2]==0x00))
- {
- dishan(2*renh,2*renl,han[0]);dishan(2*renh,2*(renl+1),han[0]);
- renl++;
- dishan(2*renh,2*renl,han[1]);dishan(2*renh,2*(renl+1),han[2]);
- rammap[renh][renl]=0x00;rammap[renh][renl+1]=0x02;
- bu++;
- }
- }
- huifumubiao();
- bushu();
- shengli();
- }
- void clear() //清屏
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
推箱子LM3229.rar
(309.46 KB, 下載次數(shù): 180)
2017-5-25 19:31 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|