现在在弄51 驱动数码管
用P0口控制6个数码管的显示。想简单些:
1:位选:将六个数码管都打开,即位选选中所有数码管 后不再位选 即每次显示都是6个数码管一起显示
2:段选:将所有数码管从0——F显示(共阴数码管)。
编译下载后:出现的现象是,显示的数字是正确的,但不是每个数码管都亮 数量不定 位置不定 经分析是因为位选没有锁存住。。但是明明根据74HC537真值表。。做了相关操作啊??弄了两天,实在没得头绪了。。求教大家了。。。
代码如下:
#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
uint8 numeber[]={0x3f,0x06,0x58,0x4f, //共阴极数码管
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0X77,0x7c,
0x58,0x5e,0x79,0x71};
sbit DU=P2^6;
sbit WE=P2^7;
main()
{
uint8 counter, i;
TMOD=0x01; //工作在01模式
WE=1; //WE==1时候,表示输入和输出一样,数据不锁存。
 0=0xc0; //送入位选信号 应该是全部位都选通(应该全部亮)
WE=0; //WE==0时候,表示输入不改变输出,数据锁存。
 0=0xff;(消影)
TH0=0xB8;//设定20MS延时
TL0=0X00;
TR0=1;
while(1)
{
if(TF0==1)
{
TF0=0;
TH0=0xB8;
TL0=0x00;
counter++;
}
if(counter==50) //延时50次 刚好1S
{
DU=1; //每次延时一秒后,不锁存数据,即改变数据输入。
 0=numeber[i++];//改变输入数据
DU=0; //改变后锁存数据
counter=0; //计数变量变为0
}
if(i==16) //如果现实完F返回从0开始显示
{
i=0;
}
}
}
|