pzhmgzxs 2019-07-28 22:48 采纳率: 0%
浏览 1019

51单片机在led点阵中,我编的是心形灯,为什么灯全亮了

#include "reg52.h"
#include "intrins.h"

typedef unsigned char u8;
typedef unsigned int u16;

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

u16 code duan[]={0xff,0x48,0x44,0x22,0x44,0x48,0x30,0x00};
u16 code wei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

void delay(u8 i)
{
while(i--);
}

void Hc(u8 led)
{
u8 a;
SRCLK=0;
RCL=0;
for(a=0;a {
SER=led>>7;
led<<=1;
SRCLK=1;
nop();
nop();
SRCLK=0;
}
RCL=1;
nop();
nop();
RCL=0;
}

void main()
{
u16 j;
while(1)
{
for(j=0;j<8;j++)
{
P0=wei[j];
Hc(duan[j]);
delay(100);
Hc(0x00);
}
}
}

  • 写回答

1条回答 默认 最新

  • wangyq891 2019-08-12 16:06
    关注

    没看见你的硬件原理图。不好说问题在哪。

    猜测你应该用了74LS595电路。移位写入的部分看着好像有问题,或者是没发全。

    附上一段74LS595的写入程序:
    /*********************************************/
    //函数名称:IO_74ls595_send(unsigned int dat)
    //函数功能:数据发送函数(32位)
    //返 回 值:无
    /*********************************************/
    void IO_74ls595_send(unsigned long dat)
    {
    uchar data i;

    IO_74ls595_RCLK = 0;    //: 锁存RCLK输出0
    IO_74ls595_SRCLK = 0;       //:移位寄存器时钟=0
    
    for(i=0;i<32;i++)       //:0xffffffff,高位在前,低位在后
    {
        if(dat&0x80000000)      //利用&运算 取数
        {
            IO_74ls595_SER=1;
        }
        else
        {
            IO_74ls595_SER=0;
        }
        IO_74ls595_SRCLK = 1;
        dat = dat<<1;
        IO_74ls595_SRCLK = 0;
    }
    
    IO_74ls595_RCLK = 1;    //: CS44-RCLK输出1
        _nop_();    _nop_();
    IO_74ls595_RCLK = 0;    //: CS44-RCLK输出0
    

    }

    该段代码经过验证,是正确可用的。供参考。

    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!