📄 demo_t1_clock.c
字号:
/*********************************************************************
工程名 :Demo_T1_clock
程序名 :同上
创建时间:11月4日
创建单位:广西师范大学
专业 :电子信息工程
作者 :陈哲(06电信)
程序作用:运用AVR的T1定时计数器做的数字时钟
实验CPU :ATMEGA16
晶振 :内部8MHZ
版本 :1.2
修改人 :
修改时间:
*************************************************************************/
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define uchar unsigned char
#define uint unsigned int
//全局变量在这里定义:
uchar disnumber_code[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
//共阴极数码管,分别表示:0 1 2 3 4 5 6 7 8 9 -
uchar disbeat_run[8]=//{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
{0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
//扫描方式选位
uchar dis_data[8]={0,0,0,0,0,0,0,0};//初始值一定要给,为以后VC++做好习惯
uchar volatile seconds=0,minutes=0,hours=0;//思考为什么要VOLATILE来声明
//T1的初始化程序
void timer1_init()
{
TCCR1B = 0x00;//停止定时器
TIMSK |= 0x10;//中断允许,CTC匹配中断模式,TOP=3D0
TCNT1H = 0x00;
TCNT1L = 0x00;//初始值
OCR1AH = 0x03;
OCR1AL = 0x0d;//匹配A值 //填充一个数字用0.128MS,那么如果是100MS,就用781次,再下面的程序中,在重复10次就是1S
OCR1BH = 0x00;
OCR1BL = 0x00;//匹配B值
ICR1H = 0xff;
ICR1L = 0xff;//输入捕捉匹配值
TCCR1A = 0x00;
TCCR1B = 0x0d;//启动定时器
}
void port_init()
{
DDRA=0Xff;
PORTA=0Xff;
DDRC=0Xff;
PORTC=0Xff;
}
void init_devices(void)
{
cli(); //禁止所有中断 可以思考这条语句的意思,是什么语言,从哪来,作用是什么?
MCUCR = 0x00;
MCUCSR = 0x80;//禁止JTAG
GICR = 0x00;
port_init();
timer1_init();
sei();//开全局中断
}
//将要显示的数据拆分成BCD码去显示
void display_handle()
{
dis_data[0]=disnumber_code[seconds%10];
dis_data[1]=disnumber_code[seconds/10];
dis_data[2]=disnumber_code[10];
dis_data[3]=disnumber_code[minutes%10];
dis_data[4]=disnumber_code[minutes/10];
dis_data[5]=disnumber_code[10];
dis_data[6]=disnumber_code[hours%10];
dis_data[7]=disnumber_code[hours/10];
}
//显示服务程序
void display()
{
uchar i;
display_handle();
for(i=0;i<8;i++)
{
PORTA=dis_data[i];
PORTC=disbeat_run[i];
_delay_ms(2);
}
}
//键盘识别程序
void read_key()
{
if((PINB&0x0f)!=0x0f)
{
_delay_ms(10);
switch(PINB&0x0f)
{
case 0x0e:
seconds=0;
while((PINB&0x0f)==0x0e)
{
display();
}
break;//可以思考为什么在这里要放置display()函数
case 0x0d:
minutes++;
if(minutes==60){minutes=0;}
while((PINB&0x0f)==0x0d)
{
display();
}
break;
case 0x0b:
hours++;
if(hours==60){hours=0;}
while((PINB&0x0f)==0x0b)
{
display();
}
break;
}
}
}
//定时器T1匹配中断A服务程序
//#pragma interrupt_handler timer1_compa_isr:8
//void timer1_compa_isr(void)
SIGNAL(SIG_OUTPUT_COMPARE1A)
{
static uchar count=0;
count++;
if(count==10)//有误差,需要重新计算
{
count=0;
seconds++;
if(seconds==60)
{
seconds=0;
minutes++;
if(minutes==60)
{
minutes=0;
hours++;
if(hours==24)
{
hours=0;
}
}
}
}
}
void main()
{
init_devices();
while(1)
{
read_key();
display();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -