?? tc0.c
字號:
/***********************************************************
Project : AVR 用TC/0設計的時鐘
Chip type : ATmega16
Frequency : 8M
Software : Codevision 1.24.6
Author : shishuwu
Date : 09.02.23
*************************************************************/
#include<MEGA16.h>
#include<delay.h>
const unsigned char table[10]=
{0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char Data[6]={0,0,0,0,0,0};
unsigned int CNT=0; //初始計數值:0
unsigned char Timer[3]={0x00,0x00,0x00};
void Display(unsigned char *p) //動態顯示函數,參數p為待顯示的數組名
{
PORTB=0xfe;
PORTD=table[p[5]];
delay_ms(5);
PORTB=0xfd;
PORTD=table[p[4]];
delay_ms(5);
PORTB=0xfb;
PORTD=table[p[3]];
delay_ms(5);
PORTB=0xf7;
PORTD=table[p[2]];
delay_ms(5);
PORTB=0xef;
PORTD=table[p[1]];
delay_ms(5);
PORTB=0xdf;
PORTD=table[p[0]];
delay_ms(5);
}
void Process(unsigned char *p1,unsigned char *p2)
{
p2[0]=p1[0]/10;
p2[1]=p1[0]-p2[0]*10;
p2[2]=p1[1]/10;
p2[3]=p1[1]-p2[2]*10;
p2[4]=p1[2]/10;
p2[5]=p1[2]-p2[4]*10;
}
void Init_IO(void) //初始化I/O口
{
DDRD=0xff; //設置A口為推挽1輸出
PORTD=0xff;
DDRB=0x3f; //設置C口為推挽1輸出
PORTB=0x3f;
}
void main(void)
{
Init_IO(); //初始化I/O口
PORTA=0xff; //點亮以測試所有的數碼管
PORTD=0x00;
delay_ms(1000); //延時
PORTD=0xff; //熄滅所有的數碼管
TCCR0=0x04; //TC/0工作在定時方式,CLK/256
TCNT0=0x06; //計數初始值6
TIMSK=0x01; //Timer0下降沿觸發
#asm("sei") //開全局中斷
while(1)
{
Process(Timer,Data);
Display(Data);
}
}
interrupt[TIM0_OVF] void timer0_ovf_isr(void)
{
if(++CNT==125) //中斷次數累加,1S
{
CNT=0;
Timer[2]++;
if(Timer[2]==60) //秒加一
{
Timer[2]=0;
Timer[1]++; //分進位
}
if(Timer[1]==60)
{
Timer[1]=0;
Timer[0]++; //時進位
}
if(Timer[0]==24)
{
Timer[0]=0;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -