📄 6oktime.c
字号:
#include"reg51.h"
#define uint unsigned int
#define uchar unsigned char
int hour=12; //初始化。
int minite=30;
int sconds=0;
uint count; //模式切换变量
uint k=0; //1s标志位(k=20表示1s)
uint done; //显示状态标志位
sbit Set=P2^5; //定义I/O口
sbit Up=P2^6;
sbit Down=P2^7;
sbit LED1=P3^0;
sbit LED2=P3^1;
sbit LED3=P3^2;
sbit LED4=P3^3;
sbit LED5=P3^4;
sbit LED6=P3^5;
/*延时子程序*/
void mdelay(uint delay)
{ uint i;
for(;delay>0;delay--)
{for(i=0;i<124;i++) //1ms延时.
{;}
}
}
//uint code DispTab[10]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09}; //字形码(共阳)P1.7-->a---P1.0-->db
uint code DispTab[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //字形码(共阳)P1.0-->a---P1.7-->db
//uint code DispTab[10]={0x30,0xbe,0x25,0x2c,0xaa,0x68,0x60,0x3e,0x20,0x28}; //字形码(共阳)P1.7->a,p1.6->b,p1.5->db,p1.4->g,p1.3->e,p1.2->f,p1.1->d,p1.0->c
////////////////////////////////////////////////////////////////////////////////////////////////////////
void disptime(hour,minite,sconds)//显示时间
{ int td1,td2,td3,td4,td5,td6;
td1=hour/10;
td2=hour%10;
td3=minite/10;
td4=minite%10;
td5=sconds/10;
td6=sconds%10;
/*************************************/
LED6=0;
P1=DispTab[td1];
if(td1<=0) LED1=0;
else
LED1=1;
mdelay(1);
LED1=0;
P1=(DispTab[td2]&0x7F);
LED2=1;
mdelay(1);// 显示时
/**************************************/
LED2=0;
P1=DispTab[td3];
LED3=1;
mdelay(1);
LED3=0;
P1=(DispTab[td4]&0x7F);
LED4=1;
mdelay(1); //显示分
/***********************************/
LED4=0;
P1=DispTab[td5];
LED5=1;
mdelay(1);
LED5=0;
P1=DispTab[td6];
LED6=1;
mdelay(1); //显示秒
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
void Setkey()//模式选择按键
{
Set=1;
if(Set==0)
{
mdelay(250);
count=count+1; //Setkey按一次,count就加1
TR0=0; //关中断
done=1; //标志位置1
sconds=0;
while(Set==0);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Upkey()//升序按键
{ uint i;
Up=1;
if(Up==0)
{switch(count)
{case 1:hour=hour+1;break;
case 2:minite=minite+1;break;
default:break;
}
}
while(Up==0);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Downkey()//降序按键
{ uint i;
Down=1;
if(Down==0)
{switch(count)
{case 1:hour=hour-1;break;
case 2:minite=minite-1;break;
default:break;
}
}
while(Down==0);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void keydone()//按键功能执行
{
Setkey(); //扫描模式切换按键
switch(count)
{case 1:do //count=1,调整时
{Upkey();
Downkey();
if(hour==24)hour=0;
if(hour==-1)hour=23;
disptime(hour,minite,sconds);
}while(count==2);break;
case 2:do //count=2,调整分
{Upkey();
Downkey();
if(minite==60)minite=0;
if(minite==-1)minite=59;
disptime(hour,minite,sconds);
}while(count==3);break;
case 3: TR0=1;count=0;done=0;sconds=0;break; //count=3,开启中断,标志位置0并退出
default:break;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
TMOD=0x01; //定时器0工作在方式1,定时值为50mS。晶振频率为11.0592MHz.
TH0=0x4C;
TL0=0x05;
//TL0=0x0A;
// TL0=0x10; //快
//TL0=0x0D;
count=0;
done=0;
IE=0x82; //使能time0()中断
TR0=1; //开启定时器0.
P3=1;
P1=0;
PCON=0x01;
while(1)
{while(done==1)
{keydone();} //执行功能键
while(done==0)
{disptime(hour,minite,sconds); //默认显示时间(时/分/秒)
Setkey(); //扫描各功能键
Upkey();
Downkey();
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
void time0() interrupt 1 using 1//中断服务程序
{ TH0=0x4C;
TL0=0x05;
// TL0=0x0A;// 快
//TL0=0x0B;
//TL0=0x10;
//TL0=0x0D;
k++;
if(k==20)
{
sconds++;
k=0;
}
if(sconds==60)//已经到60S
{minite++;
sconds=0;
if(minite==60)//已经到60分
{hour++;
minite=0;
if(hour==24)//已经到24小时
{hour=0;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -