打印
[51单片机]

关于LED点阵的问题

[复制链接]
817|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
力尽山拔|  楼主 | 2017-2-8 20:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
论坛首问!!!求助大神!!!
本人使用16x16点阵操作,使其显示汉字“普”,接下来我将会发段完整的程序,这两段完整的程序区别只在于主函数有无while(1)循环,我发现两个程序结果一样。
但是,本人认为第二段程序由于没有while(1)循环,结果应该是在LED显示屏上只有“普”字闪一下,而非一直亮着灯,求解!!!

程序一:

#include<reg51.h>
#include <intrins.h>
void delay(int i)
{
while(i--);
}
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
unsigned char ledwei[]={
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char code ledduan1[]={
0x40,0x44,0x54,0x64,0x45,0x7E,0x44,0x44,0x44,0x7E,0x45,0x64,0x54,0x44,0x40,0x00,
0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00,};

void Hc595SendByte(char dat1,char dat2,char dat3,char dat4)
{
int i;
for(i=0;i<8;++i)
{
  SER=dat1>>7;
  dat1=dat1<<1;
  SRCLK=0;
  _nop_();
  _nop_();
  SRCLK=1;
}
for(i=0;i<8;++i)
{
  SER=dat2>>7;
  dat2=dat2<<1;
  SRCLK=0;
  _nop_();
  _nop_();
  SRCLK=1;
}
for(i=0;i<8;++i)
{
  SER=dat3>>7;
  dat3=dat3<<1;
  SRCLK=0;
  _nop_();
  _nop_();
  SRCLK=1;
}
for(i=0;i<8;++i)
{   
  SER=dat4>>7;
  dat4=dat4<<1;
  SRCLK=0;
  _nop_();
  _nop_();
  SRCLK=1;
}
RCLK=0;
_nop_();
_nop_();
RCLK=1;

}
void main()
{
int i;
while(1)
{
  for(i=0;i<16;i++)
  {
    Hc595SendByte(~ledwei[i+16],~ledwei[i],ledduan1[i+16],ledduan1[i]);
    delay(10);
  }
}   
}


程序二:

#include<reg51.h>
#include <intrins.h>
void delay(int i)
{
while(i--);
}
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
unsigned char ledwei[]={
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char code ledduan1[]={
0x40,0x44,0x54,0x64,0x45,0x7E,0x44,0x44,0x44,0x7E,0x45,0x64,0x54,0x44,0x40,0x00,
0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00,};

void Hc595SendByte(char dat1,char dat2,char dat3,char dat4)
{
int i;
for(i=0;i<8;++i)
{
  SER=dat1>>7;
  dat1=dat1<<1;
  SRCLK=0;
  _nop_();
  _nop_();
  SRCLK=1;
}
for(i=0;i<8;++i)
{
  SER=dat2>>7;
  dat2=dat2<<1;
  SRCLK=0;
  _nop_();
  _nop_();
  SRCLK=1;
}
for(i=0;i<8;++i)
{
  SER=dat3>>7;
  dat3=dat3<<1;
  SRCLK=0;
  _nop_();
  _nop_();
  SRCLK=1;
}
for(i=0;i<8;++i)
{   
  SER=dat4>>7;
  dat4=dat4<<1;
  SRCLK=0;
  _nop_();
  _nop_();
  SRCLK=1;
}
RCLK=0;
_nop_();
_nop_();
RCLK=1;

}
void main()
{
int i;
for(i=0;i<16;i++)
{
  Hc595SendByte(~ledwei[i+16],~ledwei[i],ledduan1[i+16],ledduan1[i]);
  delay(10);
}
   

}

相关帖子

沙发
力尽山拔|  楼主 | 2017-2-8 20:19 | 只看该作者
我觉得我应该介绍一下这个程序
通过四个74HC595芯片来控制16x16点阵的四个管脚
函数Hc595SendByte()里面的程序没有问题,该函数的作用是运用串转并的原理将四个十六进制数导入到16x16点阵的四个端口。
数组ledwei充当位选的作用

使用特权

评论回复
板凳
xuyaqi| | 2017-2-9 07:22 | 只看该作者
你是仿真还是有板子试?

使用特权

评论回复
地板
力尽山拔|  楼主 | 2017-2-9 08:13 | 只看该作者
xuyaqi 发表于 2017-2-9 07:22
你是仿真还是有板子试?

有板子的

使用特权

评论回复
5
cheny001| | 2017-2-10 11:00 | 只看该作者
595有锁存功能的,但IO口数据不变的时候会一直保留上一次的值

使用特权

评论回复
6
NE5532| | 2017-2-10 15:18 | 只看该作者
没有while(1),程序跑完了,main函数就Return了,程序就崩溃了,单片机就混乱了,什么也都不对了,没有什么程序不加while(1)的。

使用特权

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

本版积分规则

2

主题

5

帖子

0

粉丝