求助帖-16x16点阵显示每一行有重影,怎么消除,请大神帮忙

2019-07-15 17:21发布

本帖最后由 骆页 于 2015-5-5 10:23 编辑

求助帖-16x16点阵显示每一行有重影,怎么消除,请大神帮忙,怎么消影。。。谢谢


#include <reg51.h>
#include <intrins.h>

#define  SPEED  10
#define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
void ymove(char dir,unsigned char *ptr,char speed);
void xmove(char dir,unsigned char *ptr,char n,char speed);
void delay(unsigned int a);
void display();
void displaytime(char time);
void init154();

sbit  ADATA= P2^0;
sbit  ASCK=  P2^1;
sbit  LATCH= P2^2;
sbit  A0= P2^3;
sbit  A1= P2^4;
sbit  A2= P2^5;
sbit  A3= P2^6;
sbit  E= P0^0;
sbit  p10 = P1^0;              //上移
sbit  p11 = P1^1;                  //左移
sbit  p12 = P1^2;                  //下移
sbit  p13 = P1^3;              //暂停
sbit  p14 = P1^4;                  //右移

uchar led =5;                          //点阵模式

code unsigned char liang[32]={

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};

code unsigned char mie[32]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,   //全灭
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};

code unsigned char huan[32]={
0xDF,0xF7,0xDB,0xEF,0xDD,0x9F,0xDE,0x7F,0xD9,0xBE,0xC6,0xCD,0xFD,0xFB,0xF3,0xE7,
0x0F,0x9F,0xEC,0x7F,0xEF,0x9F,0xEF,0xE7,0xEB,0xFB,0xE7,0xFD,0xFF,0xFE,0xFF,0xFF};

code unsigned char ying[32]={           
0xFD,0xFF,0xFD,0xFD,0xBD,0xFB,0xCC,0x07,0xFF,0xFB,0xFF,0xFD,0xC0,0x0D,0xDF,0xDD,
0xBF,0xBD,0xFF,0xFD,0xC0,0x01,0xDF,0xBD,0xDF,0xDD,0xC0,0x3D,0xFF,0xFD,0xFF,0xFF};

code unsigned char lai[32]={                                         
0xFF,0x7B,0xEF,0x7B,0xEF,0x77,0xEB,0x77,0xEC,0x6F,0xEF,0x5F,0xEF,0x3F,0x00,0x00,
0xEF,0x3F,0xEF,0x5F,0xEE,0x6F,0xE9,0x77,0xEF,0x77,0xEF,0x7B,0xFF,0x7B,0xFF,0xFF};

code unsigned char dao[32]={
0xBD,0xFD,0xB9,0xDC,0xB5,0xDD,0xAD,0xDD,0x9C,0x01,0xBD,0xDB,0xB5,0xDB,0xB9,0xDB,
0xBC,0xFB,0xFF,0xFF,0xE0,0x0F,0xFF,0xFD,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0xFF,0xFF};

code unsigned char bei[32]={
0xFF,0xFB,0xFB,0xF9,0xFB,0xFB,0xFB,0xF7,0xFB,0xF7,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x03,0xFD,0xFD,0xFB,0xFD,0xF7,0xFD,0xEF,0xFD,0xFF,0xE1,0xFF,0xFF};

code unsigned char li[32]={
0xDF,0xFB,0xDE,0xF9,0xDE,0xFB,0xC0,0x07,0xDE,0xF7,0xDE,0xF7,0xFF,0xFD,0x80,0xDD,
0xB6,0xDD,0xB6,0xDD,0x80,0x01,0xB6,0xDD,0xB6,0xDD,0x80,0xDD,0xFF,0xFD,0xFF,0xFF};

code unsigned char gong[32]={
0xFF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xC0,0x03,
0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xFF,0xFB,0xFF,0xFF};

code unsigned char zhu[32]={
0xDF,0xF7,0xDD,0xF3,0xDD,0xF7,0xC0,0x0F,0xDD,0xEF,0xDD,0xEF,0xFA,0xFB,0x86,0xE7,
0xEE,0x9F,0xEE,0x7F,0x00,0x00,0xEE,0x7F,0xEE,0x9F,0xEE,0xE7,0xFE,0xFB,0xFF,0xFF};

code unsigned char hai[32]={
0xF7,0xDF,0xF9,0xDF,0xBF,0xC1,0xCF,0x3F,0xFC,0xFF,0xF7,0x7F,0xEF,0x47,0x10,0x37,
0xD7,0x77,0xD5,0x55,0xD6,0x66,0xD7,0x75,0xD0,0x03,0xDF,0x77,0xFF,0x7F,0xFF,0xFF};

code unsigned char xue[32]={
0xFD,0xDF,0xF3,0xDF,0x77,0xDF,0x96,0xDF,0xF6,0xDF,0xF6,0xDD,0x76,0xDE,0x96,0x81,
0xF6,0x9F,0xF6,0x5F,0xE6,0xDF,0xD7,0xDF,0x37,0xDF,0xF5,0xDF,0xF3,0xDF,0xFF,0xFF};

code unsigned char yuan[32]={
0xFF,0xFF,0x80,0x00,0xBB,0xDF,0xA5,0xEF,0x9E,0x1F,0xF7,0xFE,0xCF,0x7D,0xDB,0x73,
0xDB,0x0F,0x5B,0x7F,0x9B,0x7F,0xDB,0x03,0xDB,0x7D,0xD7,0x7D,0xCF,0x71,0xFF,0xFF};


unsigned char idata buffer[32];

void main(void)
{
    unsigned char i;
        E = 0;
        P2= 0x00;
        EA  = 1;                   //开总中断
        TMOD = 0X01;          //定时器0、定时器1工作方式1
        ET0 = 1;                  //关定时器0中断
        TR0 = 1;                  //允许定时器0定时
        TH0 = 0xFF;
        TL0 = 0x38;     //1ms  24M晶振
        while(1)
        {        
        if( led == 5)
                {
                for(i=0;i<32;i++)
                        buffer=liang;
                displaytime(1);
                }
                if( led == 1)
                        ymove(1,mie,SPEED);
                if( led == 1)
                        ymove(1,huan,SPEED);
                if( led == 1)
                        ymove(1,ying,SPEED);
                if( led == 1)
                        ymove(1,lai,SPEED);
                if( led == 1)
                        ymove(1,dao,SPEED);
                if( led == 1)
                        ymove(1,bei,SPEED);
                if( led == 1)
                        ymove(1,li,SPEED);
                if( led == 1)
                        ymove(1,gong,SPEED);
                if( led == 1)
                        ymove(1,zhu,SPEED);
                if( led == 1)
                        ymove(1,hai,SPEED);
                if( led == 1)
                        ymove(1,xue,SPEED);
                if( led == 1)
                        ymove(1,yuan,SPEED);  //上行结束

                if( led == 2)
                        xmove(1,mie,1,SPEED);
                if( led == 2)
                        xmove(1,huan,1,SPEED);
                if( led == 2)
                        xmove(1,ying,1,SPEED);
                if( led == 2)
                        xmove(1,lai,1,SPEED);
                if( led == 2)
                        xmove(1,dao,1,SPEED);
                if( led == 2)
                        xmove(1,bei,1,SPEED);
                if( led == 2)
                        xmove(1,li,1,SPEED);
                if( led == 2)
                        xmove(1,gong,1,SPEED);
                if( led == 2)
                        xmove(1,zhu,1,SPEED);
                if( led == 2)
                        xmove(1,hai,1,SPEED);
                if( led == 2)
                        xmove(1,xue,1,SPEED);
                if( led == 2)
                        xmove(1,yuan,1,SPEED);        //左行结束(欢迎来到毕设指导)

                if( led == 3)
                        ymove(0,mie,SPEED);
                if( led == 3)
                        ymove(0,huan,SPEED);
                if( led == 3)
                        ymove(0,ying,SPEED);
                if( led == 3)
                        ymove(0,lai,SPEED);
                if( led == 3)
                        ymove(0,dao,SPEED);
                if( led == 3)
                        ymove(0,bei,SPEED);
                if( led == 3)
                        ymove(0,li,SPEED);
                if( led == 3)
                        ymove(0,gong,SPEED);
                if( led == 3)
                        ymove(0,zhu,SPEED);
                if( led == 3)
                        ymove(0,hai,SPEED);
                if( led == 3)
                        ymove(0,xue,SPEED);
                if( led == 3)
                        ymove(0,yuan,SPEED);          //下行结束

                if( led == 4)
                        xmove(0,mie,1,SPEED);
                if( led == 4)
                        xmove(0,huan,1,SPEED);
                if( led == 4)
                        xmove(0,ying,1,SPEED);
                if( led == 4)
                        xmove(0,lai,1,SPEED);
                if( led == 4)
                        xmove(0,dao,1,SPEED);
                if( led == 4)
                        xmove(0,bei,1,SPEED);
                if( led == 4)
                        xmove(0,li,1,SPEED);
                if( led == 4)
                        xmove(0,gong,1,SPEED);
                if( led == 4)
                        xmove(0,zhu,1,SPEED);
                if( led == 4)
                        xmove(0,hai,1,SPEED);
                if( led == 4)
                        xmove(0,xue,1,SPEED);
                if( led == 4)
                        xmove(0,yuan,1,SPEED); //右行结束
                 if( led == 0)
           {
                        
                displaytime(1);

                }
               

        }
}
/*************  子函数   ******************/
void delay(unsigned int a)
{
        while(a--);
}

/*显示*/

void display()
{
        
        unsigned char hang,ib,k,tmp,tmp1;
        tmp1 = 2;
            P2= 0x00;
                E=0;
        for(hang=0;hang<16;hang++)
        {
                ASCK =0;               
                LATCH=0;
                for(ib=0;ib<2;ib++)
                {
                        tmp = buffer[hang*2+ib];
                        for(k=0;k<8;k++)
                        {
                                tmp <<=1;
                                ASCK  =0;
                                ADATA =CY;
                                ASCK  =1;
                        }
                }

                LATCH=1;

                delay(64);

        tmp1 = tmp1 + 8;
        P2= tmp1        ;
        }
        
        ASCK =0;
        ASCK =1;
        E = 1;
}

void displaytime(char time)
{
        unsigned char i;
        while(time--)
        {
                i=130;
                while(i--)
                 display();
        }
}



/*左右移动*/

void xmove(char dir,unsigned char *ptr,char n,char speed)                                                                                                                                       
{      /*       方向                    n是要移动的汉字个数        移动速度*/         
        unsigned char  i=0,  ib=0;
        unsigned int   tmp=0, speedm=0;
        unsigned char  buffer2[16];         //半个汉字的缓存

        n*=2;     //左半字和右半字,所以要x2            
        for(i=0;i<16;i++)   //清零
                buffer2=0;

        if(dir == 1)     
        {
/****     向左移动    ****/
                for(n;n>0;n--)   
                {               
                        if(ptr != 0)
                        {
                                tmp = n%2;        //判断是左半字还是右半字
                                for(i=0;i<16;i++)
                                        buffer2=ptr[i*2+tmp];
        
                                if(tmp)                //tmp为1时,将地址指向下一个汉字
                                        ptr+=32;
                        }
                        
                        for(tmp=8;tmp>0;tmp--)  //要移动8列        
                        {                                   
                                ib=0;        
                                for(i=0;i<16;i++)
                                {                //要移16行,共16个字节
                       
                                        buffer[ib] <<=1; //移第一个半字
                                        if(buffer[ib+1] & 0x80)        
                                                buffer[ib]++;
                                        ib++;                        
        
                                        buffer[ib]<<=1;                //移后半字
                                        if(buffer2 & 0x80)           
                                                buffer[ib]++;
                                        ib++;
        
                                        buffer2<<=1;                //缓冲左半字向左移一位
                                }
                                
                                speedm=speed;        //更新点阵
                                while(speedm--)
                                        display();
                        }
                }
        }
//--------------------------------------------------//
        else        
        {
   /******  向右移动   ******/
                for(n;n>0;n--)
                {               
                        if(ptr != 0)
                        {
                                tmp = (n+1) % 2  ;        //判断左半字还是右半字
                                for(i=0;i<16;i++)
                                        buffer2=ptr[i*2+tmp];
                                                               
                                if(tmp == 0)                //tmp为0时,将地址指向下一个汉字
                                        ptr+=32;
                        }
                        
                        for(tmp=8;tmp>0;tmp--)  //要移动8列        
                        {                                   
                                ib=0;        
                                for(i=0;i<16;i++)
                                {                //要移16行,共16个字节
                       
                                        buffer[ib+1] >>= 1;             //移右半字
                                        if(buffer[ib] & 0x01)        
                                                buffer[ib+1] |=0x80 ;                        
        
                                        buffer[ib] >>= 1;            //移左半字
                                        if(buffer2 & 0x01)           
                                                buffer[ib] |= 0x80;
                                        ib+=2;
        
                                        buffer2 >>=1;                //下个汉字的右半字向右移一位
                                }
                                
                                speedm=speed;        
                                while(speedm--)  //更新点阵
                                        display();
                        }
               
                }
        }

}

/*上下移动*/
void ymove(char dir,unsigned char *ptr, char speed)
{                   //dir=1上移动,dir=0为下移动
        char i=0, j=0, ib=0;
        unsigned int  tmp=0, speedm=0;

        if(dir==0)      
        {        
   /****  向下移  ****/
                ib=31;               
                for(i=16;i>0;i--)   //下移16行
                {               
                        for(j=29;j>-1;j--)
                                buffer[j+2]=buffer[j];        //将上一行的内容复制到下一行
        
                        if(ptr==0)
                        {                                //移空时,buffer的首行用0移入
                                buffer[0]=0;
                                buffer[1]=0;
                        }
                        else
                        {                                //否则,处理buffer的首行元素               
                            buffer[1]=ptr[ib];
                                buffer[0]=ptr[ib-1];
                                ib=ib-2;
                        }
                        speedm=speed;        
                        while(speedm--)          //更新点阵
                                display();
                }
        }

/****** 向上移 *******/
        else
        {                        
                ib=0;          //数组元素序号
                for(i=0;i<16;i++)    //上移16行
                {        
                        for(j=0;j<30;j++)           //将下一行的内容复制到上一行
                                buffer[j]=buffer[j+2];

                        if(ptr==0)        //移入为空,buffer的末行用0移入
                        {                        
                                buffer[30]=0;
                                buffer[31]=0;
                        }
                        else
                        {                        //否则,处理buffer的末行元素
                                buffer[30]=ptr[ib];
                                buffer[31]=ptr[ib+1];
                                ib=ib+2;                           
                        }
                        speedm=speed;        //更新点阵
                        while(speedm--)
                                display();
                   }
           }
                        
}        


void timer0(void) interrupt 1
{        
        TH0 = 0xFF;
        TL0 = 0x38;     //1ms
        if( p10 ==0 )                  //  上
         {
                 led =1;
         }        
                if( p11 ==0 )                  //  左
         {
                 led =4;
         }        
                 if( p12 ==0 )                  //  下
         {
                 led =3;
         }        
                 if( p13 ==0 )                  //  暂停
         {
                 led =0;
         }        
                 if( p14 ==0 )                  //   右
         {
                 led =2;
         }        

                 
        }                 

11.JPG
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。