打印

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

[复制链接]
4973|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
luling5897|  楼主 | 2011-11-14 13:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
麻烦路过的大哥看一下,speed为1时,速度比较快,但是显示很正常,不会有重影现象,当speed为2、3、4是速度是变慢了,但是会出现重影现象,这是什么原因啊?求解答?以下是扫描显示的模块程序
#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;                 、、//138的4脚使能端,低电平有效,高电平时8个输出全为高电平
sbit p32  = P3^2;
sbit p33  = P3^3;
sbit p34  = P3^4;
sbit p35  = P3^5;
sbit p44  = P4^4;

uchar data  TD[26]=
{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};        

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++)                          //执行一次所需时间为48.82us,执行12次的时间为585.84us
           {
                 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++)            //执行一次的时间是17.36us                                                                                                                           
                 {                                                                                                                                                                                                  
                        if(!(stup%8))    temp = TD[stup/8];                                                                                                                                                                                                                                                                                                   
                        if(temp & 0x80)  send_DATA = 1;          //根据595第一个输出控制点阵第一列来计算是&0x01还是0x80                                                                                                                 
                        else                     send_DATA = 0;        
                        temp = temp<<1;                                     //根据595第一个输出控制点阵第一列来判断是tempD<<1还是tempD>>1
                        yiwei_CLK = 0;
                        NOP();                                                                                                        
                        yiwei_CLK = 1;                                                                                                                                                                                                                                                                                       
                 }
                        shuchu_CLK = 0;
                        NOP();                                                                                                                                                                                 
                        shuchu_CLK = 1;                                                                                                                                                
}

//*********扫描一行数据函数*************
void scan_oneline(uchar m)                                //扫描一行数据 ,执行一次的时间是786.67us ,执行16次为12586.72us
{            
                        p35        = a[m][0];
                        p34 = a[m][1];
                    p33 = a[m][2];
                    p32 = a[m][3];
                        EN  = 0;
                        delay_us(150);                        //大概延时0.75ms
                        EN  = 1;
                        delay_us(1);                        //大概延时5us
                        EN  = 0;         
}

//*********静态显示函数*********************
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是总的显示字数,通过上位机可以设置,最大的字数是12个字            
                         scan_oneline(stup);
                 }
}

//*********左移显示函数*************
void move_left_scan(uchar *pd,uchar movleft)               //显示左移 ,一帧的扫描频率大概是60HZ
{
        uchar stup,num,sudu,*pt;

        while (movleft--)
                 {         
                  for (num=0;num<8;num++)                                       //移动8次
                         {
                          for (sudu=0;sudu<1 + 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是总的显示字数,通过上位机可以设置,最大的字数是12个字

                                                 scan_oneline(stup);
                                                 delay_us(4);                           //扫描16次为320us
                                         }
                                        EN = 1;
                                    delay_us(200);                                   //大概延时1ms                                                                                                                    
                                 }
                         }
                 pd += 16;
                }
}

相关帖子

沙发
luling5897|  楼主 | 2011-11-15 13:01 | 只看该作者
没人能解决吗?给点建议也行啊。。。

使用特权

评论回复
板凳
Enowis| | 2011-11-15 13:08 | 只看该作者
每次变化之前全部清零,就是让LED什么都不显示。然后再变化!

使用特权

评论回复
地板
hotpower| | 2011-11-15 13:09 | 只看该作者
拖尾,这个要反复实验的。刷新时间超过一定时间就会出现,故不易过慢。

使用特权

评论回复
5
luling5897|  楼主 | 2011-11-15 13:36 | 只看该作者
3# Enowis


你是说扫描完一行之后全部清零吗?

使用特权

评论回复
6
hotpower| | 2011-11-15 13:58 | 只看该作者
做实验即可。就是关显示。

使用特权

评论回复
7
Enowis| | 2011-11-15 14:14 | 只看该作者

使用特权

评论回复
8
luling5897|  楼主 | 2011-11-15 14:29 | 只看该作者
6# hotpower 硬件已经做好了,就是程序总调都有这个问题,扫描一帧时间大概是60HZ

使用特权

评论回复
9
luling5897|  楼主 | 2013-3-14 12:59 | 只看该作者
时隔一年多才来结帖子,现在重影是没什么问题了,只是8扫的时候有错位的现象,这个还没想到好办法来解决。

使用特权

评论回复
10
XZL| | 2013-3-14 13:16 | 只看该作者
重影是因为你删除的速度慢了。建议先清除上次的显示内容,然后再送当前显示内容

使用特权

评论回复
11
ch852140063| | 2013-6-30 08:45 | 只看该作者
想必串行输入的使能端你没用吧,那是消消影必备。快的时候也有重影,你看不出来罢了。
送完数据后     595OE=0;
                delay(xxx);
               595OE=1;
完美消影

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

35

帖子

1

粉丝