📄 main.c
字号:
/*
*** 雀肺 楷搬档 **
* MCU : ATmega8515
* RTC : DS1302
PORTE
0-CE
1-IO
2-CLK
* SEGMENT : Common Anode
PORTD :Segment Data(8bit)
PORTB : SCAN
0~3-DIGIT
4-LED
* BUTTON
PORTA
0~3
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include "global.h"
#include "delay.h"
#include "ds1302.h"
#include "seg.h"
#include "key.h"
// (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
static U8 segment[10]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
enum {mode_min, mode_hour};
// DS1302肺何磐 矫埃阑 罐酒坷扁 困茄 函荐
static U8 second=0;
static U8 minute=0;
static U8 hour=0;
// 技弊刚飘狼 阿 磊府俊 秦寸窍绰 函荐
static U8 second0=0;
static U8 second1=0;
static U8 minute0=0;
static U8 minute1=0;
static U8 hour0=0;
static U8 hour1=0;
// 惑怕函拳俊 荤侩登绰 函荐
static U8 mode_flag=0; // mode 捞悼
static U8 current_pos=0; // 矫埃, 盒阑 函版矫 函版窍绊 乐绰 葛靛狼 困摹
static U8 read_flag=0; // 矫埃阑 荐沥且 悼救 DS1302俊辑 单捞磐甫 罐酒坷瘤 给窍霸
void display_time(void);
SIGNAL(SIG_OVERFLOW0)
{
display_time();
TCNT0 = 249;
}
int main()
{
// 林函 IO 檬扁拳
Init_DS1302();
Init_KEY();
Init_SEG();
TCCR0 = 0x05; // 1/1024 橇府胶纳老矾
TCNT0 = 249; // 1/100檬甫 困茄 鸥捞赣 0x64(100)
TIMSK = 0x02; // timer0 interrupt enable
TIFR = 0x00;
sei();
while(1)
{
if (read_flag == 0)
{
second = DS1302_Read(DS1302_SECOND);
minute = DS1302_Read(DS1302_MINUTE);
hour = DS1302_Read(DS1302_HOUR);
second0 = (U8)second & 0x0F;
second1 = (U8)(second >> 4)& 0x07;
minute0 = (U8)minute & 0x0F;
minute1 = (U8)(minute >> 4)& 0x07;
hour0 = (U8)hour & 0x0F;
hour1 = (U8)(hour >> 4) & 0x03;
// led 濒糊烙
if ((second % 2) == 0)
sbi(SCAN_PORT, SCAN_LED);
else
cbi(SCAN_PORT, SCAN_LED);
}
// 荤侩磊 虐 瘤沥
if (KEY_MODE == 0)
{
read_flag = 1; // DS1302俊辑 矫埃 罐酒 坷瘤 给窍霸 窍妨绊
switch (mode_flag)
{
case 0 :
current_pos = mode_min;
mode_flag=1;
break;
case 1 :
current_pos = mode_hour;
mode_flag=2;
break;
case 2 :
mode_flag=0;
read_flag = 0; // DS1302俊辑 矫埃 罐酒 坷霸
minute = ((minute1<<4) | minute0);
hour = ((hour1<<4) | hour0);
DS1302_Write(DS1302_SECOND, 0x00); // second 00
DS1302_Write(DS1302_MINUTE, minute);
DS1302_Write(DS1302_HOUR, hour&0x7f); // 24hour set
break;
default :
break;
} // end switch
delay_ms(20);
}
else if ((KEY_UP == 0))
{
if (current_pos == mode_min)
{
minute0++;
if (minute0 == 10)
{
minute0=0;
minute1++;
if (minute1 == 6)
minute1 = 0;
}
}
else if (current_pos == mode_hour)
{
hour0++;
if (hour0 == 10)
{
hour0=0;
hour1++;
}
if ((hour1 == 2) && (hour0 == 5))
{
hour1 = 0;
hour0 = 0;
}
}
delay_ms(20);
}
else if (KEY_DOWN == 0)
{
if (current_pos == mode_min)
{
minute0--;
if (minute0 == 0)
{
minute0=9;
if (minute1 == 0)
minute1 = 6;
--minute1;
}
}
else if (current_pos == mode_hour)
{
hour0--;
if (hour0 == 0)
{
hour0 = 9;
hour1--;
if (hour1 == 0)
hour1 = 3;
}
}
delay_ms(20);
}
} // end while
return 0;
} // end main
void display_time(void)
{
// 矫埃(hour)狼 惑困磊府
SEG_PORT = segment[hour1];
SCAN_PORT = 0x08;
delay_us(250);
delay_us(250);
// 矫埃(hour)狼 窍困磊府
SEG_PORT = segment[hour0];
SCAN_PORT = 0x04;
delay_us(250);
delay_us(250);
// 盒(minute)狼 惑困磊府
SEG_PORT = segment[minute1];
SCAN_PORT = 0x02;
delay_us(250);
delay_us(250);
// 盒(minute)狼 窍困磊府
SEG_PORT = segment[minute0];
SCAN_PORT = 0x01;
delay_us(250);
delay_us(250);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -