📄 main.c
字号:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//段码: 0 1 2 3 4 5 6 7 8 9
uchar n,aa,shi,fen,miao,miaoge,miaoshi,fenge,fenshi,shige,shishi;
sbit S2=P3^4; //秒表功能
sbit S3=P3^5; //调分
sbit S4=P3^6; //调时
sbit S5=P3^7; //时,分,秒清零
sbit wela=P2^7; //位选控制
sbit dula=P2^6; //段选控制
void delayms(uint z);//延时函数声明
void keyscan(); //键盘扫描函数声明
void display(); //显示函数声明
void init(); //初始化函数声明
/***************主函数**************/
void main()
{
init(); //初始化
while(1)
{
display();
keyscan();
}
}
/*************初始化函数************/
void init()
{
miao=0; //秒分时的初始化
fen=0;
shi=0;
aa=0;
n=0;
TMOD=0x11; //设置定时器0和1为工作方式1
TH0=(65536-50000)/256; //装设初值
TL0=(65536-50000)%256;
EA=1; //开启总中断
ET0=1; //开启定时器0中断
TR0=1; //启动定时器0
TH1=(65536-5000)/256; //装设初值
TL1=(65536-5000)%256;
ET1=1; //开启定时器0中断
TR1=1; //启动定时器0
}
/********定时器T0中断函数**********/
void t0(void) interrupt 1
{
TH0=(65536-50000)/256; //装设初值
TL0=(65536-50000)%256;
aa++;
if(aa==18) //到达1秒重新计数并将1秒累加
{
aa=0; //归零
miao++;
if(miao==60)
{
miao=0; //如果秒累加为60则清零同时分钟累加计数
fen++;
if(fen==60) //如果分钟累加到60清零时进位
{
fen=0;
shi++;
if(shi==24) //如果时累加到60清零时进位
shi=0;
}
}
}
miaoge=miao%10; //将累加的秒de个ge位分离出来
miaoshi=miao/10; //将累加的秒de个十位分离出来
fenge=fen%10; //将累加的分de个ge位分离出来
fenshi=fen/10; //将累加的分钟de个十位分离出来
shige=shi%10; //将累加的时de个ge位分离出来
shishi=shi/10; //将累加的时de个十位分离出来
}
/********定时器T1中断函数**********/
void t1(void) interrupt 3 //按键处理
{
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
n++;
if(n==20) //每秒检测一次key1按键
{
n=0;
if(S2==0)
{
delayms(10);
if(S2==0) //key1按键确实被按下
{
miao++; //秒加1
if(miao==60) //秒到60时分进位
{
miao=0;
fen++;
if(fen==60) //分到60时时进位
{
fen=0;
shi++;
if(shi==24) //时到24时归零
shi=0;
}
}
}
}
}
}
/*************延时函数*************/
void delayms(uint z)
{
uint x,y;
for(x=z;z>0;z--)
for(y=110;y>0;y--);
}
/*************显示函数*************/
void display()
{
dula=1; //hour的十位显示
P0=table[shishi];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(10);
dula=1; //hour的个位显示
P0=table[shige];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(1);
dula=1; //min的十位显示
P0=table[fenshi];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(1);
dula=1; //min的个位显示
P0=table[fenge];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delayms(1);
dula=1; //sec的十位显示
P0=table[miaoshi];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delayms(1);
dula=1; //sec的个位显示
P0=table[miaoge];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
delayms(1);
}
/***********键盘扫描函数*************/
void keyscan()
{
if(S3==0)
{
delayms(10);
if(S3==0) //key2按键确实被按下
{
fen++; //分进位到60时并清零
if(fen==60)
{
fen=0;
}
while(!S3);
fenge=fen%10; //将累加的分钟de个十位和个位分离出来
fenshi=fen/10;
}
}
if(S4==0)
{
delayms(10);
if(S4==0) //key3按键确实被按下
{
shi++; //时进位到24时并清零
if(shi==24)
{
shi=0;
}
while(!S4)
shige=shi%10; //将累加的时de个十位和个位分离出来
shishi=shi/10;
}
}
if(S5==0)
{
delayms(10);
if(S5==0) //key4按键确实被按下
{
while(!S5);
miao=0; //将秒分时归零
fen=0;
shi=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -