?? 簡易24小時制時鐘.txt
字號:
該AVR的匯編程序選自《M128》,程序中體現(xiàn)了AVR匯編的基本特點,僅供大家參考。
該應用系統(tǒng)為一個帶1/100秒的簡易24小時制時鐘,它在上電后能夠自動從11時59分55秒00開始計時和顯示時間。下圖為簡易時鐘系統(tǒng)硬件電路圖。
圖 簡易24小時時鐘硬件原理圖
系統(tǒng)使用8個LED數(shù)碼管顯示時、分、秒、1/100秒4個時段的數(shù)字,每個時段占用2個LED。顯示方式采用動態(tài)掃描方式,ATmega128的PA口輸出顯示數(shù)字的7段碼(注意:圖中省缺了PA口連接到LED各段的8個限流電阻,阻值800歐左右),PC口用于控制8個LED的位選。ATmega128使用外部16MHz晶振(圖中未畫出)。
系統(tǒng)還使用ATmega128片內(nèi)的計數(shù)/定時器T1,設計T1工作在定時溢出中斷方式,定時間隔為2ms,即T1每2ms產(chǎn)生一次中斷。5次中斷得到10ms的時間間隔,此時時鐘的1/100秒加1,并相應進行時、分、秒的調(diào)整。
LED動態(tài)掃描方式的設計如下:在每2ms的時間中,點亮8個LED中的一個,顯示其相應的數(shù)字(PC口的輸出只有一位為低電平,選通一個LED,保持2ms)。因此PC口的輸出值為0b11111110,每隔2ms循環(huán)右移,到0b01111111時8個LED各點亮一次,時間為16ms。在1秒鐘內(nèi),循環(huán)8個LED的次數(shù)為62.5(1000/16),是人眼的滯留時間(25次/秒)的2.5倍,保證了LED顯示亮度均勻,無閃爍。在程序設計中,在各個LED轉(zhuǎn)換和7段碼輸出時,關(guān)閉位選信號(PC輸出0b11111111),消除了顯示的拖尾現(xiàn)象(消影功能)。
T1的設計:T1為16位定時器,系統(tǒng)時鐘為16M,采用其64分頻后的時鐘作為T1的計數(shù)信號(寄存器TCCR1B = 0x03),一個計數(shù)周期為4us,2ms需要計500個(0x01F4)。由于T1溢出中斷發(fā)生在0xFFFF后下一個T1計數(shù)脈沖的到來(參見第二章關(guān)于定時器原理部分),因此T1的計數(shù)初始值為0xFE0C = 0xFFFF – 0x01F3(65535-499),即寄存器TCNT1的初值為0xFE0C。
3.8.2 AVR匯編源代碼
該系統(tǒng)的匯編源代碼如下,開發(fā)軟件平臺使用AVR Studio 4.08。
;********************************************************
;AVR匯編程序?qū)嵗?
;簡易帶1/100秒的24小時制時鐘
;********************************************************
.include "m128def.inc" ;引用器件I/O配置文件
;定義程序中使用的變量名(在寄存器空間)
.def count = r18 ;循環(huán)計數(shù)單元
.def position = r19 ;LED顯示位指針,取值為0-7
.def p_temp = r20 ;LED顯示位選,其值取反由PC口輸出
.def count_10ms = r21 ;10ms計數(shù)單元
.def flag_2ms = r22 ;2ms到標志
.def temp = r23 ;臨時變量
.def temp1 = r24 ;臨時變量
.def temp_int = r25 ;臨時變量(中斷中使用)
;中斷向量區(qū)定義,flash空間$0000-$0045
.org $0000
jmp reset ;復位處理
reti ;IRQ0 Handler
nop
reti ;IRQ1 Handler
nop
reti ;IRQ2 Handler
nop
reti ;IRQ3 Handler
nop
reti ;IRQ4 Handler
nop
reti ;IRQ5 Handler
nop
reti ;IRQ6 Handler
nop
reti ;IRQ7 Handler
nop
reti ;Timer2 Compare Handler
nop
reti ;Timer2 Overflow Handler
nop
reti ;Timer1 Capture Handler
nop
reti ;Timer1 CompareA Handler
nop
reti ;Timer1 CompareB Handler
nop
jmp time1_ovf ;Timer1 Overflow Handler
reti ;Timer0 Compare Handler
nop
reti ;Timer0 Overflow Handler
nop
reti ;SPI Transfer Complete Handler
nop
reti ;USART0 RX Complete Handler
nop
reti ;USART0 UDR Empty Handler
nop
reti ;USART0 TX Complete Handler
nop
reti ;ADC Conversion Complete Handler
nop
reti ;E2PROM Ready Handler
nop
reti ;Analog Comparator Handler
nop
reti ;Timer1 CompareC Handler
nop
reti ;Timer3 Capture Handler
nop
reti ;Timer3 CompareA Handler
nop
reti ;Timer3 CompareB Handler
nop
reti ;Timer3 CompareC Handler
nop
reti ;Timer Overflow Handler
nop
reti ;USART1 RX Complete Handler
nop
reti ;USART1 UDR Empty Handler
nop
reti ;USART1 TX Complete Handler
nop
reti ;Two-wire Serial Interface Handler
nop
reti ;SPM Ready Handler
nop
;程序開始
.org $0046
reset:
ldi r16,high(RAMEND) ;設置堆棧指針高位
out sph,r16
ldi r16,low(RAMEND) ;設置堆棧指針低位
out spl,r16
ser temp
out ddra,temp ;設置PORTA為輸出,段碼輸出
out ddrc,temp ;設置PORTC為輸出,位碼控制
out portc,temp ;PORTC輸出$FF, 無顯示
ldi position,0x00 ;段位初始化為1/100秒低位
ldi p_temp,0x01 ;LED第1位亮
;初始化時鐘時間為11:59:55:00
ldi xl,low(time_buff) ;
ldi xh,high(time_buff) ;X寄存器取得時鐘單元首指針
ldi temp,0x00
st x+,temp ;1/100秒 = 00
ldi temp,0x55
st x+,temp ;秒 = 55
ldi temp,0x59
st x+,temp ;分 = 59
ldi temp,0x11
st x,temp ;時 = 11
ldi temp,0xfe ;T1初始化,每隔2ms中斷一次
out tcnt1h,temp
ldi temp,0x0c
out tcnt1l,temp
clr temp
out tccr1a,temp
ldi temp,0x03 ;16M,64分頻 2ms
out tccr1b,temp
ldi temp,0x04
out timsk,temp ;允許T1溢出中斷
sei ;全局中斷允許
;主程序
main:
cpi flag_2ms,0x01 ;判2ms到否
brne main ;No,轉(zhuǎn)main循環(huán)
clr flag_2ms ;到,請2ms標志
rcall display ;調(diào)用LED顯示時間(動態(tài)掃描顯示一位)
d_10ms_ok:
cpi count_10ms,0x05 ;判10ms到否
brne main ;No,轉(zhuǎn)main循環(huán)
clr count_10ms ;10ms到,清零10ms計數(shù)器
rcall time_add ;調(diào)用時間加10ms調(diào)整
rcall put_t2d ;將新時間值放入顯示緩沖單元
rjmp main ;轉(zhuǎn)main循環(huán)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -