51单片机程序,向右显示I 心形 U,刚开始向右移动时会出现一下乱点(点亮的点)之后正常,请高手帮忙指正。

作者&投稿:撒咐 (若有异议请与网页底部的电邮联系)
关于51单片机点阵心形显示问题~

首先你要搞清楚点阵显示原理。
8*8点阵要显示一个画面,通常采用扫描的形式。点阵内部发光阵列每一行的阴极连在一起,引出一条共阴线;每一纵向阳极连在一起,引出一条共阳线。这样8*8点阵就共有8条共阴线和8条共阳线。具体请参考点阵内部结构示意图!
扫描的过程:例如将共阳线作为扫描线,即每次给其中一条阳线供电,其它阳线断电。这样,在该条阳线上的LED点亮与否就取决于8条阴线的电平高低了。快速地扫描阳线,并且每扫描一条就给阴线变化相应的电平,就实现了一组图像的显示。
在你给的程序中,很明显的 tabP2是用来形成扫描输出的。你自己分析一下这些值每次是不是只发生了0这个值的移位。这是采用查表法来得到扫描功能的,每次让IO口(一组)输出这表中的一个值,最终就形成了扫描动作。至于tabP0就是对应于每一个扫描线输出的心形数据表了。每次扫描IO输出 tabP2的一个值,对应数据IO输出tabP0的一个值。
至于你说的“还有8X8点阵图中接口P23,P25,LP04,LP06,其中的LP04,LP06是不是指单片机的P04和P06接口啊?”我个人认为你应该自己有能力对这等电路进行分析了,不要一味只是单纯复制制作。只有自己尝试了解,以后才能做出更具特色的东西而不会仅仅停留在心形显示。

你用取模软件先点个心形,然后用字节左右移来实现就可以了
我有16*16点阵的各种动态效果程序
给你看下总共有12种动态效果,你改成8*8就可以了
/*************呈现各种显示效果的函数集****************/
void flash_bai(uchar *flash_word,uchar flash_heard,uchar number,uchar sdu,uchar state)//百叶窗效果
{register uchar i,j,k,l;
for(i=0;i<number;i++)
{
for(j=0;j<16;j++)
{
for(l=0;l<8;l++)
{
if(j<8)
{
dispram[l*4+1]=dispram[l*4+1]&0xff>(7-j));
dispram[l*4+2]=dispram[l*4+2]&0xff>>j|(flash_word[(flash_heard+i)*32+l*4+3]<<(7-j)&0x10);
}
else
{
dispram[l*4] =dispram[l*4]&0xff>(15-j);
dispram[l*4+1]=flash_word[(flash_heard+i)*32+l*4]>(15-j));
dispram[l*4+2]=flash_word[(flash_heard+i)*32+l*4+2]>(j-7));
dispram[l*4+3]=(dispram[l*4+3]&0xff>>(j-7))|flash_word[(flash_heard+i)*32+l*4+3]<<(15-j);
}
}
delay(sdu*SPEED);
}
delay(state*SPEED);
}
}

/*******************霓虹灯效果************************/
void flash(uchar *flash_word,uchar flash_heard,uchar number,uchar sdu,uchar state)
{register uchar i,j,k,l;
for(i=0;i<number;i++)
{
for(j=0;j<=16;j++)
{
for(k=17;k>j;k--)
{
for(l=0;l<16;l++)
{
if(j>8)
{
dispram[l*2] =1>(16-j));
dispram[l*2+1]=flash_word[(flash_heard+i)*32+l*2+1];
}
else
{
dispram[l*2]=1<<(8-k+j);
dispram[l*2+1]=1>(8-j));
}
}
delay(sdu*SPEED);
}
for(k=17;k>j;k--)
{
for(l=0;l<16;l++)
{
if(j>8)
{
dispram[l*2]=1>(16-j));
}
else
{
dispram[l*2]=1<<(k-8);
dispram[l*2+1]=1>(8-j));
}
}
delay(sdu*SPEED);
}
}
delay(state*SPEED);
}
}

/*******************跳动的米奇*********************/
void miqi_jump(void)
{uchar jump_i;
while((receive[1]&0x0f)<2)
{
switch (abc/7280)//(receive[0]&0x0f)%9
{
case 0:for(jump_i=0;jump_i<16;jump_i++)
{
dispram[jump_i*2] = Bmp1[14][jump_i*2]>7;
dispram[jump_i*2+1] = Bmp1[14][jump_i*2+1]<<1;//左移
}break;
case 1:for(jump_i=0;jump_i<15;jump_i++)
{dispram[0] = 0;
dispram[1] = 0;
dispram[jump_i*2+2] = Bmp1[14][jump_i*2];
dispram[jump_i*2+3] = Bmp1[14][jump_i*2+1];}
break;//下移
case 2:for(jump_i=0;jump_i<16;jump_i++)
{
dispram[jump_i*2+1] = Bmp1[14][jump_i*2+1]>>1|Bmp1[14][jump_i*2]<<7;
dispram[jump_i*2] = Bmp1[14][jump_i*2]>>1;
}break;//右移
case 3:for(jump_i=0;jump_i<15;jump_i++)
{dispram[30] = 0;
dispram[31] = 0;
dispram[jump_i*2] = Bmp1[14][jump_i*2+2];
dispram[jump_i*2+1] = Bmp1[14][jump_i*2+3];}
break;//上移
case 4: for(jump_i=0;jump_i<16;jump_i++)
{
dispram[jump_i*2+2] = Bmp1[14][jump_i*2]>7;
dispram[jump_i*2+3] = Bmp1[14][jump_i*2+1]<<1;//左移
dispram[0] = 0;
dispram[1] = 0;
} break;//下移
case 5: for(jump_i=0;jump_i<16;jump_i++)
{
dispram[jump_i*2+1] = Bmp1[14][jump_i*2+3]>>1|Bmp1[14][jump_i*2+2]<<7;
dispram[jump_i*2] = Bmp1[14][jump_i*2+2]>>1;
dispram[30] = 0;
dispram[31] = 0;
} break;//上移
case 6: for(jump_i=0;jump_i<16;jump_i++)
{
dispram[jump_i*2+3] = Bmp1[14][jump_i*2+1]>>1|Bmp1[14][jump_i*2]<<7;
dispram[jump_i*2+2] = Bmp1[14][jump_i*2]>>1;
dispram[0] = 0;
dispram[1] = 0;
}
break;
case 7: for(jump_i=0;jump_i<16;jump_i++)
{
dispram[jump_i*2] = Bmp1[14][jump_i*2+2]>7;
dispram[jump_i*2+1] = Bmp1[14][jump_i*2+3]<<1;//左移
dispram[30] = 0;
dispram[31] = 0;
} break;
case 8:for(jump_i=0;jump_i<32;jump_i++)
dispram[jump_i] = Bmp1[14][jump_i];break;
}
}
}
/********从wordsp的第OpenDheard个字开始开门效果显示number个字**********/
//开门效果
void Open_door(uchar wordsp[][32],uchar OpenDheard,uchar number,uchar sdu,uchar state)
{register uchar i,j,w;
for(w=0;w<number;w++)
{
for(j=1;j<9;j++)
{
for(i=0;i<16;i++)
{
dispram[i*2]=dispram[i*2]&0xff>(8-j);
dispram[i*2+1]=dispram[i*2+1]&0xff>>j|wordsp[OpenDheard+w][1+2*i]&0xff<<(8-j);
}
delay(sdu*SPEED);
}
delay(state*TIME);
}
}

/********从wordsp的第CloseDheard个字开始关门效果显示number个字**********/
//关门效果
void Close_door(uchar wordsp[][32],uchar CloseDheard,uchar number,uchar sdu,uchar state)
{register uchar i,j,w;
for(w=0;w<number;w++)
{
for(j=1;j<9;j++)
{
for(i=0;i<16;i++)
{
dispram[i*2]=dispram[i*2]&0xff>>j|wordsp[CloseDheard+w][2*i]&0xff<<(8-j);
dispram[i*2+1]=dispram[i*2+1]&0xff>(8-j);
}
delay(sdu*SPEED);
}
delay(state*TIME);
}
}

/********从wordsp的第Far_Awayheard个字开始两边拉开显示number个字**********/
//两边拉开
void Far_Away(uchar wordsp[][32],uchar Far_Awayheard,uchar number,uchar sdu,uchar state)
{register uchar i,j,w;
for(w=0;w<number;w++)
{
for(j=1;j<9;j++)
{
for(i=0;i<16;i++)
{
dispram[i*2]=dispram[i*2]>(8-j);
dispram[i*2+1]=dispram[i*2+1]>>j|wordsp[Far_Awayheard+w][1+2*i]&0xff<<(8-j);
}
delay(sdu*SPEED);
}
delay(state*TIME);
}
}

/********从wordsp的第Close_Toheard个字开始两边合拢显示number个字**********/
//两边合拢
void Close_To(uchar wordsp[][32],uchar Close_Toheard,uchar number,uchar sdu,uchar state)
{register uchar i,j,w;
for(w=0;w<number;w++)
{
for(j=1;j<9;j++)
{
for(i=0;i<16;i++)
{
dispram[i*2]=dispram[i*2]&0xff>>j|wordsp[Close_Toheard+w][2*i]<<(8-j);
dispram[i*2+1]=dispram[i*2+1]&0xff>(8-j);
}
delay(sdu*SPEED);
}
delay(state*TIME);
}
}

/****************卷帘出显示number个字***************/
//卷帘出显示
void M_Words(uchar *wordsp,uchar MWheard,uchar number,uchar sdu,uchar state)
{register uchar i,w;
for(w=0;w<number;w++)
{
for(i=0;i<32;i++)
{
dispram[i]=wordsp[(MWheard+w)*32+i];
if(i%2)
delay(sdu*SPEED);
}
delay(state*TIME);
}
}


/************从UP_Pullp的第UP_Pullheard个字向上拉出number个字***************/
//向上拉出
void UP_Pull_Word(uchar UP_Pullp[][32],uchar UP_Pullheard,uchar number,uchar sdu,uchar state)
{register uchar i,j,k;
for(i=0;i<number;i++)
{
for(j=0;j<16;j++)
{
for(k=0;k<15-j;k++)
{
dispram[k*2]=dispram[(k+1)*2];
dispram[k*2+1]=dispram[(k+1)*2+1];
}

dispram[30-2*j]=UP_Pullp[UP_Pullheard+i][(15-j)*2];
dispram[31-2*j]=UP_Pullp[UP_Pullheard+i][(15-j)*2+1];

delay(sdu*SPEED);
}
delay(state*TIME);
}
}
/*********从UPp的第UPheard个字向上滚屏number个字***************/
//向上滚屏
void UP_Run_Word(uchar UPp[][32],uchar UPheard,uchar number,uchar sdu,uchar state)
{register uchar i,j,k;
for(i=0;i<number;i++)
{
for(j=0;j<16;j++)
{
for(k=0;k<15;k++)
{
dispram[k*2]=dispram[(k+1)*2];
dispram[k*2+1]=dispram[(k+1)*2+1];
}
dispram[30]=UPp[UPheard+i][j*2];
dispram[31]=UPp[UPheard+i][j*2+1];
delay(sdu*SPEED);
}
delay(state*TIME);
}
}


/*********从Down_Pullp的第Down_Pullheard个字向下拉出number个字***************/
//向下拉出
void Down_Pull_Word(uchar Down_Pullp[][32],uchar Down_Pullheard,uchar number,uchar sdu,uchar state)
{register uchar i,j,k;
for(i=0;i<number;i++)
{
for(j=0;j<16;j++)
{
for(k=15;k>j;k--)
{
dispram[k*2]=dispram[(k-1)*2];
dispram[k*2+1]=dispram[(k-1)*2+1];
}
dispram[2*j]=Down_Pullp[Down_Pullheard+i][2*j];
dispram[2*j+1]=Down_Pullp[Down_Pullheard+i][2*j+1];
delay(sdu*SPEED);
}
delay(state*TIME);
}
}
/*********从Downp的第UPheard个字向下滚屏number个字***************/
//向下滚屏
void Down_Run_Word(uchar *Downp,uchar UPheard,uchar number,uchar sdu,uchar state)
{register uchar i,j,k;
for(i=0;i<number;i++)
{
for(j=0;j<16;j++)
{
for(k=15;k>0;k--)
{
dispram[k*2]=dispram[(k-1)*2];
dispram[k*2+1]=dispram[(k-1)*2+1];
}
dispram[0]=Downp[(UPheard+i)*32+(15-j)*2];
dispram[1]=Downp[(UPheard+i)*32+(15-j)*2+1];
delay(sdu*SPEED);
}
delay(state*TIME);
}
}

/**********从LRp的第LRheard个字左移出显示number个字************/
//用左移出显示
void L_Removeout_Word(uchar *LRp,uchar LRheard,uchar number,uchar sdu,uchar state)
{register uchar i,j,k,l;
for(i=0;i<number;i++)
{
for(j=0;j<2;j++)
for(k=0;k<8;k++)
{
for(l=0;l<16;l++)
{
dispram[l*2]=dispram[l*2]>7;
dispram[l*2+1]=dispram[l*2+1]>(7-k);
}
delay(sdu*SPEED);
}
delay(state*TIME);
}
}

/**********从L_Pullp的第L_Pullheard个字左拉出显示number个字************/
//左拉出显示
void L_Pull_Word(uchar *L_Pullp,uchar L_Pullheard,uchar number,uchar sdu,uchar state)
{register uchar i,j,k,l;
for(i=0;i<number;i++)
{
for(j=0;j<2;j++)
for(k=0;k<8;k++)
{
for(l=0;l<16;l++)
{
if(j==0)
{
dispram[l*2]=dispram[l*2]>7;
dispram[l*2+1]=(dispram[l*2+1]&0xff>(7-k);
}
else
{
dispram[l*2]=(dispram[l*2]&0xff>(7-k);
dispram[l*2+1]=L_Pullp[(i+L_Pullheard)*32+l*2+1];
}
}
delay(sdu*SPEED);
}
delay(state*TIME);
}
}

/****************卷帘出黑屏***************/
void M_Black(void)
{register uchar i;
for(i=0;i<32;i++)
{
dispram[i]=0x00;
if(i%2)
delay(5*SPEED);
}
}
/**********从RRp的第RRheard个字右移出显示number个字************/
//右移出显示
void R_Removeout_Word(uchar *RRp,uchar RRheard,uchar number,uchar sdu,uchar state)
{register uchar i,j,k,l;
for(i=0;i<number;i++)
{
for(j=2;j>0;j--)
for(k=0;k<8;k++)
{
for(l=0;l<16;l++)
{
dispram[l*2+1]=dispram[l*2+1]>>1|dispram[l*2]<<7;
dispram[l*2]=dispram[l*2]>>1|RRp[(i+RRheard)*32+l*2+j-1]<<(7-k);
}
delay(sdu*SPEED);
}
delay(state*TIME);
}
}

/**************随机跑动函数**************/
void radom_flash(uchar *Radom_p,uchar Radom_heard,uchar number,uchar sdu,uchar state)
{

switch ((receive[1]&0x0f)+(receive[0]&0x70)/16)
{
case 0: Open_door(Radom_p,Radom_heard,number,sdu,state);M_Black();break;//开门
case 1: Close_door(Radom_p,Radom_heard,number,sdu,state);M_Black();break;//关门
case 2: Far_Away(Radom_p,Radom_heard,number,sdu,state);M_Black();break;//分开
case 3: Close_To(Radom_p,Radom_heard,number,sdu,state);M_Black();break;//合拢
case 4: miqi_jump();
case 5: M_Words(Radom_p,Radom_heard,number,sdu,state);M_Black(); break;//卷帘
case 6: UP_Pull_Word(Radom_p,Radom_heard,number,sdu,state);break;//上拉出
case 7: UP_Run_Word(Radom_p,Radom_heard,number,sdu,state);break;//上滚屏
case 8: Down_Pull_Word(Radom_p,Radom_heard,number,sdu,state);break;//下拉出
case 9: Down_Run_Word(Radom_p,Radom_heard,number,sdu,state);break;
case 10: L_Removeout_Word(Radom_p,Radom_heard,number,sdu,state);break;//左滚屏
case 11: L_Pull_Word(Radom_p,Radom_heard,number,sdu,state);break;//左拉出
case 12: R_Removeout_Word(Radom_p,Radom_heard,number,sdu,state);break;//右滚屏
case 13: flash(Radom_p,Radom_heard,number,3,state);break;
case 14: flash_bai(Radom_p,Radom_heard,number,sdu,state);break;
}
}

①数组 元素下标不正确,index =30,已经超出数组范围。建议初始化=0,变量步进为index++,当然,判断条件本身就是个错误,加上我的建议,应该写成 if(index>=30)了;变量使用(29-index);
②另外定时器没有初值,上电后,到定时器中断,共有71ms,并不是见了1ms。

这种情况是字模取模方向不对,最好提供硬件连接图分析

你好!把你原理图发一下,你的开发板是什么牌子的