📄 clock.c
字号:
#include <AT892051.h>
#define uchar unsigned char
#define uint unsigned int
/********全局变量定义*******/
uchar hour=0,min=0,sec=0,ms=0;
uchar flag=0;
int time_i; //
/*********************引脚定义**************************/
sbit com1 = 0xB0;
sbit com2 = 0xB1;
sbit com3 = 0xB4;
sbit com4 = 0xB5;
sbit dot = 0x97; //dot=P1.7
sbit plus = 0xB7;
sbit minus = 0xB3;
sbit int0 = 0xB2;
/***************七段数码管,共阳极代码***********************/
const char code seg[]=
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99,
0x92,
0x82,
0xf8,
0x80,
0x90, //9
};
/**************函数声明********************/
void inti(void);//程序初始化
void display(void);//显示子程序
void display_hour(uchar);//小时显示
void display_min(uchar);//分钟显示
void delay10ms(void);//延时10ms
void key();//键盘扫描
void manage_plus(void);//加程序
void manage_minus(void);//减程序
void time_set(void);//时钟设置子程序
void time1(void); //定时器中断
void ex0_isr(void);//中断0程序
void main()
{
inti(); //程序初始化
//time_set();
//while(1);
while(1)display();//时钟显示
}
/***************小时显示程序******************/
void display_hour(uchar a)
{
uchar sw,gw;
if(a<10)
{
com2=0;
P1=seg[a];
delay10ms();
com2=1;
delay10ms();
delay10ms();
delay10ms();
}
else
{
sw=a/10;
gw=a%10;
com1=0;
P1=seg[sw];
delay10ms();
com1=1;
delay10ms();
com2=0;
P1=seg[gw];
delay10ms();
com2=1;
delay10ms();
}
}
/***************分钟显示程序******************/
void display_min(uchar b)
{
uchar gw,sw;
gw=b%10;
sw=b/10;
com3=0;
P1=seg[sw];
delay10ms();
com3=1;
delay10ms();
com4=0;
P1=seg[gw];
delay10ms();
com4=1;
delay10ms();
}
/*****************显示子程序*************************/
void display()
{
display_hour(hour);
display_min(min);
if (ms>125)
{
com2=0;
P1=0xff;
dot=0; //秒针闪动一次
delay10ms();
com2=1;
delay10ms();
}
else
{
delay10ms();
delay10ms();
}
}
/**********************初始化程序**********************/
void inti(void)
{
EA=1;
//初始化定时计数器控制寄存器
TMOD=0X10;
ET1=1;//打开定时计数器1溢出中断
TH1=-4242/256;
TL1=-4242%256;
TR1=1;
EX0=1;//打开中断0
IT0=1;//后跳沿有效
}
/*********************键盘扫描程序*********************/
void key()
{
plus=1;
//delay10ms();
if(plus==0)
{
while(plus==0);//等待键盘释放
delay10ms();// 键盘消抖动
manage_plus();
}
minus=1;
//delay10ms();
if(minus==0)
{
while(minus==0);//等待键盘释放
delay10ms();// 键盘消抖动
manage_minus();
}
int0=1;
//delay10ms();
if(int0==0)
{
while(int0==0);//等待键盘释放
delay10ms();// 键盘消抖动
flag++;
}
}
/*********************加程序******************************/
void manage_plus()
{
if(flag==1)
{
min++;
if(min==60)min=0;
}
if(flag==2)
{
hour++;
if(hour==24)hour=0;
}
}
/*********************减程序******************************/
void manage_minus()
{
if(flag==1)
{
if(min==0)min=60;
min--;
}
if(flag==2)
{
if(hour==0)hour=24;
hour--;
}
}
/**********************中断0**************************/
void ex0_isr() interrupt 0
{
EA=0;
delay10ms(); //键盘消抖动
if(int0==0) //判断是否干扰
{ //的确有键按下
while(int0==0); //等待键盘释放
delay10ms();// 键盘消抖动
flag=1;
time_set();
}
EA=1;
}
/***********************延时子程序*********************/
//延时时间为10ms
void delay10ms()
{
uint i;
for(i=150;i>0;i--);
}
/*********************定时子程序*************************/
//定时器1中断服务子程序
//定时工作方式1
void time1(void)interrupt 3
{
ms++;
if(ms==250)
{
ms=0;
sec++;
if(sec==60)
{
sec=0;
ms+=12;
min++;
if(min==60)
{
min=0;
ms+=27;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
TH1=-4242/256;
TL1=-4242%256; //重新初始化值
ET1=1;//打开定时计数器1溢出中断
}
/*******************时钟设置子程序**********************/
void time_set()
{
while(1)
{
if(flag==3)break;
key();
if(flag==1)
{
time_i++;
if(time_i>100)
{
display_min(min);
if(time_i>150)time_i=0;
}
display_hour(hour);
}
if(flag==2)
{
time_i++;
if(time_i>100)
{
display_hour(hour);
if(time_i>150)time_i=0;
}
display_min(min);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -