麻烦路过的大哥看一下,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;
}
}
|