一.原理:
1.(如何用仅用一组P0口段选控制5位数码管)?
假设5位数码管由5个IO口控制5个端,首先关闭5个端口,然后打开com1(以下简称cn),将c1控制的数码管显示一个数,然后关闭c1,打开c2,将c2控制的数码管显示一个数,关闭c2,期间会发现数码管1显示一个数字,然后灭,随后数码管2显示一个数字,然后灭。因此,只需将亮灭频率降低至肉眼可见范围即可产生同时显示2个数字的现象。
2.如何实现计时?
假设计数范围为(0~100)利用数字编码方式显示数字。
共阳极(0-9)编码为
table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};
设数字为i;
个位为i%10
十位为i/10
二.遇到的问题
1.出现闪烁:
原因:
在设置i++的间隔时,c1-c5均为0,不显示,i++结束后,数字显示,因此数码管会闪烁,且闪烁间隔为i++的间隔。
解决方法:
通过循环亮灯部分,设置循环次数以达到控制计数的时间间隔。而i++部分不进行延迟,即显示01时循环亮灭500次约1ms,随机i++,显示02,以此类推,既实现计数间隔的设置,且不出现闪烁。
三.硬件部分:
单片机:stc8a8k64d系列
数码管:共阳极5位数码管
·数码管引脚-编码对应图
四.代码部分
1.初始部分
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
void delays(uint);
sfr P5=0xc8;
sfr P0M0 = 0x94;
sfr P0M1 = 0x93;
sfr P2M0 = 0x96;
sfr P2M1 = 0x95;
2.建立编码(0-8)采用共阳极数码管
unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};
3.delay(延迟函数的定义)
void delays(uint xms)
{uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
4.IO口的定义
sbit key=P5^1;//按键(开关)
sbit k1=P2^5;//接com端
sbit k2=P2^4;//接com端
sbit k3=P2^3;//接com端
sbit k4=P2^6;//接com端
sbit k5=P2^7;//接com端
5.主程序部分
int i;
int j;
void main()
{P0M0=0;
P0M1=0;
P2M0=0xff;
P2M1=0;
k1=0;
k2=0;
k3=0;
k4=0;
k5=0;
while(1)
{i++;j=300;
while(j>0){
k1=1;
if(key==0)
i=0;
P0=table[i/100];
delays(10);
k1=0;
//
k2=1;
if(key==0)
i=0;
P0=table[(i/10)%10];
delays(10);
k2=0;
k3=1;
if(key==0)
i=0;
P0=table[i%10];
delays(10);
k3=0;
j--;
if(key==0)
i=0;
}
}
}
作者:ysw