📄 电子钟程序.c
字号:
/**************************************************************
**项目名称:CLOCK
**功能描述:
**说 明:12MHz晶体振荡器
/**************************************************************
头文件预处理:
**************************************************************/
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
/**************************************************************
数据类型宏定义:
**************************************************************/
#define uchar unsigned char
#define uint unsigned int
/*============================================================
I/O Ports' Definition:
============================================================*/
sbit Key1=P1^0;
sbit Key2=P1^1;
sbit Key3=P1^2;
sbit Key4=P1^3;
sbit Key5=P1^4;
sbit Led_Clk=P1^5; //clock port of 74HC164
sbit Led_Dat=P1^6; //data port of 74HC164
sbit Led_Cs=P1^7; //Led display controlling(using BJT's base)
/**************************************************************
全局变量声明:
**************************************************************/
uchar bdata B_Byte;
uchar disp[6]={0x00,0x00,0x00,0x00,0x00,0x00}; //数组的长度??????
uchar key_value,key_value_temp;
uchar Cnt=0;
uchar Cnt1=0;
uchar Srl=0;
uchar temp=0;
uchar i,k;
bit Wink_Bit = 0;
bit Sft_Bit = 0;
uchar disp_temp[6];
/**************************************************************
函数说明:
**************************************************************/
void Led_Display();
void Led_Write(uchar leddat);
void Key_Func();
void delay();
void delay1();
/**************************************************************
code tab:
**************************************************************/
uchar code tab[]={
0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,//0-9
0xFF//dark all
};
void Tmr0_ISR() interrupt 1 using 1
{
uchar i;
if(Cnt<20) ++Cnt;
else
{
Cnt=0;
if(disp[0]<9) ++disp[0];
else
{
disp[0] = 0;
if(disp[1]<5) ++disp[1];
else
{
disp[1] = 0;
if(disp[2]<9) ++disp[2];
else
{
disp[2] = 0;
if(disp[3]<5) ++disp[3];
else
{
disp[3] = 0;
if(disp[4]<3) disp[4]++;
else
{
if(disp[5]<2)
{ if(disp[4]<9) ++disp[4];
else {
disp[4]=0; ++disp[5];
}
}
else
{disp[4]=0;disp[5]=0;
}
}
}
}
}
}
}
for( i = 0;i<=5;++i )
disp_temp[i] = disp[i];
TH0=0x3c;
TL0=0xb0;
}
void Tmr1_ISR() interrupt 3 using 2
{
if(Cnt1<20) ++Cnt1;
else Cnt1 = 0;
if(Cnt1==9||Cnt1==19) Wink_Bit = !Wink_Bit;
TH1=0x3c;
TL1=0xb0;
}
void main()
{
//initialize:
TMOD=0x11; //设置定时器0/1的工作方式,
ET0=1; //允许定时器0中断
ET1=1;
EA=1; //允许CPU总中断
TR0 = 1;
TH0=0xb1;
TL0=0xe0;
TH1=0xb1;
TL1=0xe0;
delay();
while(1) //循环扫描键盘,调用显示
{
Led_Display();
delay();
Key_Func();
if(Sft_Bit)
{
if(Wink_Bit)
disp[Srl] = 0x0a;
else
disp[Srl] = disp_temp[Srl];
}
}
}
/**************************************************************
**函数名称:Key_Func
**功能描述:键盘处理
***************************************************************
**调用函数:None
**参 数:None
**返 回 值:None
**************************************************************/
void Key_Func()
{
P1=0xff;
key_value=P1;
key_value=(key_value&0x1f);
do
{
key_value_temp=P1;
key_value_temp=(key_value_temp&0x1f);
Led_Display();
delay();
}while(key_value_temp!=0x1f);
switch(key_value)
{
//------------------------------------------------------------
case 0x1e: //TR0 = 0;
//break;
case 0x1d: //TR0 = 1;
break;
//------------------------------------------------------------
case 0x1b: if(!Sft_Bit) break;
disp[Srl] = disp_temp[Srl];
switch(Srl)
{
case 0:
if(disp[Srl]<9)
++disp[Srl];
else disp[Srl]=0;
break;
case 1: if(disp[Srl]<5)
++disp[Srl];
else disp[Srl]=0; break;
case 2:
if(disp[Srl]<9)
++disp[Srl];
else disp[Srl]=0;break;
case 3: if(disp[Srl]<5)
++disp[Srl];
else disp[Srl]=0;break;
case 4: if(disp[5]<2)
{if(disp[Srl]<9)
++disp[Srl];
else disp[Srl]=0;}
else
{if(disp[Srl]<3)
disp[Srl]++;
else disp[Srl]=0;}break;
case 5: if(disp[4]<4)
{if(disp[Srl]<2)
++disp[Srl];
else disp[Srl]=0;}
else
{if(disp[Srl]<1)
++disp[Srl];
else disp[Srl]=0;}
break;
default: break;
}
disp_temp[Srl] = disp[Srl];
break; //Key3 not used
//------------------------------------------------------------
case 0x17: TR0 = 0;
TR1 = 1;
disp[Srl]=disp_temp[Srl];
if(Srl<5) ++Srl;
else Srl = 0;
if(!Sft_Bit)
{
Sft_Bit = 1;
Srl = 0;
}
break; //Key4 not used
//------------------------------------------------------------
case 0x0f: disp[Srl]=disp_temp[Srl];
Sft_Bit = 0;
Srl = 0;
TR0 = 1;
TR1 = 0;
default: break;
}
}
/*==================Key_Func 函数结束=======================*/
/**************************************************************
**函数名称:Led_Write
**功能描述:移位寄存器送出一个字节的数据
***************************************************************
**调用函数:None
**参 数:None
**返 回 值:None
**************************************************************/
void Led_Write(uchar leddat)
{
uchar i;
for(i=0;i<8;i++)
{
if((leddat&0x80)==0)
Led_Dat=0;
else
Led_Dat=1;
Led_Clk=0; //时钟端产生脉冲
Led_Clk=1; //送出一位数据
leddat<<=1;
}
}
/*********************Led_Write 函数结束**********************/
/**************************************************************
**函数名称:Led_Display
**功能描述:LED数码管显示6位
***************************************************************
**调用函数:Led_Write
**参 数:None
**返 回 值:None
**************************************************************/
void Led_Display()
{
uchar i,Dat;
Led_Cs=1; //关显示
for(i=0;i<6;i++)
{
Dat=tab[disp[i]];
if((i==2||i==4) &&(disp[0]%2==0))
Dat=Dat&0xfe; //开小数点显示
Led_Write(Dat);
}
Led_Cs=0; //开显示
}
/********************Led_Display 函数结束*********************/
/**************************************************************
**函数名称:delay
**功能描述:延时
***************************************************************
**调用函数:None
**参 数:None
**返 回 值:None
**************************************************************/
void delay()
{
uchar i,k;
for(i=0;i<=50;i++)
for(k=0;k<0xff;k++)
{
;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -