📄 1.0.c
字号:
#include <at89x051.h>
unsigned char sec100,sec,sec5,min,hour,flag1,command,temp,opto,number,tempp3value;
/* above must be defined as register for tiny model */
unsigned char i,digit,buffer[4],onHour1,onMin1,offHour1,offMin1;
char cputick,key,delay,count1;
char convert[10] = {0x3F,0x0c,0x76,0x5e,0x4d,0x5b,0x7b,0x0e,0x7f,0x5f};//定义数码管上0-9显示的数据,1-灯亮,0-灯灭,
void pause(int)
void scanLED();
void manualOnOff();
void savetimeOnOff1();
void addnumber();
void subnumber();
void showOnce();
void savenumber();
void numberToBuffer();
void offmsd();
void keyexe();
void keydelay();
void comparenumber();
void compareua0();
void compareua1();
void main()
{
EA = 0; //EA=0时禁止所有中断
//----------------------------
//以上为at89x051.h的初始值
//---------------------------
opto = 0xff;
ua=0xff
value=0xff
hour = 0;
min = 0;
sec = 0;
key = -1;
flag1 = 0;
number=180
buffer[0] = 0x40;
buffer[1] = 0x40;
buffer[2] = 0x40;
// serinit(9600); /* must be invoked for tiny model */
while(1)
{
scanLED();
/*------------- the following tasks execute every 10ms ------*/
numberToBuffer();
offmsd();
keyexe();
keydelay();
comparetime();
/*-----------------------------------------------------------*/
}
}
/* ****************** change constant below for other X-tal ********/
void time ()
/* update real-time clock */
{
sec100++;
if (sec100 >= 100) /* 100 * 10 ms = 1 s */
{sec100 = 0;
flag1 |= 0x05; /* set bit 0, bit 2 */
temp = 50;
sec++;
if (sec >= 60)
{sec = 0;
flag1 |= 0x02; /* set bit 1 */
min++;
if (min >= 60)
{min = 0;
hour++;
if (hour >= 24)
{hour = 0;
}
}
}
}
}
void scanLED() /* scan 4-digit LED and 4-key switch, if key pressed key = 0-3
else key = -1 */
{
int i;
digit = 0x04;
key = -1;
for( i = 0; i < 3; i++) /* 3-DIGIT scanning */
{
tempp3value=p3
value=tempp3value&0x30
if((value&0x20)!=0)
{
comparenumber()
else
{
opto=0xff
}
}
P3 = (~digit & opto) & ~value; /* send complement[digit] */
P1 = buffer[i]; /* send complement[segment] */
pause(5); /* delay a while */
P1 = 0xff; /* off LED */
if ((P3 & 0x08) == 0) /* if key pressed P3.3 became low */
key = i; /* save key position to key variable */
digit>>=1; /* next digit */
}
}
void numberToBuffer()
{
buffer[0] = convert[sec%10];
buffer[1] = convert[min%10];
buffer[2] = convert[hour%10];
}
void keyexe()
{
if (key != -1)
{
if ((flag1 & 0x80) == 0) /* within 0.5 sec after 1st press
the following execution is not allowed */
{
flag1 |= 0x80; //有按钮按下时flag1的位3置0.5秒钟的1
delay = 50;
switch(key){
case (0): /* key position 0 */
addnumber() //manualOnOff(); /* service key 0 */
break;
case (1): /* key position 1 */
subnumber() //savetimeOnOff1(); /* service key 1 */
break;
case (2): /* key position 2 */
savenumber() //setmin(); /* service key 2 */
break;
}
}
}
}
void addnumber()
{
number++;
if ( number== 360)
number=0;
}
void subnumber()
{
number--;
if ( number== 0)
number=360;
}
void savenumber()
{
hour = number/100;
temp1=hour%100
min=temp1/10
sec=temp1%10
buffer[0] = 0x7f;
buffer[1] = 0x7f;
buffer[2] = 0x7f;
showOnce(); //888
}
}
void showOnce()
{
int i;
for(i=0;i<2000;i++)
scanLED();
}
void keydelay()
{
if ((flag1 & 0x80) !=0)
{
delay--;
if(delay == 0)
flag1 &= ~0x80; //还原flag1
}
}
void comparenumber()
{
if((value&0x20)!=0)
{
compareua0()
}
compareua1()
pause((numbertime-tg))
opto = 0x7f; /* clear P3.7 turning opto on */
}
}
void compareua0()
{
if((p3&0x10)!=0)
{
compareua0
}
}
void compareua1()
{
if((p3&0x10)==0)
{
compareua1
}
}
void offmsd()
{
if (buffer[2] == 0x3f) /* if msd = '0' then put blank unstead */
buffer[2] = 0x00;
}
void pause(j)
int j;
{
int i;
for (i = 0; i < j; i++)
;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -