📄 2.c
字号:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar LED[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
uint i,k,ss,ff,mm;
uint rs,rf,rm;
uchar aa,bb[]={0,0,10,0,0,10,0,0},cc,flag;
uchar dismask[]={0,0,0xff,0xff,0,0,0,0};
bit keyrelease;//键释放
unsigned char status;
bit ringoff;
sbit beep=P3^3;
void keyprocess(unsigned char);
void delay_10ms(void);
void delay(void);
time0() interrupt 1 using 2//定时器0中断函数
{ unsigned char temp;
P2=0xff;//关闭P0口即关闭显示
TF0=0;//定时器0中断溢出标志清0
TH0=(65536-1000)/256;//定时器0设置初始值1ms中断初始值
TL0=(65536-1000)%256;//
cc=bb[i];//
temp=LED[cc]|dismask[i];
P0=temp;
P2=aa;//显示段码
i++;//显示位计数
if(i==8)//如果显示了8个位码初始
{aa=0xfe;//位码初始值11111110其中0为显示 1为不显示
i=0;//初始变量i
}
else
aa=(aa<<1)|0x01;//不是8位码左移一位
if(status==0)//正常计时
k++;
if(k>=1000)
{ // 毫秒计数
k=0;
mm++;
if(mm>= 60)
{ // 秒计数
mm=0; ff++;
if(ff>= 60)
{ // 分计数
ff=0; ss++;
if(ss>= 24)
{ // 时计数
ss=0;
}
}
}
}
if (status==4||status==5)
{bb[0]=rs/10;
bb[1]=rs%10;
bb[3]=rf/10; // 显示分的十位
bb[4]=rf%10; // 显示分的个位
}
else
{bb[0]=ss/10; // 显示时的十位
bb[1]=ss%10; // 显示时的个位
bb[3]=ff/10; // 显示分的十位
bb[4]=ff%10; // 显示分的个位
bb[6]=mm/10; // 显示秒的十位
bb[7]=mm%10; // 显示秒的个位
}
}
main()//主函数
{ unsigned char keyinput;
unsigned char keyvalue;
unsigned char temp;
unsigned char flashtime;
flashtime=0;
i=0;//初值
k=0;//
keyrelease=1;
ringoff=1;
delay_10ms();
flag=0x00;//
aa=0xfe;//位码初值
TMOD=0x01;//方式寄存器初值
TH0=(65536-1000)/256;// 定时器0设置初始值1ms中断初始值
TL0=(65536-1000)%256;//
TR0=1;//起动定时器0
IE=0x82;//开定时器0中断
status=0;
keyvalue=0xff;
while(1)//死巡环
{keyinput=P3&0xf0;
if(keyinput!=0xf0) //键扫描程序,全扫描,逐行扫描。键按下,keyvalue存键值。
{delay_10ms();
keyinput=P3&0xf0;
if(keyinput!=0xf0)
{ if(keyrelease==1)
{keyrelease=0;
keyvalue=keyinput;
}
}
else //键释放
{keyrelease=1;
keyprocess(keyvalue);
keyvalue=0xff;
}
}
else //无键按下
{keyrelease=1;
keyprocess(keyvalue);
keyvalue=0xff;
delay_10ms();
}
if(status==0)//正常计时,无闪烁
{for(temp=0;temp<8;temp++)
dismask[temp]=0x00;
}
if(status==1)//时调整
{if(flashtime>30)
{dismask[0]=0xff;
dismask[1]=0xff;
}
else
{dismask[0]=0x00;
dismask[1]=0x00;
}
}
if(status==2)//分调整
{if(flashtime>30)
{dismask[3]=0xff;
dismask[4]=0xff;
}
else
{dismask[3]=0x00;
dismask[4]=0x00;
}
}
if (status==3)//秒调整
{if(flashtime>30)
{dismask[6]=0xff;
dismask[7]=0xff;
}
else
{dismask[6]=0x00;
dismask[7]=0x00;
}
}
if (status==4)//闹铃时调整
{dismask[6]=0xff;
dismask[7]=0xff;
if(flashtime>30)
{dismask[0]=0xff;
dismask[1]=0xff;
}
else
{dismask[0]=0x00;
dismask[1]=0x00;
}
}
if (status==5)//闹铃分调整
{dismask[6]=0xff;
dismask[7]=0xff;
if(flashtime>30)
{dismask[3]=0xff;
dismask[4]=0xff;
}
else
{dismask[3]=0x00;
dismask[4]=0x00;
}
}
if(flashtime>60)
flashtime=0;
else
flashtime++;
if(ringoff==0&&ss==rs&&ff==rf)
{beep=0;
delay();
beep=1;}
}
}
void keyprocess(unsigned char key) //键值处理,6种状态,正常计时,设置时分秒,设置闹铃时分
{switch (key)
{case 0xe0:status++; //设置键
if(status>5)
status=0;
if(status==2)
{dismask[0]=0x00;
dismask[1]=0x00;}
if(status==3)
{dismask[3]=0x00;
dismask[4]=0x00;}
if(status==5)
{dismask[0]=0x00;
dismask[1]=0x00;}
break;
case 0xd0:switch(status) //加1键
{case 0x01:if(ss<23)
ss++;
else
ss=0;
break;
case 0x02:if(ff<59)
ff++;
else
ff=0;
break;
case 0x03:if(mm<59)
mm++;
else
mm=0;
break;
case 0x04:if(rs<23)
rs++;
else
rs=0;
break;
case 0x05:if(rf<59)
rf++;
else
rf=0;
break;
}
break;
case 0xb0:switch(status) //减1键
{case 0x01:if(ss>0)
ss--;
else
ss=23;
break;
case 0x02:if(ff>0)
ff--;
else
ff=59;
break;
case 0x03:if(mm>0)
mm--;
else
mm=59;
break;
case 0x04:if(rs>0)
rs--;
else
rs=23;
break;
case 0x05:if(rf>0)
rf--;
else
rf=59;
break;
}
break;
case 0x70:
ringoff=~ringoff;
break;
default:break;
}
}
void delay_10ms()
{unsigned char delay1,delay2;
for(delay1=0;delay1<30;delay1++)
for(delay2=0;delay2<120;delay2++);
}void delay()
{unsigned char delay1,delay2;
for(delay1=0;delay1<255;delay1++)
for(delay2=0;delay2<255;delay2++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -