单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 555|回复: 12
收起左侧

LCD12864设计俄罗斯方块Proteus仿真+单片机代码

  [复制链接]
shuisheng 发表于 2019-1-22 05:20 | 显示全部楼层 |阅读模式

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
kl.jpg

0.png

单片机源程序:

#include <AT89X51.H>
#define uchar unsigned char
#define uint  unsigned int
#define key1  30
#define key2  20
#define key3  16
#define key4  3
#define key5  50

sbit EN  = P2^0;
sbit RW  = P2^1;
sbit RS  = P2^2;
sbit CS1 = P2^3;
sbit CS2 = P2^4;

sbit SW1 = P3^5;
sbit SW2 = P3^6;
sbit SW3 = P3^7;
sbit SW4 = P3^0;

uchar aa=0xff, bb=0, cc=0,  dd=0,  ee=0;
uchar miao=0,fen=0;
uchar downok;

bit flag1,flag2,flag3;
uchar dat datmap[key2][2];

typedef struct
{
        uchar code * box;
        uchar cube : 4;
        uchar sdat : 4;
        char row;
        char column;
} block;

block this;
uint  score=0;
uchar SOUDU=1;
uchar code bittable[8]={1,2,4,8,0x10,0x20,0x40,0x80};

void cmd(uchar cmd)
{
        bit ea;
        ea=EA;
        EA=0;
        EN=0;
        RW=0;
        RS=0;
        P1=cmd;
        EN=1;
        EN=1;
        EN=0;
        EA=ea;
}

void wrubt(uchar ch)
{
        EN=0;
        RS=1;
        RW=0;
        P1=ch;
        EN=1;
        EN=1;
        EN=0;
}

void lcdSetPage(uchar page)
{
        page &=0x7;
        page +=0xb8;
        cmd(page);
}

void lcdSetColumn(uchar column)
{
        column &=0x3f;
        column +=0x40;
        cmd(column);
}

void lcdPlayChar(uchar index,uchar page,uchar colume)
{
        uchar i,temp;
        uint p;
        p=5*index;
        for(i=colume;i<colume+5;i++)
        {
                if(i<64)
                {
                        CS1=1;
                        CS2=0;
                        temp=i;
                }
        else
                {
                        CS1=0;
                        CS2=1;
                        temp=i-64;
                }
        lcdSetPage(page);
        lcdSetColumn(temp);
        wrubt(asii[p++]);
        }
}

void rectangle(void)
{
        uchar i,page;
        CS1=1;
        CS2=0;
        lcdSetPage(0);  
        lcdSetColumn(2);
        EN=0;
        RS=1;
        RW=0;
        P1=0xff;
        EN=1;
        EN=1;
        EN=0;
        for(i=3;i<51;i++)
        {
                EN=0;
                RS=1;
                RW=0;
                P1=0x1;
                EN=1;
                EN=1;
                EN=0;   
        }
        EN=0;
        RS=1;
        RW=0;
        P1=0xff;
        EN=1;
        EN=1;
        EN=0;

        for(page=1;page<7;page++)
        {
                lcdSetPage(page);  
                lcdSetColumn(2);
                EN=0;
                RS=1;
                RW=0;
                P1=0xff;
                EN=1;
                EN=1;
                EN=0;
                for(i=3;i<51;i++)
                {
                        EN=0;
                        RS=1;
                        RW=0;
                        LCD=0x0;
                        EN=1;
                        EN=1;
                        EN=0;   
                }
                EN=0;
                RS=1;
                RW=0;
                P1=0xff;
                EN=1;
                EN=1;
                EN=0;
        }

        lcdSetPage(7);  
        lcdSetColumn(2);
        EN=0;
        RS=1;
        RW=0;
        P1=0x1f;
        EN=1;
        EN=1;
        EN=0;
        for(i=3;i<51;i++)
        {
                EN=0;
                RS=1;
                RW=0;
                P1=0x10;
                EN=1;
                EN=1;
                EN=0;   
        }
        EN=0;
        RS=1;
        RW=0;
        P1=0x1f;
        EN=1;
        EN=1;
        EN=0;
}

void lcdPutPix(uchar x, uchar y,uchar flag)
{
        uchar i,dat,bitmask,nextbit;
        bit bflag,pflag,ea;
        x=x*key4;
        y=y*key4;
        bflag=0;
        pflag=0;
        i=y%8;
        if(i==0)
                bitmask=0x7;
        else if(i==1)
                bitmask=0xe;
        else if(i==2)
                bitmask=0x1c;
        else if(i==3)
                bitmask=0x38;
        else if(i==4)
                bitmask=0x70;
        else if(i==5)
                bitmask=0xe0;
        else if(i==6)
        {
                bflag=1;
                bitmask=0xc0;
                nextbit=1;
        }
        else if(i==7)
        {
                bflag=1;
                bitmask=0x80;
                nextbit=3;
        }
        if(x<62)
        {
                CS1=1;
                CS2=0;
        }
        else if(x>63)
        {
                x-=64;
                CS1=0;
                CS2=1;
        }
        else
                pflag=1;
        lcdSetPage(y/8);
        for(i=x;i<x+key4;i++)
        {
                if(pflag)
                {
                        if(i==62 || i==63)
                        {
                                CS1=1;
                                CS2=0;
                                lcdSetPage(y/8);
                        }
                        else if(pflag && i==64)
                        {
                                CS1=0;
                                CS2=1;
                                lcdSetPage(y/8);
                        }
                }
                lcdSetColumn(i);
                ea=EA;
                EA=0;
                EN=0;
                LCD=0xff;
                RS=1;
                RW=1;
                EN=1;
                EN=0;
               
                EN=1;
                dat=P1;
                EN=0;
                if(flag==1)
                        dat|=bitmask;
                else
                        dat&=~bitmask;
                lcdSetColumn(i);  
               
                EN=0;
                RW=0;
                RS=1;
                P1=dat;
                EN=1;
                EN=1;
                EN=0;
                EA=ea;
        }
        if(bflag)
        {
                lcdSetPage(y/8+1);
                for(i=x;i<x+key4;i++)
                {
                        if(pflag)
                        {
                                if(i==62 || i==63)
                                {
                                        CS1=1;
                                        CS2=0;
                                        lcdSetPage(y/8+1);
                                }
                                else if(pflag && i==64)
                                {
                                        CS1=0;
                                        CS2=1;
                                        lcdSetPage(y/8+1);
                                }
                        }
                        lcdSetColumn(i);
                        ea=EA;
                        EA=0;
                        EN=0;
                        P1=0xff;
                        RS=1;
                        RW=1;
                        EN=1;
                        EN=0;
                        
                        EN=1;
                        dat=P1;
                        EN=0;
                        if(flag==1)
                                dat|=nextbit;
                        else
                                dat&=~nextbit;
                        lcdSetColumn(i);  
                        
                        EN=0;
                        RW=0;
                        RS=1;
                        P1=dat;
                        EN=1;
                        EN=1;
                        EN=0;
                        EA=ea;  
                }
        }
}

void lcdClear(void)
{
        uchar i,page;
        CS1=1;
        CS2=0;
        for(page=0;page<8;page++)
        {
                lcdSetPage(page);
                lcdSetColumn(0);
                for(i=0;i<64;i++)
                        wrubt(0);
        }
        CS1=0;
        CS2=1;
        for(page=0;page<8;page++)
        {
                lcdSetPage(page);
                lcdSetColumn(0);
                for(i=0;i<64;i++)
                        wrubt(0);
        }
}

#define STAR 53
#define WIDE 6
void lcdIni(void)
{
        cmd(0x3f);
        cmd(0xc0);
        lcdClear();
        rectangle();

        lcdPlayChar(11,0,STAR);
        lcdPlayChar(12,0,STAR+1*WIDE);
        lcdPlayChar(13,0,STAR+2*WIDE);
        lcdPlayChar(14,0,STAR+3*WIDE);

        lcdPlayChar(15,3,STAR);
        lcdPlayChar(16,3,STAR+1*WIDE);
        lcdPlayChar(17,3,STAR+2*WIDE);
        lcdPlayChar(17,3,STAR+3*WIDE);
        lcdPlayChar(18,3,STAR+4*WIDE);

        lcdPlayChar(0,4,STAR+2*WIDE);
        lcdPlayChar(1,4,STAR+3*WIDE);
        
        lcdPlayChar(15,5,STAR);
        lcdPlayChar(19,5,STAR+1*WIDE);
        lcdPlayChar(20,5,STAR+2*WIDE);
        lcdPlayChar(21,5,STAR+3*WIDE);
        lcdPlayChar(12,5,STAR+4*WIDE);
        
        lcdPlayChar(0,6,STAR+1*WIDE);
        lcdPlayChar(0,6,STAR+2*WIDE);
        lcdPlayChar(0,6,STAR+3*WIDE);
        lcdPlayChar(0,6,STAR+4*WIDE);

        lcdPlayChar(0,7,STAR);
        lcdPlayChar(0,7,STAR+1*WIDE);
        lcdPlayChar(10,7,STAR+2*WIDE);
        lcdPlayChar(0,7,STAR+3*WIDE);
        lcdPlayChar(0,7,STAR+4*WIDE);
}

void showss(void)
{
        uchar num;//[5];
        char i;
        uint temp;
        temp=score;
        for(i=0;i<5;i++)
        {
                num=temp%10;
                temp=temp/10;
        }
        for(i=4;i>0;i--)
        {
                if(num==0)
                        num=22;
                else
                        break;
        }
        for(i=4;i>-1;i--)
                lcdPlayChar(num,6,STAR+(4-i)*WIDE);
        
        lcdPlayChar(SOUDU/10,4,STAR+2*WIDE);
        lcdPlayChar(SOUDU%10,4,STAR+3*WIDE);
}

void timeServer(void)
{
        if(flag2)
        {
                flag2=0;
                lcdPlayChar(fen/10,7,STAR);
                lcdPlayChar(fen%10,7,STAR+1*WIDE);
                lcdPlayChar(10,7,STAR+2*WIDE);
                lcdPlayChar(miao/10,7,STAR+3*WIDE);
                lcdPlayChar(miao%10,7,STAR+4*WIDE);   
        }
        if(flag3)
        {
                flag3=0;
                lcdPlayChar(22,7,STAR+2*WIDE);
        }
}

void t0isr(void) interrupt 1
{
        uchar key;
        TH0=(65536-10000)/256;
        TL0=(65536-10000)%256;
        ee++;
        dd=++dd%100;
        if(dd==0)
        {
                flag2=1;
                miao=++miao%60;
                if(miao==0)
                        fen=++fen%60;
        }
        if(dd==50)
                flag3=1;

        key=0xff;
        SW1=1;
        SW3=1;
        SW4=1;
        SW2=1;
        if(!SW1)
                key=0;
        if(!SW3)
                key=1;
        if(!SW4)
                key=2;
        if(!SW2)
                key=3;
        
        switch(bb)
        {
    case 0: if(key!=aa)
                        {
                                aa=key;
                                bb=1;
                        }
                break;
        case 1: if(key==aa)
                        {
                                cc=0;
                                bb=2;
                                if(key!=0xff)
                                        flag1=1;
                        }
                else
                        bb=0;
                break;
        case 2: if(key==aa)
                        {
                                if(cc<key5)
                                        cc++;
                        }
                else
                {
                        bb=0;
                        flag1=0;
                        aa=0xff;
                }
                break;
        }
        
}

void showNextCube(uchar code *p, uchar x,uchar y)
{
        uchar i,j, temp;
        for(i=0;i<4;i++)
        {  
                temp=1;
                for(j=0;j<4;j++)
                {
                        if(&p==temp)
                                lcdPutPix(x+j,y+i,1);
                        else
                                lcdPutPix(x+j,y+i,0);
                        temp<<=1;
                }
        }  
}

void createCube(void)
{
        static uchar next;
        this.cube=next;
        next=TL0%7;
        this.row=0;
        this.column=6;
        this.sdat=0;
        this.box=cube+16*this.cube;
        showNextCube(cube+16*next,19,3);
}

void showdatmap(void)
{
        unsigned char hang,lie,temp;
        for(hang=key2-1;hang>0;hang--)
        {
                if(datmap[hang][0]==0 && datmap[hang][1]==0)
                        break;
               
                for(lie=0;lie<(key3/8);lie++)
                {
                        temp=8*lie;
                        if(datmap[hang][lie]&0x01)
                                lcdPutPix(temp+1,hang,1);
                        
                        if(datmap[hang][lie]&0x02)
                                lcdPutPix(temp+2,hang,1);
                        
                        if(datmap[hang][lie]&0x04)
                                lcdPutPix(temp+3,hang,1);
                        
                        if(datmap[hang][lie]&0x08)
                                lcdPutPix(temp+4,hang,1);
                        
                        if(datmap[hang][lie]&0x10)
                                lcdPutPix(temp+5,hang,1);
                        
                        if(datmap[hang][lie]&0x20)
                                lcdPutPix(temp+6,hang,1);
                        
                        if(datmap[hang][lie]&0x40)
                                lcdPutPix(temp+7,hang,1);
                        
                        if(datmap[hang][lie]&0x80)
                                lcdPutPix(temp+8,hang,1);
                }
        }
}

void writeCubeToMap(void)
{
        uchar row,column,temp;
        uchar hang,lie;
        for(row=0;row<4;row++)
        {
                temp=1;
                for(column=0;column<4;column++)
                {
            if(this.box[row] & temp)
                        {
                                hang=this.row+row;
                                lie=this.column+column;
                                datmap[hang][lie/8] |=bittable[lie%8];
                                lcdPutPix(lie+1,hang,1);                          
                        }
                        temp<<=1;
                }
        }
}

void qinpingmap(void)
{
        uchar row,column,temp;
        uchar hang,lie;
        for(row=0;row<4;row++)
        {
                temp=1;
                for(column=0;column<4;column++)
                {
            if(this.box[row] & temp)
                        {
                                hang=this.row+row;
                                lie=this.column+column;
                                datmap[hang][lie/8] &=~bittable[lie%8];
                                lcdPutPix(lie+1,hang,0);                  
                        }
                        temp<<=1;
                }
        }
}

uchar checkBorder(void)
{
        if(this.box[3]!=0 && this.row>(key2-4))
                return 1;
        else if(this.box[2]!=0 && this.row>(key2-3))
                return 1;
        else if(this.box[1]!=0 && this.row>(key2-2))
                return 1;
        else if(this.box[0]!=0 && this.row>(key2-1))
                return 1;

        if((this.box[0] & 0x01) || (this.box[1] & 0x01) || (this.box[2] & 0x01) ||(this.box[3] & 0x01) )
        {
                if(this.column<0)
                        return 1;
        }   
        else if((this.box[0] & 0x02) || (this.box[1] & 0x02) || (this.box[2] & 0x02) ||(this.box[3] & 0x02) )
        {
                if(this.column<-1)
                        return 1;
        }
        else if((this.box[0] & 0x04) || (this.box[1] & 0x04) || (this.box[2] & 0x04) ||(this.box[3] & 0x04) )
        {
                if(this.column<-2)
                        return 1;
        }
        else if((this.box[0] & 0x08) || (this.box[1] & 0x08) || (this.box[2] & 0x08) ||(this.box[3] & 0x08) )
        {
                if(this.column<-3)
                        return 1;
        }

        if((this.box[0] & 0x08) || (this.box[1] & 0x08) || (this.box[2] & 0x08) ||(this.box[3] & 0x08) )
        {
                if(this.column>(key3-4))
                        return 1;
        }   
        else if((this.box[0] & 0x04) || (this.box[1] & 0x04) || (this.box[2] & 0x04) ||(this.box[3] & 0x04) )
        {
                if(this.column>(key3-3))
                        return 1;
        }
        else if((this.box[0] & 0x02) || (this.box[1] & 0x02) || (this.box[2] & 0x02) ||(this.box[3] & 0x02) )
        {
                if(this.column>(key3-2))
                        return 1;
        }
        else if((this.box[0] & 0x08) || (this.box[1] & 0x08) || (this.box[2] & 0x08) ||(this.box[3] & 0x08) )
        {
                if(this.column>(key3-1))
                        return 1;
        }

        return 0;
}

uchar checkClask(void)
{
        uchar row,column,temp;
        uchar hang,lie;
        for(row=0;row<4;row++)
        {
                temp=1;
                for(column=0;column<4;column++)
                {
            if(this.box[row] & temp)
                        {
                                hang=this.row+row;
                                lie=this.column+column;
                                if(datmap[hang][lie/8] & bittable[lie%8])
                                        return 1;
                        }
                        temp<<=1;
                }
        }
        return 0;
}

void checkMap(void)
{
        uchar i,j,delete;
        bit full;
        full=0;
        delete=0;
        for(i=key2-1;i>0;i--)
        {
                if(datmap[0]==0 && datmap[1]==0)
                        break;
                if(datmap[0]==0xff && datmap[1]==0xff)
                {
                        delete++;
                        full=1;
                        for(j=i;j>0;j--)
                        {
                                datmap[j][0]=datmap[j-1][0];
                                datmap[j][1]=datmap[j-1][1];
                        }
                        i++;
                        datmap[0][0]=0;
                        datmap[0][1]=0;
                }
        }
        if(full)
        {
                if(delete==1)
                        score++;
        else if(delete==2)
                        score+=4;
        else if(delete==3)
                        score+=9;
        else if(delete==4)
                        score+=16;
        rectangle();
        showdatmap();
                if(score<50)
                        SOUDU=1;
        else if(score<100)
                        SOUDU=2;
        else if(score<500)
                        SOUDU=3;
        else if(score<1000)
                        SOUDU=4;
        else if(score<5000)
                        SOUDU=5;
        else if(score<10000)
                        SOUDU=6;
        else if(score<20000)
                        SOUDU=7;
        else if(score<30000)
                        SOUDU=8;
        else if(score<40000)
                        SOUDU=9;
        else if(score<50000)
                        SOUDU=10;
        else if(score<60000)
                        SOUDU=11;
        else
                        SOUDU=12;  
        showss();
        }
}

void moveLeft(void)
{
        qinpingmap();
        this.column--;
        if(checkBorder() || checkClask())
                this.column++;
        writeCubeToMap();
}

void moveRigh(void)
{
        qinpingmap();
        this.column++;
        if(checkBorder() || checkClask())
                this.column--;
        writeCubeToMap();
}

void moveDown(void)
{
        qinpingmap();
        this.row++;
        if(checkBorder() || checkClask())
        {
                this.row--;
        downok=1;
        }
        else
                downok=0;
        writeCubeToMap();
        if(downok)
                checkMap();
}

void cubeRotation(void)
{
        uchar temp;
        temp=this.sdat;
        qinpingmap();
        this.sdat=++this.sdat%4;
        this.box=cube+16*this.cube+4*this.sdat;
        if(checkBorder() || checkClask())
        {
                this.sdat=temp;
                this.box=cube+16*this.cube+4*this.sdat;
        }
        writeCubeToMap();
}

void main(void)
{
        TMOD=0x1;
        TH0=(65536-10000)/256;
        TL0=(65536-10000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        lcdIni();
        for(dd=0;dd<key2;dd++)
        {
                datmap[dd][0]=0;
                datmap[dd][1]=0;
        }
        while(1)
        {
                createCube();
                if(checkClask())
                {
                        rectangle();

#define SHOWSTAR 12
#define GAP 8
                        lcdPlayChar(23,2,SHOWSTAR);
                        lcdPlayChar(24,2,SHOWSTAR+GAP);            
                        lcdPlayChar(25,2,SHOWSTAR+2*GAP);
                        lcdPlayChar(12,2,SHOWSTAR+3*GAP);
                        
                        lcdPlayChar(20,4,SHOWSTAR);     
                        lcdPlayChar(26,4,SHOWSTAR+GAP);
                        lcdPlayChar(12,4,SHOWSTAR+2*GAP);
                        lcdPlayChar(21,4,SHOWSTAR+3*GAP);
                        dd=0;
                        while(dd<95);
                        dd=0;
                        while(dd<95);
                        ((void (code *) (void)) 0x0000) ( );           
                }
                while(1)
                {
                        timeServer();
            if(flag1)
                        {
                                flag1=0;
                                cc=0;
                                if(aa==0)
                                        moveLeft();
                                if(aa==1)
                                        moveRigh();
                                if(aa==2)
                                        cubeRotation();
                                if(aa==3)
                                        moveDown();                     
                        }
                        if(aa==0 && cc==key5)
            {
                                cc-=10;
                                moveLeft();
                        }
                        if(aa==1 && cc==key5)
            {
                                cc-=10;
                                moveRigh();
                        }
                        if(aa==3 && cc==key5)
            {
                                cc-=10;
                                moveDown();
                        }
                        if(ee>(key1-SOUDU))
            {
                                moveDown();
                                ee=0;
                        }
                        if(downok)
            {
                                downok=0;
                                break;
                        }
                }
        }
}


LCD12864俄罗斯方块.rar (22.41 KB, 下载次数: 29)

评分

参与人数 9黑币 +162 收起 理由
zhengchong60 + 8 很给力!
static + 12
areyouok + 15 赞一个!
yoxi + 12 绝世好帖!
jinsheng7533967 + 35 赞一个!
Sawardeakar + 10 很给力!
刀刀见红 + 10 很给力!
#include51.h + 10 你最棒!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

Trump1438 发表于 2019-1-24 21:02 | 显示全部楼层
好样的,能运行!

评分

参与人数 2黑币 +22 收起 理由
zhengchong60 + 10 赞一个!
Sawardeakar + 12 绝世好帖!

查看全部评分

回复

使用道具 举报

jinsheng7533967 发表于 2019-1-26 18:44 | 显示全部楼层
嗯!很好的例子!
回复

使用道具 举报

yoxi 发表于 2019-1-28 17:18 | 显示全部楼层
这是见过最好的俄罗斯方块
回复

使用道具 举报

shuisheng60 发表于 2019-2-3 21:19 | 显示全部楼层
不错不错,就喜欢这种的
回复

使用道具 举报

找人PK 发表于 2019-2-9 14:22 | 显示全部楼层
超级好玩的东东

评分

参与人数 1黑币 +12 收起 理由
static + 12

查看全部评分

回复

使用道具 举报

meixia521wei 发表于 2019-2-10 21:10 | 显示全部楼层
  不错
回复

使用道具 举报

sheng7533967 发表于 2019-2-13 16:38 | 显示全部楼层
喜欢这样好玩的
回复

使用道具 举报

never123 发表于 2019-2-13 22:40 | 显示全部楼层
代码运行不了啊
回复

使用道具 举报

1174051618 发表于 2019-2-18 15:42 | 显示全部楼层
有error啊,运行不了
回复

使用道具 举报

11#
无效楼层,该帖已经被删除
zaka123456 发表于 2019-2-18 15:47 | 显示全部楼层
楼主,代码无法运行,为什么?
回复

使用道具 举报

春风十里吹死你 发表于 2019-2-19 19:14 | 显示全部楼层
很好!仿真不错!代码自己写写就好
回复

使用道具 举报

yoxi 发表于 2019-2-22 23:12
zaka123456 发表于 2019-2-18 15:47
楼主,代码无法运行,为什么?

为什么要给你源码?自己写去,欠你的!什么东?

yoxi 发表于 2019-2-22 23:14
zaka123456 发表于 2019-2-18 15:47
楼主,代码无法运行,为什么?

不为什么,就不想给你这种赖人!

zhengchong60 发表于 2019-3-7 22:54 | 显示全部楼层

在电脑上超级好玩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51hei电子论坛2群 联系QQ:125739409;技术交流QQ群219535678

Powered by 单片机教程网

快速回复 返回顶部 返回列表