www.openedv.com
您好,欢迎您!    会员注册 | 登入 
公告:欢迎访问www.openedv.com开源电子网,开源共享共同进步,祝您新年快乐,万事如意!
设为首页 | 加入收藏
论坛首页 » 51单片机 前往: 
LED点阵左移显示有重影该怎么解决?求帮忙
发表人 内容
[Down] [Up]
[楼主位] luling5897

等级:NO
注册时间:
2011/11/02 12:04
文章: 4
来自: 江苏 
离线

 麻烦路过的大哥看一下,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 shift_DATA = P5^1;
sbit latch_CLK  = P5^0;
sbit shift_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;             //关闭138,关闭显示屏的显示 
    for (stup=0;stup<num;stup++)                  //执行一次的时间是17.36us                 
   {                         
   if(!(stup%8))     temp = TD[stup/8];                                      
   if(temp & 0x80)   shift_DATA = 1;   //根据595第一个输出控制点阵第一列来计算是&0x01还是0x80              
   else        shift_DATA = 0; 
   temp = temp<<1;              //根据595第一个输出控制点阵第一列来判断是tempD<<1还是tempD>>1
   shift_CLK = 0;
   NOP();             
   shift_CLK = 1; 
   delay_us(1);                                  
   } 
   latch_CLK = 0;
   NOP();                     
   latch_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
      }
      delay_us(200);          //大概延时1ms                 
     }
    }
   pd += 16;
  }
}




既然选择了就要一直走下去。。。。。
[加为好友] 回复 引用回复
[Down] [Up]
[1楼] 正点原子


等级:NO
注册时间:
2010/12/02 10:41
文章: 8089
来自: 湖南
在线

这个一般是你有个别地方数据发送顺序有点问题.自己查查吧.



我的淘宝小店:http://shop62103354.taobao.com
[加为好友] 回复 引用回复
 
前往: 

Powered by ALIENTEK工作室 © 粤ICP备12000418号-1