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

2019-07-15 15:48发布

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

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

通过一次性向74HC595发送4个字节的方式,分别控制LED点阵的行与列
现碰到问题如下,为简单描述,用开发板自带的程序向老师们请教(这是显示一个点的程序):
============================================================
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char  
sbit SCK=P3^6;
sbit LCK=P3^5;
sbit 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对应的点阵都亮
请老师指点!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
菜鸟咋飞
1楼-- · 2019-07-15 17:10
请老师们指教!
魂淡。
2楼-- · 2019-07-15 18:32
我是刚刚接触单片机的菜鸟,也正在做16*16的点阵,请楼主分享点经验
辉龙天子
3楼-- · 2019-07-15 21:42
 精彩回答 2  元偷偷看……
从此以后、
4楼-- · 2019-07-16 00:50
学期实习要做这个,收藏一下
有用
从此以后、
5楼-- · 2019-07-16 04:26
谢谢楼主了,谢谢
菜鸟咋飞
6楼-- · 2019-07-16 09:31
找了几个人,据说是编译器为防止程序跑飞编译成自动循环,和加while1一样
顺带,贪吃蛇已经做完了,正在看12864

一周热门 更多>