?? demo_t1_clock.c
字號(hào):
/*********************************************************************
工程名 :Demo_T1_clock
程序名 :同上
創(chuàng)建時(shí)間:11月4日
創(chuàng)建單位:廣西師范大學(xué)
專業(yè) :電子信息工程
作者 :陳哲(06電信)
程序作用:運(yùn)用AVR的T1定時(shí)計(jì)數(shù)器做的數(shù)字時(shí)鐘
實(shí)驗(yàn)CPU :ATMEGA16
晶振 :內(nèi)部8MHZ
版本 :1.2
修改人 :
修改時(shí)間:
*************************************************************************/
#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};
//共陰極數(shù)碼管,分別表示: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++做好習(xí)慣
uchar volatile seconds=0,minutes=0,hours=0;//思考為什么要VOLATILE來(lái)聲明
//T1的初始化程序
void timer1_init()
{
TCCR1B = 0x00;//停止定時(shí)器
TIMSK |= 0x10;//中斷允許,CTC匹配中斷模式,TOP=3D0
TCNT1H = 0x00;
TCNT1L = 0x00;//初始值
OCR1AH = 0x03;
OCR1AL = 0x0d;//匹配A值 //填充一個(gè)數(shù)字用0.128MS,那么如果是100MS,就用781次,再下面的程序中,在重復(fù)10次就是1S
OCR1BH = 0x00;
OCR1BL = 0x00;//匹配B值
ICR1H = 0xff;
ICR1L = 0xff;//輸入捕捉匹配值
TCCR1A = 0x00;
TCCR1B = 0x0d;//啟動(dòng)定時(shí)器
}
void port_init()
{
DDRA=0Xff;
PORTA=0Xff;
DDRC=0Xff;
PORTC=0Xff;
}
void init_devices(void)
{
cli(); //禁止所有中斷 可以思考這條語(yǔ)句的意思,是什么語(yǔ)言,從哪來(lái),作用是什么?
MCUCR = 0x00;
MCUCSR = 0x80;//禁止JTAG
GICR = 0x00;
port_init();
timer1_init();
sei();//開全局中斷
}
//將要顯示的數(shù)據(jù)拆分成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];
}
//顯示服務(wù)程序
void display()
{
uchar i;
display_handle();
for(i=0;i<8;i++)
{
PORTA=dis_data[i];
PORTC=disbeat_run[i];
_delay_ms(2);
}
}
//鍵盤識(shí)別程序
void read_key()
{
if((PINB&0x0f)!=0x0f)
{
_delay_ms(10);
switch(PINB&0x0f)
{
case 0x0e:
seconds=0;
while((PINB&0x0f)==0x0e)
{
display();
}
break;//可以思考為什么在這里要放置display()函數(shù)
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;
}
}
}
//定時(shí)器T1匹配中斷A服務(wù)程序
//#pragma interrupt_handler timer1_compa_isr:8
//void timer1_compa_isr(void)
SIGNAL(SIG_OUTPUT_COMPARE1A)
{
static uchar count=0;
count++;
if(count==10)//有誤差,需要重新計(jì)算
{
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();
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -