关于LED点阵显示汉字的问题

2019-07-15 12:01发布

论坛首问!!!求助大神!!!
本人使用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);
}
   

}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
gniquhs
1楼-- · 2019-07-15 16:41
力尽山拔 发表于 2017-2-9 08:10
不不不。。。两个程序都是一直亮着
我是说我预测中程序二的效果是闪一下,实际上程序二的效果是一直亮着

是我看漏了,不好意思。原来你每个程序在Hc595sendByte()函数最后 都进行了锁存操作。
既然锁存了,就算不进行while(1)循环,也是一直亮着的。
在程序2中,就算只有1遍串行输入,输出也被锁存固定,不会变了,所以才一直亮。 最佳答案
力尽山拔
2楼-- · 2019-07-15 21:20
自己顶一下
力尽山拔
3楼-- · 2019-07-15 23:51
 精彩回答 2  元偷偷看……
gniquhs
4楼-- · 2019-07-16 01:27
你这16X16的点阵是什么样的接口啊?最好贴出原理图
粗看你感觉你这16X16点阵就是横着16个接口竖着16个接口,难道是串行转并行之后没有锁存,所以第一个才只闪一下?
力尽山拔
5楼-- · 2019-07-16 03:23
谢谢楼上的意见,原理图已贴,确实是横着16个接口竖着16个接口
D2`]DQ))[INI(N~LLZJP(CJ.png
力尽山拔
6楼-- · 2019-07-16 07:22
gniquhs 发表于 2017-2-8 20:47
你这16X16的点阵是什么样的接口啊?最好贴出原理图
粗看你感觉你这16X16点阵就是横着16个接口竖着16个接口,难道是串行转并行之后没有锁存,所以第一个才只闪一下?

可能我没有表达清楚
我预测的效果是程序一一直亮着,程序二只闪一下
but  实际上是两个程序的效果一样

一周热门 更多>