?? clock.c
字號:
/**********************************************
http://www.sl.com.cn
雙龍電子公司----電腦時鐘演示程序(ICCAVR)
作者:詹衛前
1、學習定時器T1溢出中斷的使用
2、學習電腦時鐘的編程方法
3、在程序運行時按SHIFT進行校時
使用注意:1、應包含頭文件slavr.h
2、在工程選項中的Additional Lib中填入slavr
使用編譯器使用附加庫文件libslavr.a
***********************************************/
#include <io8515.h>
#include <macros.h>
#include <slavr.h>
#pragma interrupt_handler timer1:7
#pragma data:code
/* 七段譯碼字形表 */
const unsigned char tabel[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
#pragma data:data
/* 顯示緩沖區 */
unsigned char ledbuff[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};
unsigned char time[3]={0,0,0};
unsigned char flag=0;
/*****************************************
初始化
*****************************************/
void port_init(void)
{
DDRD=0x3f;
DDRB=0xff;
PORTD=0xff;
PORTB=0xff;
TIMSK=0x80;//開放T1溢出中斷
TCCR1A=0x00;
TCCR1B=0x04;
TCNT1=0x85ee;
SEI();
}
/*****************************************
刷新LED顯示緩沖區
*****************************************/
void hextobcd (void)
{
unsigned char i,temp;
for (i=0;i<3;i++)
{
temp=time[i]/10;
temp=temp%10;
ledbuff[5-2*i]=tabel[temp];
temp=time[i]%10;
ledbuff[4-2*i]=tabel[temp];
}
}
/*****************************************
六路動態掃描顯示電路
*****************************************/
void display(void)
{
unsigned char i;
for (i=0;i<6;i++)
{
PORTB=ledbuff[i];//將顯示緩沖區數據送PORTB口
PORTD=~(1<<i); //開始顯示
delay_1ms(); //每一位顯示保持一定時間
PORTD|=(1<<i); //關閉顯示
}
}
/*****************************************
設定校時時間
*****************************************/
void settime(void)
{
unsigned char t1,t2,t3;
for (t1=0;t1<3;t1++)
{
ledbuff[5-2*t1]|=0x80;
do
{
t2=scan_key();
display();
}
while(t2==0x7f);
do
{
t3=scan_key();
display();
}
while (t2==t3);
time[t1]=time[t1]%10+t2*10;
hextobcd();
ledbuff[5-2*t1]&=0x7f;
ledbuff[4-2*t1]|=0x80;
do
{
t2=scan_key();
display();
}
while(t2==0x7f);
do
{
t3=scan_key();
display();
}
while (t2==t3);
t3=time[t1]/10;
time[t1]=t3*10+t2;
ledbuff[4-2*t1]&=0x7f;
hextobcd();
}
}
/*****************************************
主程序功能:演示了電腦時鐘程序的工作過程
*****************************************/
void main(void)
{
unsigned char i,j;
MCUCR=0;
flag=0;
port_init(); //端口初始化
i=scan_key();
while(1)
{
i=scan_key();
if (i!=0x7f)
{
do
{
j=scan_key();
display();
}
while (i==j);
if ((i&0x80)==0x80)
settime();//設定時間
}
if(flag==1)
{
flag=0;
if (time[2]>=60)
{
time[2]-=60;
time[1]++;
}
if (time[1]>=60)
{
time[1]-=60;
time[0]++;
}
if (time[0]>=24)
{
time[0]-=24;
}
hextobcd();
}
display();
}
}
/*****************************************
T1溢出中斷
*****************************************/
void timer1(void)
{
flag=1;
time[2]++;
TCNT1=0x85ee;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -