TIMER/COUNTER UNIT

lib_80186 segment public ’code’ assume cs:lib_80186, ds:data

public _set_time

_set_time proc far

push

bp

;save caller’s bp

mov

bp, sp

;get current top of stack

hour

equ word ptr[bp+6]

;get parameters off stack

minute

equ word ptr[bp+8]

 

second

equ word ptr[bp+10]

 

T2Compare equ word ptr[bp+12]

 

push

ax

;save registers used

push

dx

 

push

si

 

push

ds

 

xor

ax, ax

;set interrupt vector

mov

ds, ax

 

mov

si, 4*timer_2_int

 

mov

word ptr ds:[si], offset

timer_2_interrupt_routine

 

inc

si

 

inc

si

 

mov

ds:[si], cs

 

pop

ds

 

mov

ax, hour

;set time

mov

_hour, al

 

mov

ax, minute

 

mov

_minute, al

 

mov

ax, second

 

mov

_second, al

 

mov

_msec, 0

 

mov

dx, T2CNT

;clear Count register

xor

ax, ax

 

out

dx, al

 

mov

dx, T2CMPA

;set maximum count value

mov

ax, T2Compare

;see note in header above

out

dx, al

 

mov

dx, T2CON

;set up the control word:

mov

ax, 0E001H

;enable counting,

out

dx, al

;generate interrupt on MC,

 

 

;continuous counting

mov

dx, TCUCON

;set up interrupt controller

xor

ax, ax

;unmask highest priority interrupt

out

dx, al

 

Example 9-1. Configuring a Real-Time Clock (Continued)

9-19

Page 248
Image 248
Intel 80C188XL, 80C186XL user manual Out Dx, al