定时器的汇编程序
stm8/
;/******************** stm8单片机实验******************** ;文件名: 10S定时器
;作者: liuhanrui
;日期: 2011.5.13
;描述: 完成一个10S 计时器的设计,数码显示1~10
;*********************************************************
;***************************接线************************** ;硬件:1、STM8s-discovery 2、C51RC-F底板3、杜邦线
;连接图: CN3->P1(段)
; PB0(pin10)->LED(P10)
; PB1(pin9)->LED(P11).a
; PB2(pin8)->LED(P12).b
; PB3(pin7)->LED(P13).c
; PB4(pin6)->LED(P14).d
; PB5(pin5)->LED(P15).e
; PB6(pin4)->LED(P16).f
; PB7(pin3)->LED(P17).dp
; CN3->P2(位),用了LED1,LED2两位数码管
; PE6(pin12)->R1(p24)
; PE7(pin11)->R2(p25)
;**********************************************************
#include "mapping.inc"
#include "STM8S105C_S.inc"
segment 'ram0'
counter ds.b ;用于确定1S定时
bit ds.b ;作为1S定时时间标志位
segment 'rom'
main.l
; initialize SP
ldw X,#stack_end
ldw SP,X
#ifdef RAM0
; clear RAM0
ram0_start.b EQU $ram0_segment_start
ram0_end.b EQU $ram0_segment_end
ldw X,#ram0_start
clear_ram0.l
clr (X)
incw X
cpw X,#ram0_end
jrule clear_ram0
#endif
#ifdef RAM1
; clear RAM1
ram1_start.w EQU $ram1_segment_start ram1_end.w EQU $ram1_segment_end ldw X,#ram1_start
clear_ram1.l
clr (X)
incw X
cpw X,#ram1_end
jrule clear_ram1
#endif
; clear stack
stack_start.w EQU $stack_segment_start stack_end.w EQU $stack_segment_end ldw X,#stack_start
clear_stack.l
clr (X)
incw X
cpw X,#stack_end
jrule clear_stack
intel
;初始化PB,推挽输出,用于数码管段驱动;mov PB_DDR,#0ffh
mov PB_CR1,#0ffh
mov PB_CR2,#0
;初始化PE,推挽输出,用于数码管位驱动;mov PE_DDR,#0ffh
mov PE_CR1,#0ffh
mov PE_CR2,#0
mov PE_ODR,#0ffh
;初始化PD,推挽输出,用于蜂鸣器驱动;mov PD_DDR,#0ffh
mov PD_CR1,#0ffh
mov PD_CR2,#0
mov PD_ODR,#0ffh
;初始化定时器timer2
mov TIM2_EGR,#1; 允许产生更新事件
mov TIM2_PSCR,#2 ; 计数器时钟=主时钟/128=2MHZ/2,相当于计数器周期为uS mov TIM2_ARRH,#13h ;设定重装载时的寄存器值的高8位
mov TIM2_ARRL,#88h ; 设定重装载时的寄存器值的低8位
mov TIM2_CNTRH,#13h ; 设定计数器的初值的高8位
mov TIM2_CNTRL,#88h ; 设定计数器的初值的低8位
mov TIM2_CR1,#01 ; 设置控制器,启动定时器,b0 = 1,允许计数器工作,b1 = 0,允许更新
mov TIM2_IER,#01 ; 允许更新中断
Rim ; 允许CPU全局中断
clrw x ;清X
clr a ;清a
mov PB_ODR,#0
loop:
bres PE_ODR,#6 ;开启个位
ld a,(LED_TAB,x) ;查找字模
ld PB_ODR,a; 显示个位
cpw x,#10 ;是否计数到10
jrne next;还不到,跳转
loop2:;时间到10S,
bres PE_ODR,#6;打开个位
bset PE_ODR,#7;关闭十位
ldw x,#0; 个位显示"0"
ld a,(LED_TAB,x)
ld PB_ODR,a
ldw x,#1;十位显示"1"
ld a,(LED_TAB,x)
ld PB_ODR,a
bres PE_ODR,#7;打开十位
bset PE_ODR,#6;关闭个位
bres PD_ODR,#0;蜂鸣响
jp loop2 ;重复
next:
btjf bit,#0,loop1;判断是否1S定时到,没有到跳出
bres bit,#0;1S定时到,清标志位
incw x;x加1
loop1:
jra loop;重复
TIMER2_ISR.L: ;定时器2中断入口
mov TIM2_SR1,#0; 清除更新标志
inc counter;1S累积计数器加1
ld a,counter;
cp a,#100;判断是否到达1S
jrne reture;没有到达返回
mov counter,#0;到达1S,清累积计数器
bset bit,#0;设置标志位,用于主程序判断
reture:;返回
iret
LED_TAB: ;八段共阳数码管字模
; 0 1 2 3 4 5 6 7 8 9
dc.b 0c0h,0f9h,0a4h,0b0h,99h,92h,83h,0f8h,80h,98h
interrupt NonHandledInterrupt
NonHandledInterrupt.l
iret
motorola
segment 'vectit'
dc.l {$82000000+main} ; reset
dc.l {$82000000+NonHandledInterrupt} ; trap
dc.l {$82000000+NonHandledInterrupt} ; irq0
dc.l {$82000000+NonHandledInterrupt} ; irq1
dc.l {$82000000+NonHandledInterrupt} ; irq2
dc.l {$82000000+NonHandledInterrupt} ; irq3
dc.l {$82000000+NonHandledInterrupt} ; irq4
dc.l {$82000000+NonHandledInterrupt} ; irq5
dc.l {$82000000+NonHandledInterrupt} ; irq6
dc.l {$82000000+NonHandledInterrupt} ; irq7
dc.l {$82000000+NonHandledInterrupt} ; irq8
dc.l {$82000000+NonHandledInterrupt} ; irq9
dc.l {$82000000+NonHandledInterrupt} ; irq10
dc.l {$82000000+NonHandledInterrupt} ; irq11
dc.l {$82000000+NonHandledInterrupt} ; irq12
dc.l {$82000000+TIMER2_ISR} ; irq13; 对应的是定时器2的中断入口
dc.l {$82000000+NonHandledInterrupt} ; irq14
dc.l {$82000000+NonHandledInterrupt} ; irq15
dc.l {$82000000+NonHandledInterrupt} ; irq16
dc.l {$82000000+NonHandledInterrupt} ; irq17
dc.l {$82000000+NonHandledInterrupt} ; irq18
dc.l {$82000000+NonHandledInterrupt} ; irq19
dc.l {$82000000+NonHandledInterrupt} ; irq20
dc.l {$82000000+NonHandledInterrupt} ; irq21
dc.l {$82000000+NonHandledInterrupt} ; irq22
dc.l {$82000000+NonHandledInterrupt} ; irq23 ; 对应的是定时器4的中断入口dc.l {$82000000+NonHandledInterrupt} ; irq24
dc.l {$82000000+NonHandledInterrupt} ; irq25
dc.l {$82000000+NonHandledInterrupt} ; irq26
dc.l {$82000000+NonHandledInterrupt} ; irq27
dc.l {$82000000+NonHandledInterrupt} ; irq28
dc.l {$82000000+NonHandledInterrupt} ; irq29