单片机/MCU论坛
直播中

菜鸟咋飞

8年用户 6经验值
擅长:182370
私信 关注
[问答]

关于16*16点阵,用74HC595控制问题请教,谢谢老师

用的某开发板,其原理图如下: 1、原理图.jpg

通过4个74HC595控制点阵的行与列

通过一次性向74HC595发送4个字节的方式,分别控制LED点阵的行与列
现碰到问题如下,为简单描述,用开发板自带的程序向老师们请教(这是显示一个点的程序):
============================================================
#include
#include
#define uchar unsigned char  
***it SCK=P3^6;
***it LCK=P3^5;
***it SDI=P3^4;
void HC595_Send(uchar dat1,uchar dat0,uchar dat2,uchar dat3);
void main()
{
        while(1)
        {        
                HC595_Send(0xff,0xfe,0x80,0x00);
        }        
}
void HC595_Send(uchar dat1,uchar dat0,uchar dat2,uchar dat3)
{
        uchar i;
        SCK=1;
        LCK=1;
        for(i=0;i<8;i++)
        {
                SDI=dat0&0x01;                //从高位到低位
                dat0>>=1;
                SCK=0;
                _nop_();
                _nop_();
                SCK=1;
                _nop_();
                _nop_();        
        }
        for(i=0;i<8;i++)
        {
                SDI=dat1&0x01;                //从高位到低位
                dat1>>=1;
                SCK=0;
                _nop_();
                _nop_();
                SCK=1;
                _nop_();
                _nop_();        
        }
        for(i=0;i<8;i++)
        {
                SDI=dat2&0x01;                //从高位到低位
                dat2>>=1;
                SCK=0;
                _nop_();
                _nop_();
                SCK=1;
                _nop_();
                _nop_();        
        }
        for(i=0;i<8;i++)
        {
                SDI=dat3&0x01;                //从高位到低位
                dat3>>=1;
                SCK=0;
                _nop_();
                _nop_();
                SCK=1;
                _nop_();
                _nop_();        
        }
        LCK=0;        //下面是输出时钟
        _nop_();
        _nop_();
        LCK=1;
        _nop_();
        _nop_();
}
=====================================================
这个自带的程序dat0和dat1搞混了,在这里不是重点
我的疑问点在于,通过实验:
如果
while(1)
        {        
                HC595_Send(0xff,0xfe,0x80,0x00);
        }

我增加一行,同时去掉while(1)
HC595_Send(0xff,0xfe,0x80,0x00);
HC595_Send(只能显示一个点的数据);


那么一共显示两个点,但应该是第一个点瞬间显示一下,之后595数据更新,显示第二个点,不更新不变化
可实际上这两个点一直常亮,经过多次试验都是如此
如果有多个HC595_Send,按照道理每次595更新一次数据后点阵对应的点亮,上次更新前的不应该亮了
可实际做多次试验却是每次HC595_Send对应的点阵都亮
请老师指点!

已退回1积分

回帖(13)

菜鸟咋飞

2015-10-27 16:35:24
请老师们指教!
举报

xc

2015-12-9 20:46:50
我是刚刚接触单片机的菜鸟,也正在做16*16的点阵,请楼主分享点经验
举报

辉龙天子

2015-12-13 16:30:35
楼主找到解决办法没?
举报

李洁雯

2015-12-23 16:04:37
学期实习要做这个,收藏一下
有用
举报

李洁雯

2015-12-23 16:04:57
谢谢楼主了,谢谢
举报

菜鸟咋飞

2015-12-24 22:11:13
找了几个人,据说是编译器为防止程序跑飞编译成自动循环,和加while1一样
顺带,贪吃蛇已经做完了,正在看12864
举报

谁啊

2015-12-24 22:33:09
增加延时试试。。。
举报

菜鸟咋飞

2015-12-28 23:05:29
12864驱动已完成:)
举报

谢尚军

2015-12-31 15:36:40
学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习
举报

cwq112

2016-4-9 21:41:33
我也在做这个,但我的一个点都不亮,想请教一下,最简单的一个都不成功,下面复杂的做不下去,恳请会的解释一下
举报

cjj802314

2016-5-2 11:35:39
请问楼主一次发送4个字节如何控制行与列啊,没看懂
举报

你猜mt

2016-5-16 14:41:30
楼楼,我硬件部分的链接不会啊怎么办?我用的是msp430,驱动芯片跟你一样的,能告诉我怎么连吗?
举报

张银洁

2016-8-1 11:11:26
很有用   收藏了  楼主一个赞
举报

更多回帖

发帖
×
20
完善资料,
赚取积分