📄 clock1.c
字号:
#include <reg51.h>
#include <intrins.h>
sbit led1=P1^3; /* 4位数码管选通引脚 */
sbit led2=P1^4;
sbit led3=P1^6;
sbit led4=P1^7;
sbit led2dz=P1^5; /*小数点 */
sbit ls164_ab=P3^0; /*74LS164数据线 */
sbit ls164_clk=P3^1; /*74LS164时钟线 */
sbit key1=P3^5; /*按键1 */
sbit key2=P3^7; /*按键2 */
unsigned int DispFlag; /*显示标识 */
sbit key1flag=P3^2;/*按键1状态标识*/
sbit key2flag=P3^3;/*按键2状态标识*/
sbit beep=P1^0; /*蜂鸣器*/
unsigned int MSCNT; /*中断次数 */
unsigned char SecondBuf=0;/*秒缓冲区*/
unsigned char MinuteBuf=0; /*分钟缓冲区*/
unsigned char HourBuf=0; /*小时缓冲区*/
unsigned char MonthBuf=0;/*月缓冲区*/
unsigned char DayBuf=0; /*日缓冲区*/
unsigned char DispBuf[15]; //显示缓冲
/************************************************************/
//DispBuf[1]-DispBuf[2]--DispBuf[3]-DispBuf[4]--DispBuf[5]-DispBuf[6]
//分 钟 ------- 小 时 ------- 天
//DispBuf[7]-DispBuf[8]--DispBuf[9]-DispBuf[10]
//月 ------- 秒
/************************************************************/
/* led1查表 */
unsigned char Sag_led1[10]=
{0x50,0xF9,0x34,0xB0,0x99,0x92,0x12,0xF8,0x10,0x90};
/* led234查表 */
unsigned char Sag_led234[10]=
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
/* 延时子程序 */
void Delay(unsigned int val)
{
while (val!=0) val--;
}
/*清缓冲区子程序*/
void ClearDispBuf()
{
char i;
for(i=0;i<15;i++)
{
DispBuf[0]=0;
}
}
/* 74ls164工作原理子程序 */
void Send74ls164(unsigned char sag)
{
char i;
for(i=1;i<9;i++)
{
sag=sag<<1 ;
if(CY==1)
ls164_ab=1;
else
ls164_ab=0;
ls164_clk=1;
ls164_clk=0 ;
}
}
//选定led1
void Select_led1()
{
led1=0;
led2=1;
led3=1;
led4=1;
}
//选定led2
void Select_led2()
{
led2=0;
led1=1;
led3=1;
led4=1;
}
//选定led3
void Select_led3()
{
led3=0;
led1=1;
led2=1;
led4=1;
}
//选定led4
void Select_led4()
{
led4=0;
led1=1;
led2=1;
led3=1;
}
//更新显示缓冲子程序
int UpdateDispBuf()
{ //更新"秒"显示缓冲
DispBuf[10]=SecondBuf/10;
DispBuf[9] =SecondBuf%10;
//更新"分钟"显示缓冲
DispBuf[2]=MinuteBuf/10;
DispBuf[1]=MinuteBuf%10;
//更新"小时"显示缓冲
DispBuf[4]=HourBuf/10;
DispBuf[3]=HourBuf%10;
//更新"月"显示缓冲
DispBuf[8]=MonthBuf/10;
DispBuf[7]=MonthBuf%10;
//更新"日"显示缓冲
DispBuf[6]=DayBuf/10;
DispBuf[5]=DayBuf%10;
}
//4位数码管显示子程序
void Disp(void) //2位 5000,4位 2500
{
UpdateDispBuf();
switch(DispFlag)
{
case 0: //0x0: //显示 时,分
Select_led4();
Send74ls164(Sag_led234[DispBuf[1]]);
Delay(2500);
Select_led3();
Send74ls164(Sag_led234[DispBuf[2]]);
Delay(2500);
Select_led2();
Send74ls164(Sag_led234[DispBuf[3]]);
Delay(2500);
Select_led1();
Send74ls164(Sag_led1[DispBuf[4]]);
Delay(2500);
break;
case 0x1: //显示 月,日
Select_led4();
Send74ls164(Sag_led234[DispBuf[5]]);
Delay(2500);
Select_led3();
Send74ls164(Sag_led234[DispBuf[6]]);
Delay(2500);
Select_led2();
Send74ls164(Sag_led234[DispBuf[7]]);
Delay(2500);
Select_led1();
Send74ls164(Sag_led1[DispBuf[8]]);
Delay(2500);
break;
case 0x2: //显示 秒
Select_led4();
Send74ls164(Sag_led234[DispBuf[9]]);
Delay(2500);
Select_led3();
Send74ls164(Sag_led234[DispBuf[10]]);
Delay(2500);
break;
case 0x3: //显示 月
Select_led2();
Send74ls164(Sag_led234[DispBuf[7]]);
Delay(2500);
Select_led1();
Send74ls164(Sag_led1[DispBuf[8]]);
Delay(2500);
break;
case 0x6: //显示 日
Select_led4();
Send74ls164(Sag_led234[DispBuf[5]]);
Delay(2500);
Select_led3();
Send74ls164(Sag_led234[DispBuf[6]]);
Delay(2500);
break;
case 0x9: //显示 时
Select_led2();
Send74ls164(Sag_led234[DispBuf[3]]);
Delay(2500);
Select_led1();
Send74ls164(Sag_led1[DispBuf[4]]);
Delay(2500);
break;
case 12: //0x0C: //显示 分
Select_led4();
Send74ls164(Sag_led234[DispBuf[1]]);
Delay(2500);
Select_led3();
Send74ls164(Sag_led234[DispBuf[2]]);
Delay(2500);
break;
default:
break;
}
}
void KeyScan()
{
if(key1flag==0)
{
if(key2flag==0)
{
if(key1==0)
{ //key1子程序
if(DispFlag==1)
{
// 无动作
}
else if(DispFlag==2)
{
SecondBuf=0;//秒缓冲区清0
}
else
{
DispFlag+=3;
key1flag=1;
}
if(DispFlag>12)//0x0C)
{
DispFlag=0;
}
}
else if(key2==0)
{
//key2子程序
switch(DispFlag)
{
case 0: //显示"月,日"
DispFlag+=1;
key2flag=1;
break;
case 1: //显示"秒"
DispFlag+=1;
key2flag=1;
break;
case 2: //返回显示"时,分"
DispFlag=0;
key2flag=1;
break;
case 3: //"月"+1
MonthBuf+=1;
if(MonthBuf>59)
{
MonthBuf=0;
}
break;
case 6: //"日"+1
DayBuf+=1;
// if(MonthBuf%2==0)
// {
// if(DayBuf>30)
// {
// DayBuf=0;
// }
// }
// else
//{
if(DayBuf>31)
{
DayBuf=0;
}
// }
break;
case 9: //"时"+1
HourBuf+=1;
if(HourBuf>23)
{
HourBuf=0;
}
break;
case 12://"分"+1
MinuteBuf+=1;
if(MinuteBuf>59)
{
MinuteBuf=0;
}
break;
default:
break;
}
//返回
}
}
else if(key2==1)
{
key2flag=0;
}
}
else if(key1==1)
{
key1flag=0;
}
}
/************************************************************/
//定时器0中断
/************************************************************/
void timer() interrupt 1 using 2
{
MSCNT++;
KeyScan();//键扫描
TH0=0x0;
TL0=0x0;
if(MSCNT>7)
{
MSCNT=0;
SecondBuf+=1;
if(SecondBuf>59)
{
SecondBuf=0;
MinuteBuf+=1;
if(MinuteBuf>59)
{
MinuteBuf=0;
HourBuf+=1;
if(HourBuf>23)
{
HourBuf=0;
}
}
}
}
}
void main(void)
{
ClearDispBuf();//初始时清显示缓冲区
TMOD=0x01;
TH0=0x0;
TL0=0x0;
EA=1;
ET0=1;
TR0=1;
MSCNT=0;
ls164_ab=0;
ls164_clk=0;
DispFlag=0;
loop:
Disp();
goto loop;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -