1、首先数码管分为1位,4位,8位,4位和8位的又分为共阴和共阳数码管。
2、共阳数码管,即阳极全部连接在一起,单片机接口给低电位即可点亮对应的段位。
3、可利用MCS-51系列单片机的芯片AT89C52的P3.4,P3.5,P3.6,P3.7进行计时并在数码管上显示时间,作为按键的入口。
4、共阴数码管,即阴极全部连接在一起,单片机接口给高电位即可点亮对应的段位。
5、其中“开始”按键当开关由上向下拨时开始计时,此时若再拨“开始”按键则数码管暂停;“清零”按键当开关由上向下拨时数码管清零,此时若再拨“开始”按键则又可重新开始计时。
本人是菜鸟级别的,能否帮忙提供一个程序示例。
追答给一个仿真图,给出的程序是在这个仿真图上测试通过的,与你显示电路很相似,所以,显示子程序可以移植的,但是HC595的引脚需要重新定义的。
程序:
#include <reg52.h>
#include <INTRINS.H>
sbit sclk=P1^7; //HC595第11脚,串行时钟输入端
sbit sdat=P1^6; //HC595第14脚,串行数据输入端
sbit cpla=P1^5; //HC595第12脚,输出锁存脉冲输入端
sbit ins1=P3^2; //外接按钮
unsigned char dis[]={0,1,2,3,4}; //定义显示缓冲区4个单元
unsigned char code segment[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,
0x27,0x7F,0x6F}; //定义共阴数码管段码
//*串行输出一个字节子函数
void hc595(unsigned char word)
{
unsigned char i;
for (i=8;i>0;i--)
{
sclk=0;
sdat=0x80&word;
word=_crol_(word,1);
sclk=1;
_nop_();
}
}
//**显示子函数**//
void display()
{
unsigned char j;
for (j=4;j>0;j--)
{
hc595(segment[dis[j]]);
}
cpla=1;
_nop_();
cpla=0;
}
//****主函数****//
void main()
{
unsigned char j;
cpla=0;
while (1)
{
display(); //调用显示子程序
if(ins1==0) //按一次键,每位显示数加1
{
for(j=1;j<4;j++)
dis[j]=dis[j+1];
dis[4]++;
if(dis[4]>9)dis[4]=0;
while(ins1==0);
}
}
}
其中的主函数你不用,其余两个子函数是可以移植的。
怎么控制某一位数码管显示,例如只要一个数码管显示数字其他的不显示
追答既然用了4位数码管,可为什么只显示一位呢?这实现这个要求也很简单的,定义段码表时,再加一个全灭的段码就好了,全灭的段码是0,在段码表中排第10,所以,哪一位灭,就在哪一位的显示缓冲区写入0:
例如,只在第一位显示1时,定义显示缓冲区如下:其余三位为灭
unsigned char dis[]={0,1,10,10,10}; //定义显示缓冲区4个单元,第一个单元为空
unsigned char code segment[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,
0x27,0x7F,0x6F,0}; //定义数字0-9共阴数码管段码,最后一个为灭的段码
为了显示效果,主程序也改成如下的:
//****主函数****//
void main()
{
unsigned char j,n=1,i=1;
cpla=0;
while (1)
{
display(); //调用显示子程序
if(ins1==0) //按一次键,显示下一位
{
i++;if(i>4)i=1; //要显示的位
n++;if(n>9)n=0; //要显示的数
for(j=1;j<5;j++)
dis[j]=10; //灭掉所有位
dis[i]=n; //第i位显示n
while(ins1==0);
}
}
}
效果图