首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

LED点阵左移显示有重影,该如何解决?求帮忙

2013-09-28 
LED点阵左移显示有重影,该怎么解决?求帮忙麻烦路过的大哥看一下,speed为1时,速度比较快,但是显示很正常,不

LED点阵左移显示有重影,该怎么解决?求帮忙
麻烦路过的大哥看一下,speed为1时,速度比较快,但是显示很正常,不会有重影现象,当speed为2、3、4、5、6、7是速度是变慢了,但是会出现重影现象,这是什么原因啊?求解答?以下是扫描显示的模块程序
#include<STC12C5A32S2.h>
#include"intrins.h"                        //调用_nop_();延时函数用
#include"initl.h"
#include"typedef.h"
#include"delay.h"

#define  NOP() _nop_()              /* 定义空指令 */

sbit send_DATA  = P5^1;
sbit shuchu_CLK = P5^0;
sbit yiwei_CLK  = P4^0;
sbit EN   = P4^3;、//OE 使能,控制扫描时间
sbit p32  = P3^2;
sbit p33  = P3^3;
sbit p34  = P3^4;
sbit p35  = P3^5;
sbit p44  = P4^4;

uchar data  TD[26];//显示屏最多显示12个汉字也就是192*16的(屏长*屏宽)

uchar code  a[16][4]={ {0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},
                       {0,1,0,0},{0,1,0,1},{0,1,1,0},{0,1,1,1},
     {1,0,0,0},{1,0,0,1},{1,0,1,0},{1,0,1,1},
     {1,1,0,0},{1,1,0,1},{1,1,1,0},{1,1,1,1}};   

//*********装载一行数据函数*************
void load_oneline_data(uchar *LD)//装载一行数据
{
uchar load;

for (load=0;load<l_word + 1;load++)
   {
 TD[load*2]   = *(LD + load*32);
 TD[load*2+1] = *(LD + load*32 + 16);
   }

//*********发送一行数据函数*************
void send_oneline_data(uchar num)//发送一行数据 
{
uchar stup,temp;

EN=1;
   for (stup=0;stup<num;stup++)   
 {  
if(!(stup%8))  temp = TD[stup/8];  
yiwei_CLK = 0; 
if(temp&0x80)  send_DATA = 1;  //根据595第一个输出控制点阵第一列来计算是&0x01还是0x80 
else   send_DATA = 0;
yiwei_CLK=1;
temp = temp<<1;     //根据595第一个输出控制点阵第一列来判断是tempD<<1还是tempD>>1
 } 
shuchu_CLK = 0;
NOP(); 
shuchu_CLK = 1;
}

//*********扫描一行数据函数*************
void scan_oneline(uchar m)        //扫描一行数据,由两个138级联的,1/16的扫描方式
{    
p35= a[m][0];
p34 = a[m][1];
    p33 = a[m][2];
    p32 = a[m][3];
EN  = 0;
delay_us(400);                //大概延时0.2ms
EN  = 1;
}

//*********静态显示函数*********************
void show_chinese(uchar *pd)   //静态显示汉字
{
uchar stup,*pt;

for (stup=0;stup<16;stup++)
 {
 pt = pd + stup;
 load_oneline_data(pt);
 send_oneline_data(16 * l_word);//l_word是总的显示字数     
 scan_oneline(stup);
 }
}

//*********左移显示函数*************
void move_left_scan(uchar *pd,uchar movleft)    //显示左移
{
uchar stup,num,sudu,*pt;

while (movleft--)
 { 
  for (num=0;num<8;num++)        //移动8次
 {
  for (sudu=0;sudu<speed;sudu++)   //控制LED点阵显示屏的速度speed是全局变量,通过上位机可以设置
 {
     for (stup=0;stup<16;stup++)
 {
  pt = pd + stup;
 load_oneline_data(pt);
 send_oneline_data(16 * l_word + num); //l_word是总的显示字数
 scan_oneline(stup);
 }
 }
 }
 pd += 16;
}
}
[解决办法]
视觉暂留
[解决办法]
显示下一屏
延时1毫秒
黑屏

显示下一屏
延时1毫秒
黑屏

显示下一屏
延时1毫秒
黑屏

显示下一屏
延时1毫秒
黑屏

显示下一屏
延时1毫秒
黑屏

显示下一屏
延时1毫秒
黑屏
...............................................................................
[解决办法]
   看了你的显示板的PCB,你是用2片138级联成4/16选择器,在任意时刻最多只能有一路驱动(SDM4953)打开,你的硬件设计比我们以前的要好,不会出现同时有两路打开的情况。所以应该如大家所说,是视觉暂留的问题。


   你可以如下面的代码加点延时试试。


//*********左移显示函数*************
void move_left_scan(uchar *pd,uchar movleft) //显示左移
{
uchar stup,num,sudu,*pt;

while (movleft--)
{   
for (num=0;num<8;num++) //移动8次
{
for (sudu=0;sudu<speed;sudu++) //控制LED点阵显示屏的速度speed是全局变量,通过上位机可以设置
{
for (stup=0;stup<16;stup++)
{
pt = pd + stup;
load_oneline_data(pt);
send_oneline_data(16 * l_word + num); //l_word是总的显示字数
scan_oneline(stup);
}
}

                      /*在这里加延时,先关闭输出,尝试延时1ms-20ms */
EN = 1;
delay(XXX);


}
pd += 16;
}



热点排行