普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 1434|回复: 4

51LED点阵重叠问题

[复制链接]

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2023-10-2 22:01:48 | 显示全部楼层 |阅读模式
#include"reg52.h"
typedef unsigned char u8;
u8 gled_banana[8] = {0x0C,0x34,0xC9,0xF3,0x7D,0x82,0x8E,0x70};
u8 gled_love[8] = {0x38,0x44,0x82,0x41,0x41,0x82,0x44,0x38};
u8 gled_ball[8] = {0x3C,0x42,0x81,0x81,0x81,0x81,0x42,0x3C};
u8 gled_gpurd[8] = {0x00,0x06,0x69,0x91,0x91,0x69,0x06,0x00};
u8 gled_posion[8] = {0x00,0x3E,0xFB,0xF7,0xEF,0xDF,0x3E,0x00};
u8 gled_welcome[8] = {0x48,0xD7,0x60,0x07,0xBD,0xAF,0xBF,0x05};
u8 gled_pay_money[8] = {0x06,0x61,0x91,0xFF,0x91,0xFF,0x91,0x1E};
u8 gled_lie[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
u8 gled_pay_OK[8] = {0x3C,0x42,0x3C,0x00,0xFF,0x18,0x24,0xC3};
u8 gled_no_commodity[8] = {0x12,0x12,0x94,0xF8,0xFE,0x91,0x11,0x13};

#define        SMG_A_DP_PORT P0
#define BANANA 0
#define LOVE 1
#define BALL 2
#define GPURD 3
#define POSION 4
#define WELCOME 5
#define PAY_MONEY 6
#define PAY_OK 7
#define NO_COMMODITY 8

sbit SMG_C = P2^2;
sbit SMG_B = P2^3;
sbit SMG_A = P2^4;

sbit rCLK = P3^5;
sbit SRCLK = P3^6;
sbit SER= P3^4;

void delay(u8 num)
{
        while(num--);
}
void write_hx(u8 dat)
{
        u8 i = 0;
        for (i=0;i<8;i++)
        {
                SER = dat>>7;
                dat <<= 1;
                SRCLK = 0;
                delay(1);
                SRCLK = 1;
                delay(1);
        }
        rCLK = 0;
        delay(1);
        rCLK = 1;
        delay(1);
}
void  LED_display(u8 screen_display)
{
        u8 i = 0;       
        for (i=0;i<8;i++)
        {
                SMG_A_DP_PORT = gled_lie[i];
                switch (screen_display)
                {
                        case 0:        write_hx(gled_banana[i]);break;
                        case 1:        write_hx(gled_love[i]);break;
                        case 2:        write_hx(gled_ball[i]);break;
                        case 3:        write_hx(gled_gpurd[i]);break;
                        case 4:        write_hx(gled_posion[i]);break;
                        case 5:        write_hx(gled_welcome[i]);break;
                        case 6:        write_hx(gled_pay_money[i]);break;
                        case 7:        write_hx(gled_pay_OK[i]);break;
                        case 8: write_hx(gled_no_commodity[i]);break;
                }
                delay(100);
                write_hx(0x00);
        }
       
}
void main(void)
{
        while (1)
        {
                LED_display(0);
                delay(100000);
                SMG_A_DP_PORT = 0x00;
                write_hx(0x00);
                LED_display(4);
                delay(100000);
       
        }
}
为什么烧入单片机后会立马出现个重合影像,LED_display(4);LED_display(0);删掉一个就行,就是每个图像的样子,但是这是为什么呢,请大佬指教
回复

使用道具 举报

0

主题

10

帖子

83

积分

注册会员

Rank: 2

积分
83
发表于 2023-10-9 17:02:55 | 显示全部楼层
是不是没有消影
回复 支持 反对

使用道具 举报

14

主题

48

帖子

258

积分

中级会员

Rank: 3Rank: 3

积分
258
发表于 2023-10-15 20:17:47 | 显示全部楼层
先说结论:问题的原因是延时函数“delay()”的问题,两个图像之间的时延太小了,所以图像重叠,u8改成u16才行

思路是:凡是和数码管或LED点阵有关的问题,通常先考虑人眼的余晖效应是否处理好了,图像重叠多是两个图像扫描的间隔不足,导致两个图像在人眼的余晖效应下叠加在一起。

两个图像间的间隔是由延时函数“delay()”实现的,通常u16的一次减法是10us,而u8会由于数据类型从2字节缩减为1字节远远小于10us。所以就造成了图像1刚刷新完就立即被图像2刷新(消影确实做了没问题,但起不到消灭余晖的效果),反复循环就造成两个图像重叠。
附件是修正后的代码,两幅图像扫描的次数进行了延长,这样看起来更好些,不会一闪即逝。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

0

主题

1

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2023-12-14 10:42:19 | 显示全部楼层
SMG_A_DP_PORT = gled_lie[i];这个是什么作用呢
回复 支持 反对

使用道具 举报

14

主题

48

帖子

258

积分

中级会员

Rank: 3Rank: 3

积分
258
发表于 2023-12-17 15:11:14 | 显示全部楼层
Qpwo 发表于 2023-12-14 10:42
SMG_A_DP_PORT = gled_lie;这个是什么作用呢

这个就是控制8x8点阵的列,“lie”就是“列”的拼音。数组里u8 gled_lie[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};的16进制数转换成二进制数是从高到低将一位置0,这样就配合行取值高电平来控制哪个LED亮。8次循环把8列逐一扫描一遍。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-27 21:11 , Processed in 0.108428 second(s), 31 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表