📄 题1.c
字号:
#include <stdio.h>
#include <reg52.h>
#include <intrins.h>
#define hi 0x3c //50ms定时
#define lo 0xb0
#define hi0 0xF0
#define lo0 0x00
#define uchar unsigned char
#define uint unsigned int
uchar code ledk[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar time[4]={0,0,0,0};
uchar key,dled,keymark=0xef,ledmark1=0xfe;
uchar key_code=0,press=0,key_flag=0,count_t0=0,count_t1=1;
uchar leftright=0; //对某一位设置标志
uint count_sec=0; //初始设定时间位分钟
unsigned char mark=0,mark1,mark2;
unsigned char mark3,mark4;
unsigned char startmark=0;
unsigned char startbell=0;
unsigned char bell=0,bellmark=0;
sbit add=P2^4; sbit sub=P2^5;
sbit Left=P2^6; sbit Right=P2^7;
sbit P37=P3^7;
sbit signal=P0^6;
sbit clk=P0^7;
sbit P30=P3^0;
void delay(unsigned int n) //延时函数
{unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++) ;
}
void shift(uchar LED) //数据输出函数
{static uchar DA;
uchar j=0;
DA=LED;
while(j<8)
{if((DA&0x80)!=0) signal=1;
else signal=0;
clk=0;
clk=1;
DA<<=1;
j++;
}
}
void int0( void ) interrupt 0
{ TR1=0; ET1=0;
TH0=hi;TL0=lo;
TR0=1;
mark=1;
}
void t0( void ) interrupt 1
{ if(bellmark==0)
{ count_t0++;
TH0=hi;TL0=lo;
startmark=0;
}
if(bellmark==1)
{TH0=hi0; TL0=lo0;
P30=!P30;
bell++;
if(bell==50)
{ TR0=0; bell=0;bellmark=0;P30=1;}
}
}
void int1( void ) interrupt 2
{ count_sec=0;
count_sec=count_sec+time[0];
count_sec=count_sec+time[1]*10;
count_sec=count_sec+time[2]*60;
count_sec=count_sec+time[3]*600;
TH1=hi ;TL1=lo ;
TR1=1; ET1=1;
TR0=0;
mark=0;
startmark=1;
startbell=1;
}
void t1( void ) interrupt 3
{
count_t1++;
TH1=hi;TL1=lo;
if(count_t1==20)
{ count_t1=0;
if(startmark==1)
{ count_sec--;
time[3]=(count_sec/60)/10; //十分位
time[2]=(count_sec/60)%10; //分位
time[1]=(count_sec%60)/10; //十秒位
time[0]=(count_sec%60)%10; //秒位
if(count_sec==0)
{ startbell=0; startmark=0;}
if(count_sec%30==0&&startbell==1)
{ TH0=hi0;TL0=lo0; TR0=1; bellmark=1; }
}
}
}
/*uchar scankey(void)
{unsigned char key_code;
static unsigned char column=1;
if(P37==1 && key_flag==1){key_code=column;key_flag=0;press=1;}
else key_code=0xff;
P2=keymark|(ledmark1&0x0f);
if(key_flag==0 && P37==0)
key_flag=1;
keymark=_crol_(keymark,1);
if(keymark==0x0e) keymark=0xe0;
column++;
if(column>4) column=1;
return(key_code);
}*/
unsigned char scankey(void)
{ unsigned char key_code=0xff;
add=0;
if (P37==0)
mark1=1;
if(P37==1&&mark1==1)
{key_code=1;mark1=0;press=1;}
add=1;
sub=0;
if (P37==0)
mark2=1;
if(P37==1&&mark2==1)
{key_code=2;mark2=0;press=1;}
sub=1;
Left=0;
if (P37==0)
mark3=1;
if(P37==1&&mark3==1)
{ key_code=3;mark3=0;press=1;}
Left=1;
Right=0;
if (P37==0)
mark4=1;
if(P37==1&&mark4==1)
{key_code=4;mark4=0;press=1;}
Right=1;
return(key_code);
}
void key_func(key)
{switch (key)
{
case 1: time[leftright]--;
if(leftright==0||leftright==2)
{if(time[leftright]==0xff) time[leftright]=9;}
if(leftright==1||leftright==3)
{if(time[leftright]==0xff) time[leftright]=5;}
break;
case 2: time[leftright]++;
if(leftright==0||leftright==2)
{ if(time[leftright]==10) time[leftright]=0;}
if(leftright==1||leftright==3)
{ if(time[leftright]==6) time[leftright]=0;}
break;
case 3: leftright++; if(leftright==4) leftright=0; break;
case 4: leftright--; if(leftright==-1) leftright=3; break;
default: break;
}
}
main()
{ uchar i=0;
EA=1; ET0=1;ET1=1; EX0=1;EX1=1;IT0=1;IT1=1;
TMOD=0X11;
TH1=hi;TL1=lo; TR1=1;
while(1)
{
if(mark==1)
key=scankey();
if(P37==1&&press==1)
{ key_func(key);press=0;}
if(i==2&&count_t1<10)
{ dled=ledk[time[i]]|0x80 ;
if(i==leftright&&count_t0%2==0&&mark==1)dled=0x00 ;
}
else if(i==leftright&&count_t0%2==0&&mark==1)dled=0x00 ;
else dled=ledk[time[i]];
shift(dled);
if(count_sec<6&&startbell==1)
{ TH0=hi0;TL0=lo0; TR0=1; bellmark=1;
}
P2=ledmark1;
delay(20);
ledmark1=_crol_(ledmark1,1);
if(ledmark1==0xef) ledmark1=0xfe;
i++;
if(i>3) i=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -