⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 测频.asm

📁 单片机开发资料光盘-双龙-686M.zip
💻 ASM
字号:
; 测频率,信号从AT90S8515的ICP引脚输入,最大值为为999999Hz/μS

.include"8515def.inc"
	rjmp   reset
.def    temp   = r16                 ;暂存器

.def    cnt1d  = r17
.def    cnt2d  = r18                 ;cnt1、dcnt2d和cnt3d存放结果的十进制
.def    cnt3d  = r19     

.def    count  = r20

.def    cnt    = r21

.def    res1   = r22
.def    res2   = r23                 ;res1、res2和res3存放结果的十六进制   
.def    res3   = r24

.def    dt     = r25
.def    ovfl   = r26
.def    aa     = r27
.org    0x003                        ;icp触发中断向量
	rjmp   captr

.org    0x007                        ;timer0触发中断向量
	rjmp   interru
captr:                               ;icp触发中断子程序
	brts  b
	inc   res1
	ldi   temp,  0b00000101
	out   tccr0, temp            ;开timer0
	ldi   temp,  0b00001010
	out   timsk, temp            ;致timer0中断和捕捉中断
	ldi   temp,  0b11000000
	out   tccr1b,temp
	set
	reti
b:
	set
	inc   res1                   ;开始计数
	brne  c
	inc   res2
	brne  c
	inc   res3
	cpse  res3,  ovfl            ;溢出处理
	rjmp  c
	rjmp  over1	
c:
	ldi   temp,  0b00001010
	out   timsk, temp
	ldi   temp,  0b11000000
	out   tccr1b,temp
	reti

interru:                                ;timer0溢出中断子程序
	dec   cnt
	breq  over
	ldi   temp,   0b00001010
	out   timsk,  temp
	reti
over:
	rcall htd3
over1:	
	rcall sys
	reti
reset:
	ldi   temp,  low(ramend)
	out   spl,   temp
	ldi   temp,  high(ramend)      ;设置堆栈
	out   spl+1, temp
	ldi   temp,  $ff               ;初始化数码管状态
	out   ddrb,  temp              ;B口:数码管数据输出
	out   ddrd,  temp              ;D口:pd0-pd5为数码管片选  
	ldi   temp,  $00
	out   portb, temp              ;共阴极,数码管全灭
	out   portd, temp
	ldi   cnt1d, 00
	ldi   cnt2d, 00
	ldi   cnt3d, 00
	sei
	rcall sys
loop:	                               ;在数码管显出十进制数
	mov   aa,   cnt1d
	andi  aa,   $0f                ;显示个位
	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                 ;显示万位
	rcall a
	cbi   portd, 04
	nop
	sbi   portd, 04
	mov   aa,  cnt3d
	andi  aa,  $f0                 ;显示十万位
	swap  aa
	rcall a
	cbi   portd, 05
	nop
	sbi   portd, 05
	sbrc  dt,    0
	ret
	rjmp  loop
sys:                                    ;初始化
	clc
	clt
	ldi   dt,    00
	ldi   ovfl,  $0f
	ldi   cnt,   31
	ldi   temp,  123
	out   tcnt0, temp
	ldi   temp,  0b00001000
	out   timsk, temp
	ldi   temp,  0b11000000
	out   tccr1b,temp
	ret

htd3:                                   ;16转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  d	
	rjmp  loop
d:
	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
.equ   zk=0x0200
.org   zk                             ;字形表
.db    0x03f,0x006,0x05b,0x04f
.db    0x066,0x06d,0x07d,0x007
.db    0x07f,0x06f,0x077,0x07c
.db    0x039,0x05e,0x071,0x0ff                        

				

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -