?? led數字鐘.c
字號:
---------------------------------------------------------
簡單的時鐘程序
---------------------------------------------------------
實驗系統: ME300全系列單片機開發板。
實驗芯片: ATmega8515L或Atmega8515
工作頻率: 8MHz
編譯軟件: WINAVR 1.41
作者:偉納電子 gguoqing Email:gguoqing@willar.com
---------------------------------------------------------
功能:
簡易帶有百位毫秒顯示的24小時制時鐘
8個數碼管從左至右依次顯示:時,分,秒,-,百位毫秒。
顯示格式: 01. 23. 45. - 6
程序中有內部RC振蕩效準功能。
----------------------------------
將 ME300B 的 JP2 的2、3腳用跳線帽短接,選擇使用數碼管顯示 。
----------------------------------
C語言編寫:
//***************WINAVR V1.41編譯*****************//
#include"avr/io.h" //頭文件
#include < ;avr/pgmspace.h> //
#include"avr/interrupt.h" //中斷處理函數
#include"avr/signal.h" //
#include < ;compat/ina90.h>
#define uchar unsigned char
#define uint unsigned int
//數碼管字型表,對應0,1,2,3,4,5,6,7,8,9,后十位數是帶小數點的0-9//
uchar Table[22]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xbf,0xff} ;
uchar Data[8]={0,0,0,0,0,0,0,0} ; //顯示初始值:0 0 0 0 0 0
uint CNT=0 ; //初始計數值:0
uchar Timer[4]={0x00,0x00,0x00,0x00} ; //初始時間00:00:00
//const prog_uchar OSCCAL_value_Flash ; //定義指向flash存儲器的指針
void DelayMs(uint i) //Ms級延時,參數i為延時時間
{uint j ;
for( ;i!=0 ;i--)
{for(j=8000 ;j!=0 ;j--) { ;}}
}
void Display(uchar *p) //動態顯示函數,參數p為待顯示的數組名
{uchar i,sel=0xfe ;
for(i=0 ;i< ;8 ;i++)
{PORTC=sel ; //選通最右邊的數碼管
PORTA=Table[p[ i ] ] ; //送字型碼
DelayMs(2) ; //顯示延時
sel=(sel< ;< ;1)|0x01 ; //移位以顯示前一位
}
}
//計數值處理函數。參數p1:時間數組名;參數p2:顯示數組名//
//功能:此函數用于將計數值拆分為BCD碼的10時,時,10分,分,10秒,秒,100毫秒
void Process(uchar *p1,uchar *p2)
{p2[0]=p1[0]/10 ; //時十位
p2[1]=(p1[0]-p2[0]*10)+10 ; //時個位數加小數點顯示
p2[2]=p1[1]/10 ; //分十位
p2[3]=(p1[1]-p2[2]*10)+10 ; //分個位數加小數點顯示
p2[4]=p1[2]/10 ; / /秒十位
p2[5]=(p1[2]-p2[4]*10)+10 ; //秒個位數加小數點顯示
p2[6]=20 ; //顯示-
p2[7]=p1[3] ; //ms百位
}
void Init_IO(void) //初始化I/O口
{DDRA=0xff ; //設置A口為推挽1輸出
PORTA=0xff ;
DDRC=0xff ; //設置C口為推挽1輸出;
PORTC=0xff ;
}
int main(void)
{
OSCCAL=pgm_read_word(0x0003) ; //從地址0x0003中讀出校正值放進OSCCAL
//OSCCAL=0x9d ; //校正值放入0SCCAL
// _NOP() ;
Init_IO() ; //初始化I/O口
PORTA=0x00 ; //點亮以測試所有的數碼管
PORTC=0x00 ;
DelayMs(3000) ; //延時
PORTC=0xff ; //熄滅所有的數碼管
TCCR0=0x02 ; //T/C0工作于定時方式,系統時鐘8分頻
TCNT0=-10 ; //計數初始值 -10
TIMSK=0x02 ; //開放TOV0中斷
SREG=SREG|0x80 ; //開放總中斷
while(1)
{Process(Timer,Data) ; //計數值處理
Display(Data) ; //動態掃描顯示
}
}
//********************T/C0中斷服務函數********************//
SIGNAL(SIG_OVERFLOW0)
{
TCNT0=-10 ; //重裝計數初始值-10
CNT++ ; //中斷次數累加
if(CNT==8229)
{CNT=0 ; //計數到8229次,計數值復位
Timer[3]++ ; //毫秒加1
if(Timer[3]==10)
{Timer[3]=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 + -