定时器的汇编程序

定时器的汇编程序
定时器的汇编程序

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

相关主题
相关文档
最新文档