/*****************************************************
*****************************************************/
#include
#define HC595_DATA_HIGH PORTC |= (1<<0)
#define HC595_DATA_LOW PORTC &= ~(1<<0)
//输出锁存器控制时钟信号
#define HC595_LCLK_HIGH PORTC |= (1<<1)
#define HC595_LCLK_LOW PORTC &= ~(1<<1)
//移位时钟时钟信号
#define HC595_SCLK_HIGH PORTC |= (1<<2)
#define HC595_SCLK_LOW PORTC &= ~(1<<2)
unsigned char LED[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned int wei=0;
unsigned char time[3]={55,20,20};
unsigned char dis_buff[6];
int time_counter;
unsigned char posit;
bit time_1s_ok;
void DataSendTo74HC595(unsigned char data)
{
unsigned char i = 0;
unsigned char Data_Temp;
Data_Temp = data;
HC595_SCLK_LOW; //时钟信号拉低
for(i=0;i<8;i++)
{
if(Data_Temp & 0x80)
HC595_DATA_HIGH;
else
HC595_DATA_LOW; //传输数据0还是1
HC595_SCLK_HIGH; //时钟信号拉高
HC595_SCLK_LOW; //时钟信号拉低
Data_Temp <<= 1;
}
}
void shumaguan(unsigned char weixuan,unsigned char duanxuan) //数码管点亮函数
{
HC595_SCLK_LOW;
HC595_LCLK_LOW;
DataSendTo74HC595(~(1<
HC595_LCLK_HIGH;
}
void gang(unsigned char weixuan) //时分秒之间的间隔符号点亮函数,一横杠符号
{
HC595_SCLK_LOW;
HC595_LCLK_LOW;
DataSendTo74HC595(~(1<
HC595_LCLK_HIGH;
}
void display()
{
shumaguan(posit,LED[dis_buff[posit]]); //前6位依次显示时分秒
if(++posit>=6) posit=0;
}
interrupt[TIM0_COMP] void timer0_comp_isr() //比较中断匹配函数
{
display();
if(++time_counter>=125); //计数器满125的时候,就是1s到了
{
time_counter=0;
time_1s_ok=1;
}
}
void time_to_disbuffer() //时间送显示缓冲区函数
{
unsigned char i,j=5;
for(i=0;i<=2;i++)
{
dis_buff[j--]=time[i]%10;
dis_buff[j--]=time[i]/10;
}
}
void system_init() //系统初始化函数
{
MCUCSR = 0x80;
MCUCSR = 0x80; //C端口为普通I/O口
DDRC = 0xff;
PORTC = 0x00;
DDRA=0xff;
PORTA=0X00;
TCCR0=0b00001011; //64分频,CTC模式,1/64 MHz
TCNT0=0X00;
OCR0=124; //(124+1)/1000000*64=0.008毫秒
TIMSK=0X02;
posit=0;
}
void main()
{
system_init();
time_to_disbuffer();
#asm("sei") //全局中断使能
while(1)
{
if(time_1s_ok)
{
time_1s_ok=0;
if(++time[0]>=60)
{
time[0]=0;
if(++time[
1]>=60)
{
time[1]=0;
if(++time[2]>=24) time[2]=0;
}
}
time_to_disbuffer();
}
}
}