📄 keyled.c
字号:
/*跑表和计时
8MHz */
#include <iom128v.h>
#include <macros.h>
#include "delay.h"
unsigned char temp;
unsigned char timer2; //the num of 5ms
unsigned int timer200; // the num of 1s
unsigned char work_state; //to set the timer or clock,0表示计时,1表示跑表
unsigned char time_change; //to sign the state of change
unsigned char clock_start; // 跑表开始信号,0表示开始,1 表示暂停
unsigned char time[4]; //array of time
unsigned char clock[4]; //array of watch
const unsigned char seg_table[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
#pragma interrupt_handler timer0_com_isr:17 //timer0 compare interrupt
void display()
{
unsigned char i,j,k;
DDRA=0xff;
PORTA=0xff;
DDRC=0xff;
PORTC=0xff;
if(work_state==0) //计时显示
{
if(time_change==0x00) // normal
{for(i=0;i<4;i++)
{
PORTA=seg_table[time[i]];
PORTC=~(1<<(i+4));
delay_1ms();
PORTC|=0xf0;
}
}
else if(time_change==0x01) // change second
{
if(timer200<100) //正常显示
{
for(i=0;i<4;i++)
{
PORTA=seg_table[time[i]];
PORTC=~(1<<(i+4));
delay_1ms();
PORTC|=0xf0;
}
}
else //只显示分
{for(i=2;i<4;i++)
{
PORTA=seg_table[time[i]];
PORTC=~(1<<(i+4));
delay_1ms();
PORTC|=0xc0;
}
}
}
else if(time_change==0x02) //正常显示
{ if(timer200<100)
{
{ for(i=0;i<4;i++)
{
PORTA=seg_table[time[i]];
PORTC=~(1<<(i+4));
delay_1ms();
PORTC|=0xf0;
}
}
}
else //只显示秒
for(i=0;i<2;i++)
{
PORTA=seg_table[time[i]];
PORTC=~(1<<(i+4));
delay_1ms();
PORTC|=0x30;
}
}
}
//}
//if(clock_start==0x00) //跑表显示,当跑表已经启动时
if(work_state==1)
//{for(j=0;j<5;j++)
{
for(k=0;k<4;k++)
{
PORTA=seg_table[clock[k]];
PORTC=~(1<<(k+4));
delay_1ms();
PORTC|=0xf0;
}
}
//}
}
void timer0_com_isr() /* 2 ms*/
{
TIFR=0xff;
// timer2++; //10 ms
timer200++; //1 s,因为没有暂停的说法,所以一直加
//TCNT0=0x05;
TCNT0=0xd7;
if(timer200==200) //计时 1s
{
timer200=0;
time[0]++;
if(time[0]==10) // second 个位
{
time[0]=0;
time[1]++;
if(time[1]==6) //second 十位
{
time[1]=0;
time[2]++;
if(time[2]==10) // 分个位
{
time[2]=0;
time[3]++;
if(time[3]==6)
time[3]=0;
time[2]=0;
time[1]=0;
time[0]=0;
} //time[2]
} //time[1]
} //time[0]
} // 1s
if(work_state==0x01&&clock_start==0) //跑表
{
timer2++;
if(timer2==0x02)
{timer2=0;
clock[0]++;
if(clock[0]==10)
{
clock[0]=0;
clock[1]++;
if(clock[1]==10)
{
clock[1]=0;
clock[2]++;
if(clock[2]==10)
{
clock[2]=0;
clock[3]++;
if(clock[3]==10)
{
clock[3]=0;
clock[0]=0;
clock[1]=0;
clock[2]=0;
}
}
}
}
}
}
display();
} //timer0_com_isr
void wait()
{
while((PINB&0xf0)!=0xf0)
{
delay(20);
while((PINB&0xf0)!=0xf0)
;
}
}
void main()
{
unsigned char i;
timer2=0;
timer200=0;
work_state=0;
time_change=0x00;
clock_start=1; //停止跑表
/* 定时器0 定时 5 ms,general mode ,溢出 interrupt */
TCCR0=0x07; //general mode
//TCNT0=0x05;
TCNT0=0xd7;
TIMSK=0x01;
DDRB=0x0f; //set PB7~PB4 PULL-UP resistor
PORTB=0xfe;
for(i=0;i<4;i++)
{
time[i]=0;
clock[i]=0;
}
SEI();
while(1)
{
while((PINB&0xf0)==0xf0)
{
delay(20);
while((PINB&0xf0)==0xf0)
;
}
temp=PINB&0xf0;
switch(temp)
{
case 0xe0: //key 0
if(work_state==0)
{
work_state=1; //跑表模式
clock_start=1; //跑表启动
for(i=0;i<4;i++)
clock[i]=0;
}
else
work_state=0x00;
clock_start=0;
wait();
break;
case 0xd0: //key 1
if(work_state==0x00)
{
if(time_change==0x00)
time_change=0x01;
else if(time_change==0x01)
time_change=0x02;
else if(time_change==0x02)
time_change=0x00;
}
if(work_state==0x01) //跑表
{if(clock_start==0x0) //跑表已启动
{
for(i=0;i<4;i++)
clock[i]=0;
}
}
wait();
break;
case 0xb0: //key 2
if(work_state==0x0) // 计时模式
{if(time_change==0x1) //change second
{time[0]++;
if(time[0]==0xa)
{time[0]=0;
time[1]++;
if(time[1]==0x6)
time[1]=0;
}
}
else if(time_change==0x02) //change minute
{
time[2]++;
if(time[2]==0xa)
{time[2]=0;
time[3]++;
if(time[3]==0x6)
time[3]=0;
}
}
}
else if(clock_start==0x00) //跑表模式,已经启动
clock_start=1; //暂停
else
clock_start=0;
wait();
break;
case 0x70: //key 3
if(work_state==0x00) // 计时模式
{
if(time_change==0x01) // 秒
{
time[0]--;
if(time[0]==0xff)
{
time[0]=9;
time[1]--;
if(time[1]==0xff)
time[1]=5;
}
}
else if(time_change==0x02) //decrease minute
{
time[2]--;
if(time[2]==0xff)
{
time[2]=9;
time[3]--;
if(time[3]==0xff)
time[3]=5;
}
}
}
wait();
break;
default:
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -