首先我们来了解一下为什么点阵他会亮?看下面的电路图
点阵亮的条件有2个:1.阴极为0,2.阳极为1
先说第一个条件因为点阵的阴极是接在u1 74hc573上的,而这个573是接在p0口的,与数码管和流水灯的控制端口重复,所以我们在驱动数码管或者流水灯的时候也会有可能把点阵的阴极置为了0,这时候一旦点阵阳极的某个脚为1,第2个条件也成立了点阵就会立刻出现亮条, 那么为什么阳极会出现1呢?因为我们没有对74hc164进行初始化,他输出的是一个随机值
那么如何不让他亮呢?其实我们只要在程序的开头将74hc164的所有输出引脚初始化为0,则点阵将不会再亮
1.c语言的解决办法:
这个功能我已经写在51hei.h 这个头文件里了
你只需要在程序的开头写一行#include"51hei.H" 并且把51hei.h文件复制到当前目录 然后在main主函数的开头加入下面2个函数即可
guanled(); //关8个数码管
guandz(); //关8*8点阵
关于这两个函数的原理51hei.h里有非常详细的注释你可以看看.
51hei.h这个文件及其使用范例http://www.51hei.com/f/流水灯_c语言.rar 你在"程序"文件夹中搜索一下便可找到很多.
2.汇编语言的解决办法: ;以下5行的功能是关闭8*8点阵的输出,也就是把所有的行置0,这样不管列为任何电平点阵都不会亮了. MOV R2,#8 ;输出数据8位 hei: CLR P2.4 ;拉低SCL,以便下次拉高便可产生上升沿 CLR P2.5 ;数据先送入74hc164,等待clk上升沿的到来 SETB P2.4 ;低电平到高电平边沿触发到来,并行数据输出至164的Q0-Q7 DJNZ R2,hei ;判断输出完毕了没有
总结: 虽然流水灯,数码管,8*8点阵这3个设备都是接在p0口上的,但因其各自都具有使能端(可令其有效或失效) ,使得我们能独立的控制其中的某一个设备,互不干扰,这样设计的好处就是节约了单片机有限的端口资源
[此贴子已经被作者于2011-1-29 17:50:38编辑过]
|