?? slavr747.asm
字號(hào):
; 測(cè)轉(zhuǎn)速,信號(hào)從AT90S8515的ICP引腳輸入,最大值為為999999轉(zhuǎn)/分
.include"8515def.inc"
rjmp reset
.def temp = r16 ;暫存器
.def aa = r17
.def cnt = r18
.def mc16l = r19 ;mc16l和mc16h存放脈沖個(gè)數(shù)
.def mc16h = r20
.def mp8u = r21 ;mp8u=30,因?yàn)槭敲?秒采樣
.def res1 = r21 ;res1、res2和res3存放結(jié)果的十六進(jìn)制
.def res2 = r22
.def res3 = r23
.def count = r24
.def cnt1d = r25 ;cnt1、dcnt2d和cnt3d存放結(jié)果的十進(jìn)制
.def cnt2d = r26
.def cnt3d = r27
.def dt = r28
.def dt1 = r29
.org 0x003 ;icp觸發(fā)中斷向量
icpt1:
rjmp captr
.org 0x008
rjmp interru
.cseg
.org 0x010
captr: ;icp觸發(fā)中斷子程序
brts down
ldi temp, 0b00000101
out tccr0, temp ;開(kāi)timer0
ldi temp, 0b00001010
out timsk, temp ;致timer0中斷和捕捉中斷
ldi temp, 0b10000000
out tccr1b,temp
set
reti
down: ;下降沿開(kāi)始計(jì)數(shù)
set
inc mc16l
brne b
inc mc16h
cpse mc16h, dt1 ;溢出處理
rjmp b
ldi mc16h, 00
ldi mc16l, 00
rjmp over
b:
ldi temp, 0b00001010 ;致timer0中斷和捕捉中斷
out timsk, temp
ldi temp, 0b10000000
out tccr1b,temp
reti
interru: ;timer0溢出中斷子程序
dec cnt
breq over
ldi temp, 0b00001010
out timsk, temp
reti
over:
rcall conver ;conver:計(jì)算結(jié)果子程序
rcall htd3 ;htd3:
rcall sys
reti
reset:
ldi temp, low(ramend)
out spl, temp
ldi temp, high(ramend) ;設(shè)置堆棧
out spl+1, temp
ldi temp, $ff ;初始化數(shù)碼管狀態(tài)
out ddrb, temp ;B口:數(shù)碼管數(shù)據(jù)輸出
out ddrd, temp ;D口:pd0-pd5為數(shù)碼管片選
ldi temp, $00
out portb, temp ;共陰極,數(shù)碼管全滅
out portd, temp
ldi cnt1d, 00
ldi cnt2d, 00
ldi cnt3d, 00
sei
rcall sys
loop: ;在數(shù)碼管顯出十進(jìn)制數(shù)
mov aa, cnt1d
andi aa, $0f ;顯示個(gè)位
rcall a
cbi portd, 00
nop
sbi portd, 00
mov aa, cnt1d
andi aa, $f0 ;顯示十位
swap aa
rcall a
cbi portd, 01
nop
sbi portd, 01
mov aa, cnt2d
andi aa, $0f ;顯示百位
rcall a
cbi portd, 02
nop
sbi portd, 02
mov aa, cnt2d
andi aa, $f0 ;顯示千位
swap aa
rcall a
cbi portd, 03
nop
sbi portd, 03
mov aa, cnt3d
andi aa, $0f ;顯示萬(wàn)位
rcall a
cbi portd, 04
nop
sbi portd, 04
mov aa, cnt3d
andi aa, $f0 ;顯示十萬(wàn)位
swap aa
rcall a
cbi portd, 05
nop
sbi portd, 05
sbrc dt, 0
ret
rjmp loop
sys: ;初始化
clc
clt
ldi dt1, $81
ldi dt, 00
ldi mc16l, 00
ldi mc16h, 00
ldi cnt, 62
ldi mp8u, 30
ldi temp, 247
out tcnt0, temp
ldi temp, 00
out tccr1a,temp
out tccr0, temp
ldi temp, 0b00001010
out timsk, temp
ldi temp, 0b11000000
out tccr1b,temp
ret
htd3: ;16轉(zhuǎn)10子程序
sbr dt, 1
ldi count, 24
clr cnt1d
clr cnt2d
clr cnt3d
loopd:
rol res1
rol res2
rol res3
rol cnt1d
rol cnt2d
rol cnt3d
dec count
brne c
rjmp loop
c:
rcall adjn
rjmp loopd
a:
ldi zh, high(zk*2)
ldi zl, low(zk*2)
add zl, aa
lpm
out portb, r0
ret
adjn:
push count
mov count, cnt1d
rcall adjd1
mov cnt1d, count
mov count, cnt2d
rcall adjd1
mov cnt2d, count
mov count, cnt3d
rcall adjd1
mov cnt3d, count
pop count
ret
adjd1:
ldi temp, 3
add temp, count
sbrc temp, 3
mov count, temp
ldi temp, $30
add temp, count
sbrc temp, 7
mov count, temp
ret
conver: ;計(jì)算結(jié)果子程序
clr res3
clr res2
ldi cnt, 8
lsr mp8u
m16_1:
brcc m16_2
add res2, mc16l
adc res3, mc16h
m16_2:
ror res3
ror res2
ror res1
dec cnt
brne m16_1
ret
.equ zk=0x0200
.org zk ;字形表
.db 0x03f,0x006,0x05b,0x04f
.db 0x066,0x06d,0x07d,0x007
.db 0x07f,0x06f,0x077,0x07c
.db 0x039,0x05e,0x071
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -