我没有仔细研究你的电路,但能大致理解你的软件的作用。给你提供几点排查问题的思路。
能否实现8个数码管同时静态地显示数字?例如可以在main()函数里这样写:
void main(void){
// MAX7219初始化
InitDisplay();
// 在8个数码管分别静态地显示数字0~7
WriteWord(Digit0, 0);
WriteWord(Digit1, 1);
WriteWord(Digit2, 2);
WriteWord(Digit3, 3);
WriteWord(Digit4, 4);
WriteWord(Digit5, 5);
WriteWord(Digit6, 6);
WriteWord(Digit7, 7);
// 无限循环
while (1) ;
}
如果这一步还做不到,有可能的原因是:
1) 电路有问题;
2) MAX7219初始化函数InitDisplay()有问题;
3) WriteWord()函数有问题。
你需要再去仔细查看芯片的Datasheet。
如果这一步可以做到,那么主要问题就在main()函数里。
按照我的理解,你是想在无限循环体里,依次往Digit0~Digit7写入0~7,期望显示出来的效果是
01234567 --> 12345670 --> 23456701 -->
但你目前的main()函数有几个可能存在问题的地方:
1) 往Digit0写入的是DisBuffer数组的值;而写入Digit1~Digit7的是db数组的值。DisBuffer初始化为全0后就没有修改过,那么写入Digit0的就总是0。
2) 在8位C51单片机上做求余运算是很费CPU资源的。而且db数组的内容在初始化之后就没有变,实际上只是当做常量来使用。优化的写法是:
void main(void){
uchar i;
// MAX7219初始化
InitDisplay();
i = 0;
#define WRITE_WORD(n) \
WriteWord(Digit##n, ((i++) & 0x7))
while (1)
{
delay(200);
WRITE_WORD(0);
WRITE_WORD(1);
WRITE_WORD(2);
WRITE_WORD(3);
WRITE_WORD(4);
WRITE_WORD(5);
WRITE_WORD(6);
WRITE_WORD(7);
}
#undef WRITE_WORD
}
++运算和按位与运算都是很快的。
你这是实物,还是仿真?是用两片74HC573
锁存器
的电路吗?段码和位码是从P2口输出的,那P0=0x00;什么用?
duankong();
//打开段控
weikong();
//打开位控
这两个是控制锁存器的吗?
最好把仿真图或原理图贴上来。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)