版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
/*******************************************************
秒表
计时秒表,显示格式:**.**
Author:Vivien
*******************************************************/
#include <reg51.h>
#define DataPort P0 //数据端口
sbit Seg = P2^2; //段码锁存
sbit Bit = P2^3; //位码锁存
unsigned char code Seg_Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char code Seg_Code1[] = {0xbF,0x86,0xdB,0xcF,0xe6,0xeD,0xfD,0x87,0xfF,0xeF};
unsigned char code Bit_Code[] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
unsigned char Disp_Num[8];
//七段显示子函数,FirstBit表示显示开始的位置(0-7),Num表示显示的位数(1-8)
void Display(unsigned char FirstBit,unsigned char Num);
void delay_50us()
{
//unsigned char i;
TMOD = 0x01; //T0工作在定时方式,方式1
TH0 = 0xff; //50us的初值
TL0 = 0xce;
TR0 = 1; //开T0
while(!TF0); //等待时间,原地踏步
TF0 = 0; //清除标志位
TH0 = 0xff; //重新赋初值
TL0 = 0xce;
}
//七段显示子函数,FirstBit表示显示开始的位置(1-8),Num表示显示的位数(1-8)
void Display(unsigned char FirstBit,unsigned char Num)
{
unsigned char i;
for(i = 0;i < Num;i++)
{
DataPort = 0; //消除影子,给段码
Seg = 1; //段锁存 开门
Seg = 0; //关门
DataPort = Bit_Code[i + FirstBit -1]; //选择位码
Bit = 1; //位锁存 开门
Bit = 0; //关门
DataPort = Disp_Num[i]; //选择段码
//DataPort = Seg_Code[i]; //选择段码
Seg = 1; //段锁存 开门
Seg = 0; //关门
delay_50us(); //控制好扫描时间,获得理想的效果
//如果时间太长,会跳
}
}
void main() //实现计时0-99
{
unsigned char ms_L,ms_T,sec_H,sec_D;
unsigned int i,ms,sec;
while(1)
{
i++;
if(i == 20) //放慢500倍
{
i = 0;
ms ++;
}
if(ms == 100)
{
ms = 0;
sec ++;
}
if(sec == 60)
{
sec = 0;
}
ms_T = ms / 10; //拆分和显示
ms_L = ms % 10;
sec_D = sec / 10;
sec_H = sec % 10;
Disp_Num[0] = Seg_Code[sec_D];
Disp_Num[1] = Seg_Code1[sec_H];
Disp_Num[2] = Seg_Code[ms_T];
Disp_Num[3] = Seg_Code[ms_L];
Display(3,4);
}
}