//按下键盘中的S2键,暂停计时;按下S3键,继续计时
//晶振为11.0592MHz
#include<reg52.h>
#define uchar unsigned char
sbit du=P2^6;
sbit we=P2^7;
sbit S2=P3^0;
sbit S3=P3^1;
//halt表示是否暂停,pp是50毫秒计时,m是1秒计时
unsigned char halt,j,k,pp,m,n;
//数码管段选表
uchar code leddata[]= {
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
0x80 //"."
};
void Delay_Ms(unsigned char i)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display_m(uchar Value_m) //十分位,百分位显示函数
{
du = 1;
P0 = leddata[Value_m/10]; //显示十分位
du = 0;
P0 = 0xff; //清除段码
we = 1;
P0 = 0xbf; //第三位数码管
we = 0;
Delay_Ms(5);
du = 1;
P0 = leddata[Value_m%10]; //显示百分位
du = 0;
P0 = 0xff; //清除段码
we = 1;
P0 = 0x7f; //第四位数码管 如果将P0=0xf6即从左至右让第四个数码管亮,则会引起第一个数码管一起闪亮,影响显示
we = 0; //这里显示为第五位数码管
Delay_Ms(5);
}
void display_n(uchar Value_n) //十位,个位显示函数
{
du = 1;
P0 = leddata[Value_n/10]; //显示十位
du = 0;
P0 = 0xff; //清除段码
we = 1;
P0 = 0xef; //第一位数码管
we = 0;
Delay_Ms(5);
du = 1;
P0 = leddata[Value_n%10]|0x80; //显示个位和小数点
du = 0;
P0 = 0xff; //清除段码
we = 1;
P0 = 0xdf; //第二位数码管
we = 0;
Delay_Ms(5);
}
void keyscan()
{
if(S2==0)
Delay_Ms(10);
if(S2==0) //暂停键按下
{
halt=1;
}
if(S3==0)
halt=0;
}
void main()
{
TMOD=0x01; // 方式1,为16位定时器/计数器
TH0=(65536-12902)/256; //定时器T0初值计算
TL0=(65536-12902)%256;
ET0=1; //允许T0溢出中断
TR0=1; //启动计数器计数的必要条件
EA=1; //所有的中断请求被开放
pp = 0;
m = 0;
while(1)
{
keyscan(); //执行按键扫描函数,是否有按键按下
if(halt==0) //如果没有暂停
{
TR0=1; //启动计数器进入中断
if(pp==1) //10ms时间到 1*14ms=10ms,中断程序中pp++
{ pp=0; //pp清0,等待下一次循环计数
m++; //m是秒计时
if(m>99) //计数10000后,m清0
{
m=0;
n++;
if(n>99)
{
n=0;
}
}
}
display_m(m); display_n(n); //输出m,n的值,然后再做十位个位数字的运算
}
else //如果暂停了
TR0=0; //则停止计数器计数,即停止计数器工作
display_m(m);display_n(n); //仍然输出m,n的值,但数码管显示数字不变化
}
}
void time0() interrupt 1 //进入中断服务程序进行约14ms计时
{ //定时精度<14ms时,数码管无法正常显示,为显示结果,本程序取14ms近似于10ms
TH0=(65536-12902)/256;
TL0=(65536-12902)%256;
pp++;
}
方法2
#include<reg52.h> //没有小灯
#include<math.h> //其中调用了数学函数
sbit duan=P2^6;
sbit wei=P2^7;
unsigned char smg[]={ //数码管
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
0x00 //自定义
}; //数组后面有分号!!!!别忘记了
delay(unsigned int xms){ //设置一个delay函数(延时)
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
void main(){ //void是没有返回值的作用 可有可无
while(1){ //死循环 让其一直运行
unsigned int i;
unsigned int j;
unsigned int z=-1;
for(j=0;j<6;j++){
for(i=0;i<2500;i++){
P0=smg[j]; //这边是在判断十位数
duan=1; //段选
duan=0;
P0=0xbf; // 1011 1111
wei=1;
wei=0;
delay(2);
P0=smg[i/250]; //这边是在判断个位数
duan=1;
duan=0;
P0=0x7f; //0111 1111
wei=1;
wei=0;
if(i%250==0){
z++;
P1=255-z; //控制流水灯,可直接用十进制来控制流水灯
}
delay(2); //少于3秒的延时 几乎看不见
}
}
}
}
备注:这个文章是在我看了别人的代码之后做的归纳(不是原创)