📄 keil.c
字号:
#include <reg52.h>
#include <absacc.h>
#define unit unsigned int
#define uchar unsigned char
/*定义各管脚*/
sbit P10=P1^0; /*调整时钟的时位*/
sbit P11=P1^1; /*调整时钟的分位*/
sbit L0=P1^4; /*时钟正常运行指示灯,1秒亮一次*/
sbit L1=P1^5; /*调整时钟的时位指示灯,调整时,灯亮*/
sbit L2=P1^6; /*调整时钟的分位指示灯,调整时,灯亮*/
sbit P20=P2^0; /*给时钟分位低位送上升沿*/
sbit P21=P2^1; /*给时钟分位高位送上升沿*/
sbit P22=P2^2; /*给时钟时位低位送上升沿*/
sbit P23=P2^3; /*给时钟时位高位送上升沿*/
sbit P27=P2^7; /*用于配合中断消抖,增强抗干扰能力*/
uchar data BUFFER[2]={00,12}; /*显示缓冲区(依次为低位,高位)*/
uchar data CLOCK[4]={0,0,0,12}; /*存放时钟时间(依次为百分秒,秒,分和时位)*/
uchar data BUFFER_A[2]={0,0}; /*存放调整时钟时间(分和时位)*/
uchar n; /*用来确定时钟的状态,0正常运行,1小时调整,2分钟调整,3数据更新*/
uchar m; /*用来表明定时器是否到了1S,若一秒到了,则刷新显示数据*/
/*数码管显示编码"0"-"9","A","-"*/
uchar code TABLE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void display(void)
{
uchar disp;
disp=BUFFER[0]%10;
P20=0;
P0=TABLE[disp];
P20=1;P20=0;
disp=BUFFER[0]/10;
P21=0;
P0=TABLE[disp];
P21=1;P21=0;
disp=BUFFER[1]%10;
P22=0;
P0=TABLE[disp];
P22=1;P22=0;
disp=BUFFER[1]/10;
P23=0;
P0=TABLE[disp];
P23=1;P23=0;
}
void timer0(void) interrupt 1 using 1
{
/*重置定时初值*/
TH0=0x3c; TL0=0xbc; /*定时50MS,20次为一分钟*/
/*时钟处理*/
CLOCK[0]=CLOCK[0]+1;
if (CLOCK[0]==10)
{
L0=!L0; /*L0为正常运行指示灯,一秒闪烁一次*/
}
if (CLOCK[0]==20)
{
L0=!L0;
CLOCK[0]=0;
CLOCK[1]=CLOCK[1]+1;
if (CLOCK[1]==60)
{
CLOCK[1]=0;
m=1;
CLOCK[2]=CLOCK[2]+1;
if (CLOCK[2]==60)
{
CLOCK[2]=0;
CLOCK[3]=CLOCK[3]+1;
if (CLOCK[3]==24)
{
CLOCK[3]=0;
}
}
}
}
}
void main()
{
EA=1; ET0=1;IT1=1;
TMOD=0x01; /*T0方式1计时*/
TH0=0x3c; TL0=0xbc;
P20=0;P21=0;P22=0;P23=0;
TR0=1;
display();
n=0;
m=1;
for(;;)
{
if(n==1) /*小时,分钟调整,P1.0口为时调整,P1.1口为分调整*/
{
if(P10==0)
{
delay(); /*延时10MS去抖*/
if (P10==0)
{
EX1=1;TR0=0;
while (!P10); /*如果P10发生翻转,则时加1*/
CLOCK[3]=CLOCK[3]+1;
if (CLOCK[3]==24) CLOCK[3]=0;
BUFFER_A[1]=CLOCK[3];
BUFFER_A[0]=CLOCK[2];
display_t();
}
}
if(P11==0)
{
delay();
if (P11==0)
{
EX1=1;TR0=0;
while (!P11);
CLOCK[2]=CLOCK[2]+1;
if (CLOCK[2]==60) CLOCK[2]=0;
BUFFER_A[0]=CLOCK[2];
BUFFER_A[1]=CLOCK[3];
display_t();
}
}
}
if(n==2)
{
n=0;
BUFFER[0]=CLOCK[2];
BUFFER[1]=CLOCK[3];
display();
TH0=0x3c; TL0=0xb0; /*如果更新数据,则重新开始计时下一50MS*/
TR0=1;
CLOCK[0]=0;CLOCK[1]=0;
m=1;
}
if (m==1)
{
m=0;
EX1=1;
BUFFER[0]=CLOCK[2];
BUFFER[1]=CLOCK[3];
display();
}
}
}
display_t(void)
{
uchar disp_t;
disp_t=BUFFER_A[0]%10;
P20=0;
P0=TABLE[disp_t];
P20=1;P20=0;
disp_t=BUFFER_A[0]/10;
P21=0;
P0=TABLE[disp_t];
P21=1;P21=0;
disp_t=BUFFER_A[1]%10;
P22=0;
P0=TABLE[disp_t];
P22=1;P22=0;
disp_t=BUFFER_A[1]/10;
P23=0;
P0=TABLE[disp_t];
P23=1;P23=0;
}
delay(void)
{
uchar a,b;
for(a=100;a>0;a--);
for(b=100;b>0;b--);
}
void intsvr1(void) interrupt 2 using 3
{
delay(); /*延时十毫秒,用于消抖*/
if (P27==0)
{
n=n+1;
TR0=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -