打印
[51单片机]

LED点阵重影问题?

[复制链接]
1685|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
慧剑温情|  楼主 | 2018-4-19 22:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用4个点阵做成的16X16点阵,显示一个汉字向上移动时会有重影,请问如何解决?
以下为代码及原理图
#include<reg52.h>

sbit DS=P0^0;
sbit SH=P0^1;
sbit ST=P0^2;

unsigned char code LED1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x37,0x10,0x80,0x60,0x20,0x0B,0x10,0x20,0xE0,0x20,0x20,0x20,0x2F,0x20,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
unsigned char code LED2[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xFC,0x40,0x40,0x40,0x48,0xFC,0x40,0x40,0x40,0x40,0x40,0x44,0xFE,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
unsigned char code LED3[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x37,0x10,0x80,0x60,0x20,0x0B,0x10,0x20,0xE0,0x20,0x20,0x20,0x2F,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char code LED4[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xFC,0x40,0x40,0x40,0x48,0xFC,0x40,0x40,0x40,0x40,0x40,0x44,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
#define  Timer  2500


void hc595_in(unsigned char dat)
{
        unsigned char z;
        for(z=0;z<8;z++)
        {
                if((dat&0x80)==0x80)
                {
                        DS=1;
                }
                else
                {
                        DS=0;
                }
                dat=dat<<1;
                SH=0;
                SH=1;
                  
        }
}

void hc595_out()
{
        ST=0;
        ST=1;
}  

void main()
{
         TMOD=0x01;
         TH0=(65536-Timer)/256;
         TL0=(65536-Timer)%256;
         ET0=1;
         TR0=1;
         EA=1;
         P2 = 0xFF;
         while(1);

}

void interrupttimer0() interrupt 1
{
    static unsigned char numhang=0;
        static unsigned char cnt=0;
        static unsigned char t=0;
        TH0=(65536-Timer)/256;
        TL0=(65536-Timer)%256;
        P2 = 0xFF;               

        switch(numhang)
        {
                case 0:               
                        hc595_in(LED4[numhang+cnt]);
                        hc595_in(LED3[numhang+cnt]);
                        hc595_in(LED2[numhang+cnt]);
                        hc595_in(LED1[numhang+cnt]);               
                        hc595_out();
                        P2=0x7F;       
                  numhang++;
                        break;
                case 1:                         
                        hc595_in(LED4[numhang+cnt]);
                        hc595_in(LED3[numhang+cnt]);  
                        hc595_in(LED2[numhang+cnt]);
                        hc595_in(LED1[numhang+cnt]);       
                        hc595_out();
                        P2=0xBF;       
                  numhang++;
                        break;       
                case 2:       
                           hc595_in(LED4[numhang+cnt]);
                        hc595_in(LED3[numhang+cnt]);
                        hc595_in(LED2[numhang+cnt]);
                        hc595_in(LED1[numhang+cnt]);       
                        hc595_out();
                        P2=0xDF;       
                  numhang++;;
                        break;       
                case 3:               
                        hc595_in(LED4[numhang+cnt]);
                        hc595_in(LED3[numhang+cnt]);   
                        hc595_in(LED2[numhang+cnt]);
                        hc595_in(LED1[numhang+cnt]);       
                        hc595_out();
                        P2=0xEF;       
                  numhang++;
                        break;
                case 4:       
                        hc595_in(LED4[numhang+cnt]);
                        hc595_in(LED3[numhang+cnt]);          
                        hc595_in(LED2[numhang+cnt]);
                        hc595_in(LED1[numhang+cnt]);       
                        hc595_out();
                        P2=0xF7;       
                  numhang++;
                        break;
                case 5:               
                        hc595_in(LED4[numhang+cnt]);
                        hc595_in(LED3[numhang+cnt]);
                        hc595_in(LED2[numhang+cnt]);
                        hc595_in(LED1[numhang+cnt]);       
                        hc595_out();
                        P2=0xFB;       
                  numhang++;
                        break;       
                case 6:       
                        hc595_in(LED4[numhang+cnt]);
                        hc595_in(LED3[numhang+cnt]);         
                        hc595_in(LED2[numhang+cnt]);
                        hc595_in(LED1[numhang+cnt]);       
                        hc595_out();
                        P2=0xFD;       
                  numhang++;;
                        break;       
                case 7:               
                        hc595_in(LED4[numhang+cnt]);
                        hc595_in(LED3[numhang+cnt]);       
                        hc595_in(LED2[numhang+cnt]);
                        hc595_in(LED1[numhang+cnt]);       
                        hc595_out();
                        P2=0xFE;       
                  numhang=0;       
                        break;
               
                        default:
                        break;               
        }
        t++;
        if(t>=20)
        {
                t=0;
                cnt++;
                if(cnt>=32)
                {
                        cnt=0;
                }
        }       
}

原理图.PNG (61.52 KB )

原理图.PNG

相关帖子

沙发
xyz549040622| | 2018-4-19 23:33 | 只看该作者
论坛的消息真不方便。直接@xyz549040622更方便

使用特权

评论回复
板凳
xyz549040622| | 2018-4-19 23:34 | 只看该作者
上传你的工程包,我看看。

使用特权

评论回复
地板
慧剑温情|  楼主 | 2018-4-20 07:49 | 只看该作者
xyz549040622 发表于 2018-4-19 23:34
上传你的工程包,我看看。

昨晚睡的早,晚上发给你,马上去上班了,谢谢!@xyz549040622

使用特权

评论回复
5
coody| | 2018-4-20 11:32 | 只看该作者
视觉暂留造成的吧?消除不了的,只能减弱。

使用特权

评论回复
6
慧剑温情|  楼主 | 2018-4-20 18:56 | 只看该作者
xyz549040622 发表于 2018-4-19 23:34
上传你的工程包,我看看。

@xyz549040622

点阵16x16.rar

103.98 KB

使用特权

评论回复
7
xyz549040622| | 2018-4-20 22:37 | 只看该作者

我感觉是你的算法不对引起的,你把固定显示的一个字的字符编码贴上来。比如显示一个汉字,把这个固定的编码发上来。

使用特权

评论回复
8
慧剑温情|  楼主 | 2018-4-20 22:59 | 只看该作者
xyz549040622 发表于 2018-4-20 22:37
我感觉是你的算法不对引起的,你把固定显示的一个字的字符编码贴上来。比如显示一个汉字,把这个固定的编 ...

@xyz549040622

程序16x16固定-一个字.rar

32.33 KB

使用特权

评论回复
9
xyz549040622| | 2018-4-21 10:13 | 只看该作者

固定一个字也是看见有闪烁的,程序是没有问题的,只能归结于仿真的缺陷了。

使用特权

评论回复
10
慧剑温情|  楼主 | 2018-4-21 12:55 | 只看该作者
xyz549040622 发表于 2018-4-21 10:13
固定一个字也是看见有闪烁的,程序是没有问题的,只能归结于仿真的缺陷了。 ...

行,谢谢你!

使用特权

评论回复
11
xch| | 2018-4-22 17:14 | 只看该作者
你这程序表示图形显示每20周期位移一行。 不知你刷新周期是多少,你可以试试每当t =19时输出消隐帧(全黑)看看是不是改善了。

使用特权

评论回复
12
xch| | 2018-4-22 17:20 | 只看该作者
你这程序表示图形显示每扫描显示20行位移一行。实际上没有显示完整一帧图像。一帧是扫描8行。
所以,改成 每扫描24行位移一行为好。  
另外,每次位移前插入一黑帧。

使用特权

评论回复
评论
xch 2018-4-22 17:21 回复TA
if(t>=20) 改成 if(t>=24) 
13
慧剑温情|  楼主 | 2018-4-23 13:35 | 只看该作者
xch 发表于 2018-4-22 17:20
你这程序表示图形显示每扫描显示20行位移一行。实际上没有显示完整一帧图像。一帧是扫描8行。
所以,改成  ...

插入一黑帧怎么弄?

使用特权

评论回复
14
xch| | 2018-4-23 15:11 | 只看该作者
慧剑温情 发表于 2018-4-23 13:35
插入一黑帧怎么弄?

if ( t<24)switch(numhang)
{
....
}

if (t>=25)
{
t=0;
.....
}

改两地方

25次中断显示24次,另外一次消隐

使用特权

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

本版积分规则

9

主题

39

帖子

1

粉丝