簡(jiǎn)易帶1/100 秒的24 小時(shí)制時(shí)鐘
;********************************************************
;AVR匯編程序?qū)嵗?簡(jiǎn)易帶1/100秒的24小時(shí)制時(shí)鐘
;簡(jiǎn)易帶1/100秒的24小時(shí)制時(shí)鐘
;MEGA16 4MHz
;********************************************************
.include "m16de.inc" ;引用器件I/O配置文件
;定義程序中使用的變量名(在寄存器空間)
.def count = r18 ;循環(huán)計(jì)數(shù)單元
.def position = r19 ;LED顯示位指針,取值為0-7
.def p_temp = r20 ;LED顯示位選,其值取反由PC口輸出
.def count_10ms = r21 ;10ms計(jì)數(shù)單元
.def flag_2ms = r22 ;2ms到標(biāo)志
.def temp = r23 ;臨時(shí)變量
.def temp1 = r24 ;臨時(shí)變量
.def int = r25 ;臨時(shí)變量(中斷中使用)
;中斷向量區(qū)定義,flash空間$0000-$0045
.org $000
rjmp reset ;復(fù)位處理
nop
reti ;INT0 Handler
nop
reti ;INT1 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
rjmp time1_ovf ;Timer1 Overflow Handler
nop
reti ;Timer0 Overflow Handler
nop
reti ;SPI Transfer Complete Handler
nop
reti ;USART RX Complete Handler
nop
reti ;USART UDR Empty Handler
nop
reti ;USART TX Complete Handler
nop
reti ;ADC Conversion Complete Handler
nop
reti ;E2PROM Ready Handler
nop
reti ;Analog Comparator Handler
nop
reti ;Two-wire Serial Interface Handler
nop
reti ;INT2 Handler
nop
reti ;Timer0 Comp Handler
nop
reti ;SPM Ready Handler
nop
;程序開始
.org $02A
reset:
ldi r16,high(RAMEND) ;設(shè)置堆棧指針高位
out sph,r16
ldi r16,low(RAMEND) ;設(shè)置堆棧指針低位
out spl,r16
ser temp
out ddra,temp ;設(shè)置PORTA為輸出,段碼輸出
out ddrc,temp ;設(shè)置PORTC為輸出,位碼控制
out portc,temp ;PORTC輸出$FF, 無顯示
ldi position,0x00 ;段位初始化為1/100秒低位
ldi p_temp,0x01 ;LED第1位亮
;初始化時(shí)鐘時(shí)間為11:59:55:00
ldi xl,low(time_buff) ;
ldi xh,high(time_buff) ;X寄存器取得時(shí)鐘單元首指針
ldi temp,0x00
st x+,temp ;1/100秒 = 00
ldi temp,55
st x+,temp ;秒 = 55
ldi temp,59
st x+,temp ;分 = 59
ldi temp,11
st x,temp ;時(shí) = 11
ldi temp,0xff ;T1初始化,每隔2ms中斷一次
out tcnt1h,temp
ldi temp,0x83
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 ;到,請(qǐng)2ms標(biāo)志
rcall display ;調(diào)用LED顯示時(shí)間(動(dòng)態(tài)掃描顯示一位)
d_10ms_ok:
cpi count_10ms,0x05 ;判10ms到否
brne main ;No,轉(zhuǎn)main循環(huán)
clr count_10ms ;10ms到,清零10ms計(jì)數(shù)器
rcall time_add ;調(diào)用時(shí)間加10ms調(diào)整
rcall put_t2d ;將新時(shí)間值放入顯示緩沖單元
rjmp main ;轉(zhuǎn)main循環(huán)
;LED動(dòng)態(tài)掃描顯示子程序,2ms執(zhí)行一次,一次點(diǎn)亮一位,8位循環(huán)
display:
clr r0
ser temp ;temp = 0x11111111
out portc,temp ;關(guān)顯示,去消影和拖尾作用
ldi yl,low(display_buff)
ldi yh,high(display_buff) ;Y寄存器取得顯示緩沖單元首指針
add yl,position ;加上要顯示的位值
adc yh,r0 ;加上低位進(jìn)位
ld temp,y ;temp中為要顯示的數(shù)字
clr r0
ldi zl,low(led_7 * 2)
ldi zh,high(led_7 * 2) ;Z寄存器取得7段碼組的首指針
add zl,temp ;加上要顯示的數(shù)字
adc zh,r0 ;加上低位進(jìn)位
lpm ;讀對(duì)應(yīng)七段碼到R0中
out porta,r0 ;LED段碼輸出
mov r0,p_temp
com r0,
out portc,r0 ;輸出位控制字,完成LED一位的顯示
inc position ;調(diào)整到下一次顯示位
lsl p_temp
cpi position,0x08
brne display_ret
ldi position,0x00
ldi p_temp,0x01
display_ret:
ret