Anda di halaman 1dari 27

AN529

Multiplexing LED Drive and a 4x4 Keypad Sampling


Author:

drive of the LEDs is possible, because of the high sink


and source capabilities of PIC16C5X microcontroller,
thus eliminating the use of an external drive transistor,
and results in a reduction in both cost and complexity of
the overall circuit.

Stan DSouza
Microchip Technology Inc.

INTRODUCTION
Many applications require driving LEDs along with an
interface to a keypad. Implementing such designs
usually involves using up significant amounts of the
processors I/O lines. This application note describes a
method which uses only 16 I/O pins of a PIC16C5X
microcontroller to sample a 4x4 keypad matrix, and
directly drive four 7-segment LEDs (Figure 1). Direct

FIGURE 1:

Typically applications having LEDs and keypads also


keep track of real-time, in order to synchronize certain
related events. An Industrial Clock/Timer example has
been used in this application note as a demonstration
of these functions. The software overhead to keep track
of real time is minimal and the user can modify the code
to significantly expand the functionality of this circuit.

PIC16C5X INTERFACE TO A SEGMENT DISPLAY AND 4x4 KEYPAD


DISPLAY MODULE
ALARM

AM

PM

6
7
8
9

PIC16C5X
RB0
RA0
RB1
RA1
RB2
RA2
RB3
RA3
RB4
RB5
RB6
RB7

10
11
12
13
14
15
16
17

RC0
RC1
RC2
RC3
RC4
RC5
RC6
RC7

18
19
20
21
22
23
24
25

4 x 220

4 x 10k
4 x 220

Vcc

4 x 100k

1997 Microchip Technology Inc.

Keypad

DS00529E-page 1

AN529
PART A: 4x4 KEY MATRIX SAMPLING

c)

Before a new column is brought low, care should


be taken to discharge the input pins (see code
section for details).
A 50 ms key debounce technique has been
implemented in the software, in order to
eliminate multiple key strokes.

Implementation
d)

The 4x4 Key Matrix is connected to PORTC of the


PIC16C5X (Figure 2). The four columns are connected
to RC0-RC3 and the four rows are connected to RC4RC7. Each digit is refreshed every 20 ms. with a 5 ms
pulse. The keypad is sampled every 20 ms with four
3 s pulses (Figure 4).

Note 1: Resistors R8-R11 and R12-R14 have been


selected such that their ratio is 1:10. This
will insure a 0.5V level at the input, when a
key is pressed. Also R8-R14 should have a
value such that their current contribution to
the LEDs segments is negligible.

The keypad sampling is as follows:


a)
b)

The columns are connected to output pins, and


the rows are connected to input pins.
Each column is sequentially driven to a low
voltage while at the same instance the four rows
are sampled. Since the rows are all held high
with pull-up resistors, all four inputs will normally
be high. If a key is pressed in a column which is
at a low level, that low level will be conducted to
the input pin through the closed key and the
corresponding row will be sensed as a low.

FIGURE 2:

Note 2: In circuits where there is substantial


interference between the key matrix and the
LED drive circuit, the alternative circuit of
Figure 3 should be utilized. Diodes in the
path of all pins connected to the keypad
insure that there is minimal interference
from the keypad, when it is not being
sampled.

PIC16C5X INDUSTRIAL CLOCK/TIMER SCHEMA TIC

1 2 3
ALARM

4 5

6 7

10 11 12
AM

LTC3710G*
PM
24 23 22 21 20 19 18 17 16 15 14 13

VCC

PIC16C57

LS1
6
7
8
9

Beeper
Vcc

28
1
20 pF

C1
C2

27
Y1
26

20 pF 4.096 MHz

RA0
RA1
RA2
RA3
MCLR
T0CKI
OSC1
OSC2

RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7
RC0
RC1
RC2
RC3
RC4
RC5
RC6
RC7

10
11
12
13
14
15
16
17

R4

18
19
20
21
22
23
24
25

R3
R2
R1
R0

R5

R12

R13

R14

10k

10k

10k

4 x 220
VCC

R8
R9
R10
R11
4 x 100k

R7 4 x 220

R6

R15
2

10k

4 x 4 Hex
Keypad

* Each LED segment should draw no more than 7mA.

DS00529E-page 2

1997 Microchip Technology Inc.

AN529
PART B: INDUSTRIAL CLOC K/TIMER

instructions can be executed. This gives sufficient time


to execute a large section of code and not miss the
overflow in TMR0.

Clo ck Selection

Using a 3.579545 MHz colorb urst c rystal oscillator


as a time-base

The 4.096 MHz crystal oscillator is the time-base. The


PIC16C5X internally divides the clock by 4 to give an
internal clock of 1.024 MHz. This clock is further divided
by 32 (by the prescaler in the OPTION register) to give
a clock of 32 kHz which is used to increment the TMR0
in the PIC16C5X. If the TMR0 is initialized to 96, it
would overflow to zero in 5 ms.

Some users may want to use a color burst crystal


oscillator as a time-base, because of its low cost. If a
3.579545 MHz crystal is used, then the internal clock
will be 1.117 s. If this is prescaled by 32, TMR0 will be
incremented every 35.758 s. Initializing the TMR0 with
116 will cause it to overflow to 0 in 5.006 ms. giving an
error of 0.12%. This error can be corrected in software
by making time adjustments every minute and/or every
hour.

(256-96) x (1/32000) = 5.000 ms


This 5 ms is used to count the seconds, minutes and
hours in the clock/timer. It is also used as a time-base
to update the display digits and sample the keyboard.
The clock speed being 4.096 MHz, each instruction will
execute in 1 s. Therefore in 5 ms, approximately 5000

FIGURE 3:

PIC16C5X ALARM CLOCK SCHEMA TIC (USING DIODES)

4 5

1 2 3
ALARM

6 7

10 11 12
AM

LTC3710G*
PM
24 23 22 21 20 19 18 17 16 15 14 13

VCC

PIC16C57

LS1

Beeper
Vcc

6
7
8
9
28
1

20 pF

C1
C2

27
Y1
26

20 pF 4.096 MHz

RA0
RA1
RA2
RA3
MCLR
T0CKI
OSC1
OSC2

RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7
RC0
RC1
RC2
RC3
RC4
RC5
RC6
RC7

10
11
12
13
14
15
16
17

R12

R1

R2

18
19
20
21
22
23
24
25
VCC

R4

R3

R5

R6

D9 1N914

1N914
R8

R10
R11

D8 1N914
4

D7 1N914
3

D6 1N914
2

10k

D1
1N914

R9

R7 8 x 220

D2
1N914 6
D3
1N914 5
D4

4 x 100k

4 x 4 Hex
Keypad

* Each LED segment should draw no more than 7 mA.

1997 Microchip Technology Inc.

DS00529E-page 3

AN529
FIGURE 4:

KEY SCAN AND LED DIGIT SELEC


T TIMING
Keyscan
col. 1
Keyscan
col. 2
Keyscan
col. 3
Keyscan
col. 4

3 s
40 s (housekeeping delay)

3 s
40 s (housekeeping delay)

5 ms

Digit 1

20 ms

Digit 2
Digit 3
Digit 4

FEATURES
The Flowchart (Figure 5) shows the sequence of
events in the clock/timer software. The clock has the following features:

12 hour clock with a.m./p.m.


12 hour alarm with a.m./p.m.
Full function Hex keypad (Figure 5).
AA audible alarm for 1 minute.
10 minute alarm disable.

SETTING CLOCK/TIMER FUNCTIONS


Function

Key Sequence to Activ ate Function

Set Real Time

Set Hours (tens) Hours Minutes (tens) Minutes AM/PM Set

View Alarm Time

Alarm (alarm time is displayed for 5 seconds)

Set Alarm Time

Alarm Set (must be pressed when alarm LED is flashing) Hours (tens) Hours
Minutes (tens) Minutes AM/PM Set

Enable/Disable Alarm

Alarm Alarm (toggles alarm status)

Disable AA Alarm

Disable Alarm (disable audible beep for 10 minutes)

Clear Alarm

Clear Alarm (clears audible alarm)

Abort Entry

Clear Entry (aborts data entry mode when setting real alarm time)

Note 1: Valid key strokes will be acknowledged with a beep.


Note 2: Hours and minutes used above correspond to digits 0 - 9 on the keyboard.

DS00529E-page 4

1997 Microchip Technology Inc.

AN529
FIGURE 5:

TIMER/CLOCK FL OWCHAR T
Start
Start

Initialize
Initialize RAM
RAM

Test
Test LEDs
LEDs for
for 22 secs
secs

Update
Update next
next digit
digit

Yes

All
All digits
digits updated?
updated?

Scan
Scan key
key matrix
matrix

Key
Key pressed?
pressed?

No

No

Yes
Service
Service key
key
Yes

AA
AA alarm
alarm on?
on?

Service
Service AA
AA alarm
alarm

No
No

55 ms
msTimer
Timer == 0?
0?
Yes
Update
Update all
all relevant
relevant timers
timers

FIGURE 6:

KEYPAD

DISABLE
ALARM

AM/PM

CLEAR
ALARM

ALARM
TIME

1997 Microchip Technology Inc.

CLEAR
ENTRY

SET

DS00529E-page 5

AN529
FIGURE 7:

INTERFACE TO PIC16C54/56
LEDMOD
9 ALARM
10
11
12
1

NPN
4.7k
NPN

17
18
1
2

4.7k
4
NPN
4.7k

PIC16C54/56
RB0
RB1
RB2
RB3
RB4
RB5
MCLR
RB6
RB7

RA0
RA1
RA2
RA3

PM
8

4 x 220
6
7
8
9
10
11
12
13
4 x 220

16

OSC1

15

OSC2

NPN
4.7k

AM

T0CKI 3
10k

10k

4
VCC

10k

10k

4 x 100k

CODE SIZ E

SUMMARY

Key scan 97 bytes

This Application Note demonstrates a simple method of


interfacing a PIC16C5X device to both 7-segment
LEDs and a keypad. The key features of the PIC16C5X
which made this possible are:

Display update 113 bytes

High sink/source of the I/O ports.


Fast instruction cycle for quick key-scan.
RISC processor allowing minimal overhead for
real-time clock maintenance.
Reconfigurable I/O ports, enabling dual
functionality of ports.
Figure 7 depicts a block diagram connecting a
PIC16C54/56 to a 4-digit, 7-segment LED display and
a 4x4 hex keypad. Since only 12 I/O pins are available
in the PIC16C54/56, an external npn transistor will have
to be utilized to sink the current from each digit.

DS00529E-page 6

1997 Microchip Technology Inc.

AN529
Please check the Microchip BBS for the latest version of the source code. Microchips Worldwide Web Address:
www.microchip.com; Bulletin Board Support: MCHIPBBS using CompuServe (CompuServe membership not
required).

APPENDIX A: CODE LISTING


MPASM 01.40 Released

LOC OBJECT CODE


VALUE

000007FF

00000060

00000000
00000000
00000000
00000001
00000001
00000002
00000002
00000003
00000004
00000004
00000005
00000005
00000005
00000006
00000000
00000006
00000006
00000007
00000003
00000002
00000007
00000000
00000001
00000002
00000003
00000005

00000001
00000002
00000003
00000004

CLK.ASM

1-16-1997

13:07:37

PAGE

LINE SOURCE TEXT

00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054

1997 Microchip Technology Inc.

TITLE
LIST P = 16C57
ERRORLEVEL -306

Alarm Clock

;
;Define Equates:
;
PIC57
EQU
7FFH
;*****************************************************************
;
;External Ossc. used = 4.096Mhz. Prescaler of 32 used, which gives a
;31.25 microSec increment of the TMR0.If TMR0 is intially loaded with
;96, it would overflow to 0 in 5.000 milliSecs. Giving a 0.00% error.
;
MSEC5
EQU
D96
;
;
;
Program:
CLK.ASM
;
Revision Date:
;
1-13-97
Compatibility with MPASMWIN 1.40
;
;****************************************************************
;
C
EQU
0
BEP
EQU
0
RTATS
EQU
0
DC
EQU
1
HR10
EQU
1
Z
EQU
2
HR
EQU
2
MIN10
EQU
3
MIN
EQU
4
FLASH
EQU
4
PA0
EQU
5
KEY_BEEP EQU
5
AMPM
EQU
5
PA1
EQU
6
F0
EQU
0
KEY_HIT
EQU
6
ALED
EQU
6
AM_PM
EQU
7
COLON
EQU
3
ALRMLED
EQU
2
SERVICED EQU
7
ALONOF
EQU
0
INAL
EQU
1
SILNC
EQU
2
INAA
EQU
3
INKEYBEP EQU
5
;
;DEFINE RAM LOCATIONS:
TMR0
EQU
1
PC
EQU
2
STATUS
EQU
3
FSR
EQU
4

DS00529E-page 7

AN529
00000005
00000006
00000007
00000001

00000008
00000009

0000000A
0000000B

0000000C
0000000D

0000000E
0000000F

00000010

00000011
00000012
00000013
00000014
00000015
00000016
00000017

00000018

DS00529E-page 8

00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120

PORT_A
EQU
5
PORT_B
EQU
6
PORT_C
EQU
7
;
F
EQU
1
;
;DEFINE REAL TIME MODE REGS (RTM)
MSTMR
EQU
8
;MILLI SEC. TIMER
STMR
EQU
9
;SEC. TIMER
;
;*****************************************************
;DO NOT CHANGE RELATIVE POSITION OF NEXT 6 BYTES
MTMR
EQU
0A
;MIN. TIMER
HTMR
EQU
0B
;HOUR TIMER
;
;DEFINE ALARM TIME MODE REGS (ATM)
MALARM
EQU
0C
;MIN. ALARM
HALARM
EQU
0D
;HOUR ALARM
;
;DEFINE DATA ENTRY MODE REGS (DEM)
MENTRY
EQU
0E
;MIN. ENTRY
HENTRY
EQU
0F
;HOUR ENTRY
;*****************************************************
PAGE
;
;DEFINE FLAG REG AND FUNCTION:
FLAG
EQU
10
;
;
BIT # 7|6|5|4|3|2|1|0|
;--------------|-|-|-|-|-|-|-|
;
X|X|X|X|X|X|0|0| --> REAL TIME MODE (RTM)
;
X|X|X|X|X|X|0|1| --> ALARM TIME MODE(ATM)
;
X|X|X|X|X|X|1|0| --> DATA ENTRY M0DE(DEM)
;
X|X|X|X|X|X|1|1| --> TEST MODE (TM)
;
X|X|X|X|X|Y|X|X| --> ALRMLED ON/OFF
;
X|X|X|X|Y|X|X|X| --> COLON LED ON/OFF
;
X|X|X|Y|X|X|X|X| --> FLASH DISPLAY
;
X|X|Y|X|X|X|X|X| --> KEY_BEEP
;
X|Y|X|X|X|X|X|X| --> KEY_HIT (0/1)
;
Y|X|X|X|X|X|X|X| --> SERVICED
; X = DEFINED ELSEWHERE IN TABLE
; Y = DEFINED AS SHOWN (0/1)
;
TEMP
EQU
11
DIGIT
EQU
12
NEW_KEY
EQU
13
KEY_NIBL EQU
14
DEBOUNCE EQU
15
MIN_SEC
EQU
16
;MIN/SECONDS TIMER
ENTFLG
EQU
17
;
;flag dedicated to the key entry mode
;
BIT # 7|6|5|4|3|2|1|0|
;--------------|-|-|-|-|-|-|-|
;
X|X|X|X|X|X|X|Y| --> REAL/ALARM TIME STATUS
;
X|X|X|X|X|X|Y|X| --> HR10 DONE
;
X|X|X|X|X|Y|X|X| --> HR DONE
;
X|X|X|X|Y|X|X|X| --> MIN10 DONE
;
X|X|X|Y|X|X|X|X| --> MIN DONE
;
X|X|Y|X|X|X|X|X| --> INKEYBEP
;
X|Y|X|Y|X|X|X|X| --> NOT USED
;
Y|X|X|X|X|X|X|X| --> NOT USED
;
;
ALFLAG
EQU
18
;

1997 Microchip Technology Inc.

AN529

00000019

0000001A

0000
0000
0000 0AFC

0001
0001 0C02
0002 0036

0003
0003
0004
0005
0006
0007
0008
0009
000A
000B
000B

0216
0643
0A0B
0925
05A3
0900
04A3
0A03
0410

00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186

1997 Microchip Technology Inc.

;flag dedicated to the alarm


;
BIT # 7|6|5|4|3|2|1|0|
;--------------|-|-|-|-|-|-|-|
;
X|X|X|X|X|X|X|Y| --> ALONOF
;
X|X|X|X|X|X|Y|X| --> INAL
;
X|X|X|X|X|Y|X|X| --> SILNC
;
X|X|X|X|Y|X|X|X| --> INAA
;
X|X|X|Y|X|X|X|X| --> NOT USED
;
X|X|Y|X|X|X|X|X| --> NOT USED
;
X|Y|X|Y|X|X|X|X| --> NOT USED
;
Y|X|X|X|X|X|X|X| --> NOT USED
;
AAFLAG
EQU
19
;
;flag dedicated to the AA alarm
AATMR
EQU
1A
;
;Port pin definitions:
;
;PORT_A:
;
BIT 0
--> BEEPER (ACTIVE LOW) OUTPUT
;
BIT 1-3 --> unused I/O
;
;PORT_B: ALL OUTPUTS
;
BIT 0&4 --> MSB DIGIT COMMON CATHODE & ALARM
;
BIT 1&5 --> 2ND DIGIT COMMOM CATHODE & COLON
;
BIT 2&6 --> 3RD DIGIT COMMON CATHODE & PM
;
BIT 3&7 --> LSB DIGIT COMMON CATHODE & AM
;
;PORT_C:
;IN DISPLAY MODE ALL SEG/ANNN SET AS OUTPUTS
;IN KEY SCAN MODE COLS ARE OUTPUTS ROWS ARE INPUTS
;
BIT 0
--> SEGMENT A & COL 4
;
BIT 1
--> SEGMENT B & COL 3
;
BIT 2
--> SEGMENT C & COL 2
;
BIT 3
--> SEGMENT D & COL 1
;
BIT 4
--> SEGMENT E & ROW 4
;
BIT 5
--> SEGMENT F & ROW 3
;
BIT 6
--> SEGMENT G & ROW 2
;
BIT 7
--> CA OF ALL ANNUNCIATORS & ROW 1
;
;
PAGE
;
ORG
0
START
GOTO
INIT_CLK
;INITIALIZE CLOCK
;THIS ROUTINE RUNS A TEST ON THE LEDS.
;ALL THE RELEVENT LEDS ARE LIT UP FOR 2 SECS.
;
TEST_HARDWARE
MOVLW
d02
;DISPLAY FOR 2 SECS
MOVWF
MIN_SEC
;
/
;
;
TEST_LOOP
MOVF
MIN_SEC,W
;GET MIN/SEC
BTFSC
STATUS,Z
;NOT 0 THEN SKIP
GOTO
NORM_TIME
;ELSE NORMAL TIME
CALL
UPDATE_DISPLAY ;UPDATE DISPLAY
BSF
STATUS,PA0
;GOTO PAGE 1
CALL
UPDATE_TIMERS
;WAIT AND UPDATE
BCF
STATUS,PA0
;RESET PAGE MARKER
GOTO
TEST_LOOP
;LOOP BACK
NORM_TIME
BCF
FLAG,0
;PUT IN REAL TIME

DS00529E-page 9

AN529
000C
000D
000D
000E
000F
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
001A
001B
001C
001C
001D
001E
001F
0020
0021
0022
0023
0024

0430
0925
05C3
0900
05A3
0900
04C3
0900
04A3
04C3
0210
0E03
0F01
0643
091C
0A0D

0216
0E0F
0743
0800
0410
0450
0618
0550
0800

0025
0025
0026
0027
0028
0029
002A
002B

0C00
0027
0C3F
0186
0643
0A6F

002B
002C
002D
002E
002F
0030
0031
0032
0033
0034
0035
0036

0246
0643
0CC0
0031
0271
0503
0371
0703
0371
0371
0211
0026

0037
0038
0039
003A
003B
003C
003D
003E
003F
0040
0041
0042

0C0A
0024
0210
0E03
0031
0F03
0643
0A4B
0403
0371
0211
01E4

DS00529E-page 10

00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252

BCF
FLAG,1
TIME_LOOP
CALL
UPDATE_DISPLAY
BSF
STATUS,PA1
;GOTO PAGE 2
CALL
SERVICE_KEYS
BSF
STATUS,PA0
;GOTO PAGE 3
CALL
SOUND_AA
;CHECK ALARM
BCF
STATUS,PA1
;GOTO PAGE 1
CALL
UPDATE_TIMERS
;WAIT AND UPDATE TIMERS
BCF
STATUS,PA0
;RESET PAGE MARKER
BCF
STATUS,PA1
;
/
MOVF
FLAG,W
;SEE IF IN ATM
ANDLW
B00000011
;
/
XORLW
B00000001
;
/
BTFSC
STATUS,Z
;SKIP IF NOT
CALL
RESET_ATM
GOTO
TIME_LOOP
;
RESET_ATM
MOVF
MIN_SEC,W
;GET MIN/SEC
ANDLW
B00001111
;
/
BTFSS
STATUS,Z
;Z THEN SKIP
RETLW
0
;ELSE RETURN
BCF
FLAG,0
;SET TO RTM
BCF
FLAG,ALRMLED
;CLEAR LED
BTFSC
ALFLAG,ALONOF
;TEST STAT
BSF
FLAG,ALRMLED
;SET LED
RETLW
0
;RETURN
PAGE
;
;
UPDATE_DISPLAY
MOVLW
B00000000
;CLEAR SEG DRIVE
MOVWF
PORT_C
;
/
MOVLW
B00111111
;SEE IF LAST DIGIT
XORWF
PORT_B,0
;
/
BTFSC
STATUS,Z
;NO THEN SKIP
GOTO
SCAN_KP
;ELSE SCAN KEYPAD
UP_DSP_1
;SELECT DIGIT TO BE DISPLAYED
COMF
PORT_B,0
;GET COMPL. PORT B IN W
BTFSC
STATUS,Z
;NO DIGIT SELECTED?
MOVLW
B11000000
;THEN SELECT DEFAULT
MOVWF
TEMP
;SAVE IN TEMP
COMF
TEMP, F
;COMPLEMENT VALUE
BSF
STATUS,C
;SET CARRY
RLF
TEMP, F
;SHIFT LEFT
BTFSS
STATUS,C
;IF C=1 THEN SKIP
RLF
TEMP, F
;ELSE 3 TIMES...
RLF
TEMP, F
;THRU CARRY
MOVF
TEMP,0
;GET IN W
MOVWF
PORT_B
;OUTPUT TO PORT
;NOW THAT DIGIT IS SELECTED, SELECT SEG VALUES FOR THAT DIGIT
;FIRST FIND MODE OF OPERATION.
MOVLW
MTMR
;LOAD FSR WITH MTMR
MOVWF
FSR
;
/
MOVF
FLAG,0
;GET FLAG IN W
ANDLW
B00000011
;MASK OTHER BITS
MOVWF
TEMP
;SAVE IN TEMP
XORLW
B00000011
;IN TEST MODE
BTFSC
STATUS,Z
;NO THEN SKIP
GOTO
DO_TM
;ELSE TEST MODE
BCF
STATUS,C
;CLEAR CARRY
RLF
TEMP, F
;LEFT SHIFT TEMP
MOVF
TEMP,0
;GET IN W
ADDWF
FSR, F
;CHANGE INDIRECT POINTER

1997 Microchip Technology Inc.

AN529
0043
0044
0045
0046
0047
0048
0049
004A

0954
0032
09D1
0690
094E
0212
0027
0800

004B
004B 0CFF
004C 0027
004D 0800
004E
004E
004F
0050
0051
0051
0052
0053

0054
0054
0055
0056
0057
0058
0059
005A
005B
005C
005D
005E
005F
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
006A
006B
006C
006D
006E

006F

0770
0A51
0800
0C00
0032
0800

0246
0EF0
0643
02A4
0200
0031
0246
0EF0
0643
04F1
0246
0ECC
0643
03B1
0C0F
0151
01E2
083F
0806
085B
084F
0866
086D
087D
0807
087F
0867

00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318

1997 Microchip Technology Inc.

CALL
MOVWF
CALL
BTFSC
CALL
MOVF
MOVWF
RETLW

GET_7_SEG
DIGIT
MASK_ANNC
FLAG,FLASH
CHK_HALF_SEC
DIGIT,0
PORT_C
0

;GET 7 SEG DATA IN W


;SAVE IN DIGIT LOC.
;MASK ANNC TO DIGIT
;NO FLASH THEN SKIP
;ELSE CHK. IF ON
;GET BACK DIGIT
;OUTPUT TO PORT
;RETURN

MOVLW
MOVWF
RETLW

B11111111
PORT_C
0

;LIGHT ALL SEGMENTS


;
/
;RETURN FROM UPDATE DISPLAY

;
DO_TM

;
CHK_HALF_SEC
BTFSS
FLAG,COLON
;IF COLON ON THEN DO
GOTO
BLANK_DSP
;ELSE BLANK DISPLAY
RETLW
0
BLANK_DSP
MOVLW
B00000000
;MAKE PORT C LOW
MOVWF
DIGIT
RETLW
0
;
PAGE
;
;ON ENTRY FSR POINTS TO THE REAL TIME MODES MINUTES REGISTER.
;ON RETURN FSR POINTS TO THE TIMER REGISTER TO BE DISPLAYED.
;W REG. CONTAINS THE DECODED 7 SEG. INFO OF THE DIGIT
;TO BE DISPLAYED
;
GET_7_SEG
COMF
PORT_B,0
;COMPLEMENT B --> W
ANDLW
B11110000
;MASK LO NIBBLE
BTFSC
STATUS,Z
;NZ THEN SKIP
INCF
FSR, F
;INC POINTER
MOVF
F0,0
;MOVE INDIRECT TO W
MOVWF
TEMP
;GET INTO TEMP
COMF
PORT_B,0
;COMPL.B --> W
ANDLW
B11110000
;MASK LO NIBBLE
BTFSC
STATUS,Z
;IF D1/2 THEN
BCF
TEMP,AM_PM
;CLEAR AM/PM BIT
COMF
PORT_B,0
;GET PORT B AGAIN
ANDLW
B11001100
;SEE IF D2 OR D4
BTFSC
STATUS,Z
;YES THEN SKIP
SWAPF
TEMP, F
;SWAP TEMP
MOVLW
B00001111
;MASK HI NIBBLE
ANDWF
TEMP,0
ADDWF
PC, F
;ADD TO PC
RETLW
B00111111
;CODE FOR 0
RETLW
B00000110
;CODE FOR 1
RETLW
B01011011
;CODE FOR 2
RETLW
B01001111
;CODE FOR 3
RETLW
B01100110
;CODE FOR 4
RETLW
B01101101
;CODE FOR 5
RETLW
B01111101
;CODE FOR 6
RETLW
B00000111
;CODE FOR 7
RETLW
B01111111
;CODE FOR 8
RETLW
B01100111
;CODE FOR 9
;
;This routine scans the 4x4 hex key pad for a key hit.
;If key is pressed, KEY_HIT flag is set and the value of
;the hex key is returned in reg NEW_KEY
;If no key is detected, then a 0xff value is returned in
;register NEW_KEY and the flag KEY_HIT is reset.
;
SCAN_KP

DS00529E-page 11

AN529
006F
0070
0071
0072
0073
0074
0075
0075
0076
0077
0078
0079
007A
007B
007C
007D
007E
007F
0080
0081
0082
0083
0083
0084
0085
0086
0087
0088
0089
0089
008A
008B
008C
008D

06D0
0A2B
0CFF
0026
0CF7
0031

008D
008E
008F
0090
0091
0092
0093
0094
0095
0096
0097

0293
0743
0A89
0207
0D0F
0151
0033
0998
0033
05D0
0A89

0C00
0007
0211
0E0F
0027
0CF0
0007
0211
0027
0207
0EF0
0FF0
0743
0A8D
0503
0331
0603
0A75
0073
00F3
0067
0C00
0007
0A2B

DS00529E-page 12

00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384

BTFSC
GOTO
MOVLW
MOVWF
MOVLW
MOVWF

FLAG,KEY_HIT
UP_DSP_1
B11111111
PORT_B
B11110111
TEMP

;KEY UNDER SERVICE?


;YES SKIP ROUTINE
;SET DIGIT SINKS ...
;TO HIGH
;SET KEY COL LOW
;SAVE IN TEMP

MOVLW
TRIS
MOVF
ANDLW
MOVWF
MOVLW
TRIS
MOVF
MOVWF
MOVF
ANDLW
XORLW
BTFSS
GOTO

B00000000
PORT_C
TEMP,W
B00001111
PORT_C
B11110000
PORT_C
TEMP,W
PORT_C
PORT_C,W
B11110000
B11110000
STATUS,Z
DET_KEY

;SET PORT C AS OUTPUTS


;
/

BSF
RRF
BTFSC
GOTO
CLRF
DECF

STATUS,C
TEMP, F
STATUS,C
SKP1
NEW_KEY
NEW_KEY, F

;SET CARRY
;MAKE NEXT COL. LOW
;ALL DONE THEN SKIP

CLRF
MOVLW
TRIS
GOTO

PORT_C
B00000000
PORT_C
UP_DSP_1

;SETPORT C AS ...
;OUTPUTS
;
/
;RETURN

SKP1

;DISCHARGE PINS FOR MEMBRANE KEYPADS


;
/
;SET AS I/O
;
/
;GET OLD VALUE
;OUTPUT TO PORT
;INPUT PORT VALUE
;MASK LO BYTE
;SEE IF KEY HIT
;NO KEY THEN SKIP
;LOAD KEY VALUE

SKP3

;SET NEW_KEY = FF
;
/

SKP2

DET_KEY
;key is detected
INCF
NEW_KEY,W
;CHK IF KEY ...
BTFSS
STATUS,Z
;WAS RELEASED
GOTO
SKP2
;NO THEN RETURN
MOVF
PORT_C,W
;GET RAW KEY...
IORLW
B00001111
;VALUE.
ANDWF
TEMP,W
;
/
MOVWF
NEW_KEY
;SAVE IN NEW_KEY
CALL
GET_KEY_VAL
;GET ACTUAL KEY ...
MOVWF
NEW_KEY
;VALUE
BSF
FLAG,KEY_HIT
;SET KEY HIT FLAG
GOTO
SKP2
;RETURN
;
PAGE
;This routine decodes the hex value from the raw data got
;from scanning the rows and cols.
;
actual key value
raw hex value
;
ONE
EQU
77
;
TWO
EQU
7B
;
THREE
EQU
7D
;
C
EQU
7E
;
FOUR
EQU
0B7
;
FIVE
EQU
0BB
;
SIX
EQU
0BD
;
D
EQU
0BE
;
SEVEN
EQU
0D7
;
EIGHT
EQU
0DB
;
NINE
EQU
0DD
;
E
EQU
0DE
;
A
EQU
0E7
;
ZERO
EQU
0EB
;
B
EQU
0ED

1997 Microchip Technology Inc.

AN529

0098
0098
0099
009A
009B
009C
009C
009D
009E
009F
00A0
00A1
00A2
00A2
00A3
00A4
00A5
00A5
00A6
00A7
00A8
00A9
00AA
00AB
00AC
00AD
00AE
00AF
00AF
00B0
00B0
00B1
00B1
00B2
00B3
00B4
00B5
00B6
00B7

0E0F
0034
0C04
0031
0503
0334
0703
0AA5
02F1
0A9C
05A3
05C3
0BFF
00F1
0393
0E0F
0034
0211
01E2
0AAF
0AB8
0ABA
0ABC

0C04
0031
0503
0334
0703
0ABE
02F1
0AB1
0AA2

00B8
00B8 0C08
00B9 0AB0
00BA
00BA 0C0C
00BB 0AB0
00BC
00BC 0C10
00BD 0AB0

00BE
00BE
00BF
00C0
00C1
00C2
00C3
00C4
00C5

00F1
0211
01E2
0801
0804
0807
080A
0802

00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450

1997 Microchip Technology Inc.

;
F
;
;
GET_KEY_VAL
ANDLW
MOVWF
MOVLW
MOVWF
GKV1
BSF
RRF
BTFSS
GOTO
DECFSZ
GOTO
GO_RESET
BSF
BSF
GOTO
GET_HI_KEY
DECF
SWAPF
ANDLW
MOVWF
MOVF
ADDWF
GOTO
GOTO
GOTO
GOTO
;
GET147A
MOVLW
GETCOM
MOVWF
GETCOM1
BSF
RRF
BTFSS
GOTO
DECFSZ
GOTO
GOTO
;
GET2580
MOVLW
GOTO
;
GET369B
MOVLW
GOTO
;
GETCDEF
MOVLW
GOTO
PAGE
;
KEY_TBL
DECF
MOVF
ADDWF
RETLW
RETLW
RETLW
RETLW
RETLW

EQU

0EE

B00001111
KEY_NIBL
4
TEMP

;GET LO NIBBLE
;SAVE
;SET COUNT TO 4
;
/

STATUS,C
KEY_NIBL, F
STATUS,C
GET_HI_KEY
TEMP, F
GKV1

;SET CARRY
;ROTATE NIBBLE
;SKIP IF NOT Z
;GOTO NEXT PART
;DEC COUNT
;LOOP

STATUS,PA0
STATUS,PA1
SYS_RESET

;SET MSB
;
/
;ELSE BIG ERROR

TEMP, F
NEW_KEY,W
B00001111
KEY_NIBL
TEMP,W
PC, F
GET147A
GET2580
GET369B
GETCDEF

;REDUCE BY 1
;GET HI NIBBLE
;
/
;SAVE
;GET OFFSET TO TBL
;LOAD IN PC
;JUMP TO NEXT PART
;
/
;
/
;
/

;SET COUNT TO 4

TEMP

STATUS,C
KEY_NIBL, F
STATUS,C
KEY_TBL
TEMP, F
GETCOM1
GO_RESET

;SET CARRY
;ROTATE RIGHT
;CHECK IF DONE
;JUMP TO TABLE
;DEC COUNT
;LOOP
;ELSE ERROR

8
GETCOM

;SET COUNT TO 8

D12
GETCOM

;SET COUNT TO 12

D16
GETCOM

;SET COUNT TO 16

TEMP, F
TEMP,W
PC, F
1
4
7
0A
2

;REDUCE BY 1
;GET IN W
;JUMP TO TABLE
;KEY 1
;KEY 4
;KEY 7
;KEY A
;KEY 2

DS00529E-page 13

AN529
00C6
00C7
00C8
00C9
00CA
00CB
00CC
00CD
00CE
00CF
00D0

00D1
00D1
00D2
00D3
00D4
00D5
00D6
00D7
00D8
00D9
00DA
00DB
00DC
00DD
00DD
00DE
00DF
00E0
00E1
00E1
00E2
00E3
00E4
00E5
00E5
00E6
00E7
00E8
00E8
00E9
00EA
00EB
00EB
00EC
00ED
00EE
00EF
00F0
00F1
00F2
00F3
00F4
00F5
00F6
00F7
00F8
00F9
00FA
00FB

0805
0808
0800
0803
0806
0809
080B
080C
080D
080E
080F

0CFC
0186
0643
0AE5
0CF3
0186
0643
0AE8
0CCF
0186
0643
0AE1
02A4
07E0
05F2
0AEB
02A4
06E0
05F2
0AEB
0650
05F2
0AEB
0670
05F2
0AEB

0210
0E03
0F02
0643
0800
0CFC
0186
0743
0800
0C3F
0152
0F3F
0743
0800
0C80
0172
0800

DS00529E-page 14

00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516

RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW

5
8
0
3
6
9
0B
0C
0D
0E
0F

;KEY
;KEY
;KEY
;KEY
;KEY
;KEY
;KEY
;KEY
;KEY
;KEY
;KEY

5
8
0
3
6
9
B
C
D
E
F

B11111100
PORT_B,0
STATUS,Z
MASK_ALARM
B11110011
PORT_B,0
STATUS,Z
MASK_COLON
B11001111
PORT_B,0
STATUS,Z
MASK_PM

;CHK IF DIGIT 1
;
/
;NO THEN SKIP
;ELSE MASK ALARM
;CHK IF DIGIT 2
;
/
;NO THEN SKIP
;ELSE MASK COLON
;CHK IF DIGIT 3
;
/
;NO THEN SKIP
;ELSE MASK PM

FSR, F
F0,AM_PM
DIGIT,7
BLNK_LEAD_0

;INC FSR
;IF 0 THEN AM
;SET MSB
;NEXT

FSR, F
F0,AM_PM
DIGIT,7
BLNK_LEAD_0

;INC FSR
;IF 1 THEN PM
;SET MSB
;NEXT

FLAG,ALRMLED
DIGIT,7
BLNK_LEAD_0

;1 THEN LIGHT LED


;
/
;NEXT

FLAG,COLON
DIGIT,7
BLNK_LEAD_0

;1 THEN LIGHT LED


;
/
;NEXT

FLAG,W
B00000011
B00000010
STATUS,Z
0
B11111100
PORT_B,0
STATUS,Z
0
B00111111
DIGIT,0
B00111111
STATUS,Z
0
B10000000
DIGIT, F
0

;GET IN W
;SEE IF IN DEM
;CHECK
;NO THEN DO
;ELSE RETURN
;SEE IF DIGIT 1
;
/
;YES THEN SKIP
;RETURN
;ELSE MASK G AND ANUNC
;GET IN W
;SEE IF 0
;YES THEN SKIP
;RETURN
;ELSE BLANK D1
;
/
;RETURN

;
PAGE
;
MASK_ANNC
MOVLW
XORWF
BTFSC
GOTO
MOVLW
XORWF
BTFSC
GOTO
MOVLW
XORWF
BTFSC
GOTO
MASK_AM
INCF
BTFSS
BSF
GOTO
MASK_PM
INCF
BTFSC
BSF
GOTO
MASK_ALARM
BTFSC
BSF
GOTO
MASK_COLON
BTFSC
BSF
GOTO
;
BLNK_LEAD_0
MOVF
ANDLW
XORLW
BTFSC
RETLW
MOVLW
XORWF
BTFSS
RETLW
MOVLW
ANDWF
XORLW
BTFSS
RETLW
MOVLW
ANDWF
RETLW
;
;

1997 Microchip Technology Inc.

AN529

00FC
00FC
00FD
00FE
00FF

0C0F
0025
0C00
0005

0100
0101
0102
0103

0CFF
0026
0C00
0006

0104
0105
0106
0107

0C00
0027
0C00
0007

0108 0C04
0109 0002
010A
010B
010C
010D
010E
010F
0110
0111
0112
0113
0114
0115
0116
0117
0118

0C60
0021
0068
0069
006A
0C12
002B
002D
006C
0C03
0030
0078
0079
0077
0A01

0200
0200
0200
0201
0202
0203
0204
0205
0206
0207
0208
0208
0209
020A
020B
020C
020D
020E
020F
0210
0211
0212

0201
0743
0A00
0C60
0021
02A8
06D0
0A70
0210
0E03
0F01
0743
0A14
0550
0570
0C64
0088
0703
0450

00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582

1997 Microchip Technology Inc.

;
PAGE
;
;THIS ROUTINE SETS UP PORTS A,B,C AND THE INTERNAL
;REAL TIME CLOCK COUNTER.
INIT_CLK
MOVLW
B00001111
;MAKE ACTIVE HIGH
MOVWF
PORT_A
;
/
MOVLW
B00000000
;SET PORT A AS OUTPUTS
TRIS
PORT_A
;
MOVLW
B11111111
;SET LEVELS HIGH
MOVWF
PORT_B
;
/
MOVLW
B00000000
;SET PORT B AS OUTPUTS
TRIS
PORT_B
;
MOVLW
B00000000
;SET LEVELS LOW
MOVWF
PORT_C
;
/
MOVLW
B00000000
;SET PORT C AS OUTPUTS
TRIS
PORT_C
;
/
;
MOVLW
B00000100
;SET UP PRESCALER
OPTION
;
/
;
MOVLW
MSEC5
;TMR0 = 5 mSEC
MOVWF
TMR0
;
/
CLRF
MSTMR
;CLEAR MSTMR
CLRF
STMR
; & SEC TMR
CLRF
MTMR
;& MINUTES
MOVLW
12H
;MAKE HRS = 12
MOVWF
HTMR
;
/
MOVWF
HALARM
;MAKE HRS = 12
CLRF
MALARM
;
/
MOVLW
B00000011
;SET TO TEST MODE
MOVWF
FLAG
;
/
CLRF
ALFLAG
;CLEAR ALL FLAG
CLRF
AAFLAG
;
/
CLRF
ENTFLG
;
/
GOTO
TEST_HARDWARE
;
;All routines related to timer updates are located at
;address 200 and above.
PAGE
ORG
0200
;
UPDATE_TIMERS
MOVF
TMR0,W
;SEE IF TMR0 = 0
BTFSS
STATUS,Z
;IF 0 THEN SKIP
GOTO
UPDATE_TIMERS
;ELSE LOOP
MOVLW
MSEC5
;TMR0 = 5 mSEC
MOVWF
TMR0
;
/
INCF
MSTMR, F
;INC 5 MILLI SEC
BTFSC
FLAG,KEY_HIT
;NO KEY HIT THEN SKIP
GOTO
CHK_DE_BOUNCE
;ELSE DEBOUNCE
UP_TMR_1
MOVF
FLAG,W
;ALARM MODE?
ANDLW
B00000011
;
/
XORLW
B00000001
;
/
BTFSS
STATUS,Z
;SKIP IF YES
GOTO
UP_TMR_2
;DO NEXT
BSF
FLAG,ALRMLED
;LIGHT LED
BSF
FLAG,COLON
;
/
MOVLW
D100
;IF 1/2 SEC
SUBWF
MSTMR,0
; BLINK
BTFSS
STATUS,C
; /
BCF
FLAG,ALRMLED
;ALARM LED

DS00529E-page 15

AN529
0213
0214
0214
0215
0216
0217
0218
0219
0219
021A
021B
021C

0A19

021D
021E
021F
0220
0221
0222
0223
0224
0225
0226
0227

0068
0216
0E0F
0743
00F6
0C09
0024
0955
0D00
0743
0A38

0228
0229
022A
022B
022C
022D
022E
022F
0230
0231
0232
0233
0234

03B6
0216
0E0F
0743
00F6
03B6
0966
0C0A
0024
0955
0D00
0743
0A38

0570
0C64
0088
0703
0470
0208
0FC7
0743
0800

0235 0C0B
0236 0024
0237 0989
0238
0238
0239
023A
023B
023C
023D

0718
0800
0658
0800
0638
0A4D

023E
023F
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
024A
024B
024C

020D
018B
0743
0800
020C
018A
0743
0800
0209
0743
0800
0538
0C10
0036
0800

DS00529E-page 16

00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648

GOTO

UP_TMR_3

;SKIP

FLAG,COLON
D100
MSTMR,0
STATUS,C
FLAG,COLON

;TURN ON
;<100 BLINK COLON
;
/
;YES THEN SKIP
;ELSE TURN OFF

UP_TMR_2
BSF
MOVLW
SUBWF
BTFSS
BCF
UP_TMR_3
MOVF
MSTMR,0
XORLW
D199
BTFSS
STATUS,Z
RETLW
0
;INC SECONDS COUNT
CLRF
MSTMR
MOVF
MIN_SEC,W
ANDLW
B00001111
BTFSS
STATUS,Z
DECF
MIN_SEC, F
MOVLW
STMR
MOVWF
FSR
CALL
INC_60
IORLW
0
BTFSS
STATUS,Z
GOTO
CHK_AL_TIM
;INC MINUTES COUNT
SWAPF
MIN_SEC, F
MOVF
MIN_SEC,W
ANDLW
B00001111
BTFSS
STATUS,Z
DECF
MIN_SEC, F
SWAPF
MIN_SEC, F
CALL
CHK_SILNC_TIM
MOVLW
MTMR
MOVWF
FSR
CALL
INC_60
IORLW
0
BTFSS
STATUS,Z
GOTO
CHK_AL_TIM
;INC HOUR COUNT
MOVLW
HTMR
MOVWF
FSR
CALL
INC_HR
;
CHK_AL_TIM
BTFSS
ALFLAG,ALONOF
RETLW
0
BTFSC
ALFLAG,SILNC
RETLW
0
BTFSC
ALFLAG,INAL
GOTO
CHK_1_MIN
;
RETLW
0
MOVF
HALARM,W
XORWF
HTMR,W
BTFSS
STATUS,Z
RETLW
0
MOVF
MALARM,W
XORWF
MTMR,W
BTFSS
STATUS,Z
RETLW
0
MOVF
STMR,W
BTFSS
STATUS,Z
RETLW
0
BSF
ALFLAG,INAL
MOVLW
10
MOVWF
MIN_SEC
RETLW
0

;GET MSTMR IN W
;= 199 THEN SKIP
;
/

;CLEAR MS_TMR
;GET MIN_SEC TIMER
;MASK MINUTES
;ZERO THEN SKIP
;REDUCE SECONDS
;LOAD FSR WITH S_TMR
;
/
;INC SECONDS
;DO AN OPERATION
;IF RETURN = 0 SKIP
;CHK ALRM
;SWAP MIN SEC
;GET MIN_SEC IN W
;MASK SECONDS
;SKIP IF NOT SET
;ELSE DEC
;SWAP BACK
;SILENCE ON?
;INC MINUTES
;
/
;
/
;DO AN OPERATION
;IF 0 THEN SKIP
;CHECK ALARM TIME
;GET HTMR IN FSR
;INC HOURS

;IF OFF QUIT


;
/
;RET IF IN SILENCE
;ALREADY DONE
;SEE IF 1 MIN UP
;YES THEN QUIT
;CHK HRS
;EQUAL?
;YES THEN SKIP
;ELSE RET
;CHK MIN
;EQUAL?
;YES THEN SKIP
;ELSE RET
;SEE IF SEC=0
;YES THEN SKIP
;NO THEN RET
;SET IN ALARM FLAG
;SET 1 MIN TIMER
;
/

1997 Microchip Technology Inc.

AN529
024D
024D
024E
024F
0250
0251
0252
0253
0254

0396
0E0F
0743
0800
0438
0478
0505
0800

0255
0255
0256
0257
0258
0259
025A
025B
025C
025D
025E
025F
0260
0261
0262
0263
0264
0265

02A0
0200
0E0F
0F0A
0743
0801
0CF0
0160
03A0
02A0
0200
03A0
0F06
0743
0801
0060
0800

0266
0266
0267
0268
0269
026A
026B
026C
026D
026E
026F

0758
0800
0396
0E0F
0743
0800
0458
0C10
0036
0800

0270
0270
0271
0272
0273
0274
0275
0276
0276
0277
0278
0279
027A
027B
027C
027D
027E
027F

06B7
0A76
07B0
0A7F
0678
0A86
05B7
0215
0643
0C14
0035
0405
02F5
0A08
0505

027F 07F0

00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714

1997 Microchip Technology Inc.

;
CHK_1_MIN
SWAPF
ANDLW
BTFSS
RETLW
BCF
BCF
BSF
RETLW
;
INC_60
INCF
MOVF
ANDLW
XORLW
BTFSS
RETLW
MOVLW
ANDWF
SWAPF
INCF
MOVF
SWAPF
XORLW
BTFSS
RETLW
CLRF
RETLW
;
PAGE
;
CHK_SILNC_TIM
BTFSS
RETLW
SWAPF
ANDLW
BTFSS
RETLW
BCF
MOVLW
MOVWF
RETLW
;
;
CHK_DE_BOUNCE
BTFSC
GOTO
BTFSS
GOTO
BTFSC
GOTO
CHK_DEB_1
BSF
MOVF
BTFSC
MOVLW
MOVWF
BCF
DECFSZ
GOTO
BSF
CHK_SERV
;
CLRF
;
BSF
BTFSS

MIN_SEC,W
B00001111
STATUS,Z
0
ALFLAG,INAL
ALFLAG,INAA
PORT_A,BEP
0

;SWAP IN W
;CHK MINUTES
;0 THEN SKIP
;ELSE RET
;CLR IN ALARM
;CLR IN AA
;STOP BEEPER

F0, F
F0,0
B00001111
B00001010
STATUS,Z
1
B11110000
F0, F
F0, F
F0, F
F0,0
F0, F
D6
STATUS,Z
1
F0
0

;INC AND GET IN W


;
/
;MASK HI BITS
;= 10 THEN MAKE IT 0
;
/
;ELSE RETURN NON ZERO
;ZERO LSB
; /
;SWAP INDIRECT
;INC
;GET IN W
;SWAP F0 BACK
;=6 THEN SKIP
;
/
;ELSE RETURN NZ
;
/
;RET 0

ALFLAG,SILNC
0
MIN_SEC,W
B00001111
STATUS,Z
0
ALFLAG,SILNC
10
MIN_SEC
0

;CHK IF IN SILENCE
;NO THEN SKIP
;GET MIN IN W
;MASK SECS
;ZERO?
;NO THEN RET
;RESET SILENCE
;SET 1 MIN TIMER
;
/

ENTFLG,INKEYBEP
CHK_DEB_1
FLAG,KEY_BEEP
CHK_SERV
ALFLAG,INAA
CHK_BEP_ON

;IN KEY BEEP?


;YES THEN DEC TIMER
;KEY BEEP SET?
;NO, SEE IF SERVICED
;IN AA?
;YES THEN SEE IF ON

ENTFLG,INKEYBEP
DEBOUNCE,W
STATUS,Z
D20
DEBOUNCE
PORT_A,BEP
DEBOUNCE, F
UP_TMR_1
PORT_A,BEP

;SET FLAG
;GET IN W
;NZ THEN SKIP
;ELSE DB 100 mSEC
;
/
;TURN ON BEEPER
;DEC AND CHK
;GO BACK
;TURN OFF BEEPER

DEBOUNCE
PORT_A,BEP
FLAG,SERVICED

;SERVICED THEN SKIP

DS00529E-page 17

AN529
0280
0281
0282
0283
0284
0285

0A08
04F0
04D0
04B0
04B7
0A08

0286
0286 0705
0287 0A08
0288 0A76

0289
0289
028A
028B
028C
028D
028E
028F
0290
0291
0292
0293
0293
0294
0295
0296
0297
0298
0299
029A
029B
029C
029C
029D
029D
029E
029F
02A0
02A1
02A1
02A2
02A3
02A3
02A4
02A5

02A0
0200
0031
0E0F
0F0A
0743
0A93
0C10
0020
0AA3
04E0
0200
0F12
0743
0A9D
07F1
0A9C
04E0
0800
05E0
0200
0F13
0743
0AA3
0C01
0020
06F1
05E0
0800

0400

0000000A
0000000B
0000000C
0000000D
0000000E
0000000F
0400
0400 07D0
0401 0800
0402 06F0

DS00529E-page 18

00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780

GOTO
BCF
BCF
BCF
BCF
GOTO

UP_TMR_1
FLAG,SERVICED
FLAG,KEY_HIT
FLAG,KEY_BEEP
ENTFLG,INKEYBEP
UP_TMR_1

;
CHK_BEP_ON
BTFSS
PORT_A,BEP
GOTO
UP_TMR_1
GOTO
CHK_DEB_1
;
;
INC_HR
INCF
F0, F
MOVF
F0,W
MOVWF
TEMP
ANDLW
B00001111
XORLW
D10
BTFSS
STATUS,Z
GOTO
INC_AM_PM
MOVLW
B00010000
MOVWF
F0
GOTO
RESTORE_AM_PM
INC_AM_PM
BCF
F0,AM_PM
MOVF
F0,W
XORLW
12H
BTFSS
STATUS,Z
GOTO
CHK_13
BTFSS
TEMP,AM_PM
GOTO
SET_AM_PM
BCF
F0,AM_PM
RETLW
0
SET_AM_PM
BSF
F0,AM_PM
CHK_13
MOVF
F0,W
XORLW
13H
BTFSS
STATUS,Z
GOTO
RESTORE_AM_PM
SET_1_HR
MOVLW
B00000001
MOVWF
F0
RESTORE_AM_PM
BTFSC
TEMP,AM_PM
BSF
F0,AM_PM
RETLW
0
;
;
;
PAGE
ORG
400
;
;KEY DEFINITIONS
ALARM_KEY
EQU
0A
CE_KEY
EQU
0B
SNOOZE_KEY
EQU
0C
AM_PM_KEY
EQU
0D
CLR_ALARM_KEY
EQU
0E
SET_KEY
EQU
0F
;
SERVICE_KEYS
BTFSS
FLAG,KEY_HIT
RETLW
0
BTFSC
FLAG,SERVICED

;GO BACK
;ELSE CLEAR FLAGS
;
/
;RESET FLAG
;
/
;GO BACK

;IF OFF THEN SKIP


;ELSE WAIT
;RETURN

;INC HOUR TIMER


;GET HR TMR IN W
;SAVE IN TEMP
;CHK LO BYTE = 10
;
/
;YES THEN SKIP
;ELSE CHK 12
;LOAD 1 IN MSB
;RESTORE AM/PM
;CLEAR AM/PM
;GET IN W
;SEE IF 12 HEX
;YES THEN SKIP
;ELSE CHK 13
;IF SET, SKIP
;ELSE SET
;CLEAR FLAG
;RETURN
;SET FLAG
;GET IN W
;SEE IF 13
;YES THEN SKIP

;SET TO 1

;SKIP IF AM
;ELSE SET TO PM

;NO KEY HIT THEN ...


;RETURN
;IF NOT SERVICED SKIP

1997 Microchip Technology Inc.

AN529
0403
0404
0405
0406
0407
0408
0409
040A
040B
040C
040D
040D
040E
040F

0410
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419
041A
041B
041C
041C

0800
05F0
0210
0E03
0643
0A10
0031
02F1
0A0D
0A1D
02F1
0800
0A2A

09BA
0D00
0643
0800
0C0F
0193
0643
0A91
0C0A
0193
0643
0AAB
0800

041D
041D
041E
041F
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429

09BA
0D00
0643
0800
0C0F
0193
0643
0A9C
0C0A
0193
0643
0AA2
0A1C

042A
042A
042B
042C
042D
042E
042F
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439

09BA
0D00
0643
0800
0C0F
0193
0643
0A3F
0C0B
0193
0643
0A48
0737
0A54
0757
0A5F

00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792
00793
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845
00846

1997 Microchip Technology Inc.

RETLW
BSF
MOVF
ANDLW
BTFSC
GOTO
MOVWF
DECFSZ
GOTO
GOTO

0
FLAG,SERVICED
FLAG,W
B00000011
STATUS,Z
RTMKS
TEMP
TEMP, F
SK1
ATMKS

;ELSE RETURN
;SET SERVICED FLAG
;GET MODE OF OPERATION
;
/
;00 THEN RTM
;RTM KEY SERVICE
;SAVE IN TEMP
;REDUCE TEMP
;SKIP
;01, DO ALARM MODE

DECFSZ
RETLW
GOTO

TEMP, F
0
DEMKS

;REDUCE TEMP
;11 THEN RETURN
;10, DATA ENTRY MODE

SK1

;
;REAL TIME MODE KEY SERVICE
RTMKS
CALL
CHK_AL_KEYS
IORLW
0
BTFSC
STATUS,Z
RETLW
0
MOVLW
SET_KEY
XORWF
NEW_KEY,W
BTFSC
STATUS,Z
GOTO
SERV_SET_RTM
MOVLW
ALARM_KEY
XORWF
NEW_KEY,W
BTFSC
STATUS,Z
GOTO
SERV_ALARM_RTM
IGNORE_KEY
RETLW
0
;
;ALARM TIME MODE KEY SERVICE
ATMKS
CALL
CHK_AL_KEYS
IORLW
0
BTFSC
STATUS,Z
RETLW
0
MOVLW
SET_KEY
XORWF
NEW_KEY,W
BTFSC
STATUS,Z
GOTO
SERV_SET_ATM
MOVLW
ALARM_KEY
XORWF
NEW_KEY,W
BTFSC
STATUS,Z
GOTO
SERV_ALARM_ATM
GOTO
IGNORE_KEY
;
;DATA ENTRY MODE KEY SERVICE
DEMKS
CALL
CHK_AL_KEYS
IORLW
0
BTFSC
STATUS,Z
RETLW
0
MOVLW
SET_KEY
XORWF
NEW_KEY,W
BTFSC
STATUS,Z
GOTO
DEMKS_END
MOVLW
CE_KEY
XORWF
NEW_KEY,W
BTFSC
STATUS,Z
GOTO
DEMKS_END_1
BTFSS
ENTFLG,HR10
GOTO
ENT_HR_10
BTFSS
ENTFLG,HR
GOTO
ENT_HRS

;CHK ALARM KEYS


;SEE IF NZ RET
;NZ THEN SKIP
;ELSE RETURN
;SEE IF SET KEY
;
/
;NO THEN SKIP
;SERVICE SET KEY
;ALARM KEY?
;
/
;NO THEN SKIP
;ELSE SERVICE ALARM
;ELSE RETURN

;CHECK ALARM KEYS


;CHECK IF 0
;NZ THEN SKIP
;ELSE RETURN
;SEE IF SET KEY
;
/
;NO THEN SKIP
;GET ALARM KEY
;SEE IF HIT
;NO THEN SKIP
;ELSE SERVICE

;CHECK ALARM KEYS


;CHK IF 0
;NZ THEN SKIP
;ELSE RETURN
;IF SET KEY THEN END
;
/
;NO THEN SKIP
;GOTO END
;IF CLEAR ENTRY
;
/
;SKIP IF NO
;ABANDON ENTRY
;10S HRS DONE?
;NO THEN GET
;HRS DONE?
;NO THEN GET

DS00529E-page 19

AN529
043A
043B
043C
043D
043E
043F
043F
0440
0441
0442
0443
0444
0445
0446
0447
0448
0448
0449
044A
044B
044B
044C
044D
044D
044E
044F
0450
0451
0452
0453
0454
0454
0455
0456
0457
0458
0459
045A
045B
045C
045C
045D
045E
045F
045F
0460
0461
0462
0463
0464
0465
0466
0467
0467
0468
0468
0469
046A
046B
046C
046D
046D
046E
046F

0777
0A72
0797
0A7F
0A87
0717
0A4D
020E
002C
020F
002D
0450
0618
0550
0410
0430
0490
05B0
0800

020E
002A
020F
002B
0068
0069
0A48

0213
0643
0A5C
02D3
0A1C
058F
0537
0A4B
048F
0537
0A4B
0C0F
0024
068F
0A6D
0C0A
0093
0603
0A1C
0557
0200
0EF0
0113
0020
0A4B
0C03
0093
0603

DS00529E-page 20

00847
00848
00849
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911
00912

BTFSS
GOTO
BTFSS
GOTO
GOTO
DEMKS_END
BTFSS
GOTO
MOVF
MOVWF
MOVF
MOVWF
BCF
BTFSC
BSF
DEMKS_END_1
BCF
BCF
BCF
SERV_COM_RET
BSF
RETLW
;
LD_RTM
MOVF
MOVWF
MOVF
MOVWF
CLRF
CLRF
GOTO
;
ENT_HR_10
MOVF
BTFSC
GOTO
DECFSZ
GOTO
BSF
BSF
GOTO
LD_HENTRY_0
BCF
BSF
GOTO
ENT_HRS
MOVLW
MOVWF
BTFSC
GOTO
MOVLW
SUBWF
BTFSC
GOTO
ENT_LO_COM1
BSF
ENT_LO_COM
MOVF
ANDLW
IORWF
MOVWF
GOTO
ALLOW0_2
MOVLW
SUBWF
BTFSC

ENTFLG,MIN10
ENT_MIN_10
ENTFLG,MIN
ENT_MIN
ENT_AM_PM

;10S MIN. DONE?


;NO THEN GET
;MIN DONE?
;NO THEN GET
;NO THEN GET

ENTFLG,RTATS
LD_RTM
MENTRY,W
MALARM
HENTRY,W
HALARM
FLAG,ALRMLED
ALFLAG,ALONOF
FLAG,ALRMLED

;GET OLD STATUS


;LOAD IN TIME
;LD IN ALARM
;
/
;
/
;
/
;CLEAR FLAG
;SEE IF ON-OFF
;ELSE SET

FLAG,0
FLAG,1
FLAG,FLASH

;RTM MODE
;
/
;STOP FLASH

FLAG,KEY_BEEP
0

;RETURN

MENTRY,W
MTMR
HENTRY,W
HTMR
MSTMR
STMR
DEMKS_END_1

;LD IN RTM
;
/
;
/
;
/
;CLR TIME
; /
;GO BACK

NEW_KEY,W
STATUS,Z
LD_HENTRY_0
NEW_KEY,0
IGNORE_KEY
HENTRY,4
ENTFLG,HR10
SERV_COM_RET

;SEE IF 0
;NZ THEN SKIP
;LOAD 0
;1 THE SKIP
;ELSE IGNORE KEY
;SET TO 1
;SET FLAG
;GO GET NEXT

HENTRY,4
ENTFLG,HR10
SERV_COM_RET

;SET TO 0

HENTRY
FSR
HENTRY,4
ALLOW0_2
D10
NEW_KEY,W
STATUS,C
IGNORE_KEY

;USE INDIRECT ADDR.


;
/
;SEE IF 0
;YES THEN 0,1&2
;SEE IF 0 - 9
;
/
;IF C THEN SKIP
;ELSE IGNORE

ENTFLG,HR

;SET FLAG

F0,W
B11110000
NEW_KEY,W
F0
SERV_COM_RET

;LD HRS
;MASK LO NIBL
;OR NEW KEY
;SAVE BACK
;GET NEXT

D3
NEW_KEY,W
STATUS,C

;SEE IF 0 - 2
;
/
;<3 THEN SKIP

1997 Microchip Technology Inc.

AN529
0470 0A1C
0471 0A67
0472
0472
0473
0474
0475
0476
0477
0478
0479
047A
047B
047C
047D
047E

0C0E
0024
0C06
0093
0603
0A1C
0380
0EF0
0113
0020
03A0
0577
0A4B

047F
047F
0480
0481
0482
0483
0484
0485
0486

0C0E
0024
0C0A
0093
0603
0A1C
0597
0A68

0487
0487
0488
0489
048A
048B
048C
048D
048E
048F
048F
0490

0491
0491
0492
0493
0494
0495
0495
0496
0497
0498
0499
049A
049B
049C
049C
049D
049E
049F
04A0
04A1
04A2

0C0D
0193
0743
0A1C
07EF
0A8F
04EF
0A4B
05EF
0A4B

020A
002E
020B
002F
0210
0E01
0037
0CF2
0130
0410
0800

020C
002E
020D
002F
0518
0A95

00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936
00937
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967
00968
00969
00970
00971
00972
00973
00974
00975
00976
00977
00978

1997 Microchip Technology Inc.

GOTO
GOTO
;
ENT_MIN_10
MOVLW
MOVWF
MOVLW
SUBWF
BTFSC
GOTO
SWAPF
ANDLW
IORWF
MOVWF
SWAPF
BSF
GOTO
;
ENT_MIN
MOVLW
MOVWF
MOVLW
SUBWF
BTFSC
GOTO
BSF
GOTO
;
ENT_AM_PM
MOVLW
XORWF
BTFSS
GOTO
BTFSS
GOTO
BCF
GOTO
SETAMPM
BSF
GOTO
;
PAGE
;
SERV_SET_RTM
MOVF
MOVWF
MOVF
MOVWF
SERV_COM
MOVF
ANDLW
MOVWF
MOVLW
IORWF
BCF
RETLW
;
SERV_SET_ATM
MOVF
MOVWF
MOVF
MOVWF
BSF
GOTO
;
SERV_ALARM_ATM

IGNORE_KEY
ENT_LO_COM1

MENTRY
FSR
D6
NEW_KEY,W
STATUS,C
IGNORE_KEY
F0,W
B11110000
NEW_KEY,W
F0
F0, F
ENTFLG,MIN10
SERV_COM_RET

;DO INDIRECT ADDR.


;
/
;ALLOW 0 - 5
;
/
;IF C THEN SKIP
;ELSE IGNORE
;SWAP AND GET
;MASK LO NIBL
;OR NEW KEY
;SAVE BACK
;SWAP BACK

MENTRY
FSR
D10
NEW_KEY,W
STATUS,C
IGNORE_KEY
ENTFLG,MIN
ENT_LO_COM

;DO INDIRECT
;
/
;ALLOW 0 - 9
;SEE IF >
;NO THEN SKIP
;ELSE IGNORE
;SET FLAG
;
/

AM_PM_KEY
NEW_KEY,W
STATUS,Z
IGNORE_KEY
HENTRY,AM_PM
SETAMPM
HENTRY,AM_PM
SERV_COM_RET

;AM/PM KEY?
;
/
;YES THEN SKIP

HENTRY,AM_PM
SERV_COM_RET

;SET FLAG

MTMR,W
MENTRY
HTMR,W
HENTRY

;TRANSFER TIME
;TO DATA ENTRY
;
/
;
/

FLAG,W
B00000001
ENTFLG
B11110010
FLAG, F
FLAG,0
0

;SAVE IN W
;ATM OR RTM MODE?
;SAVE IN ENTFLG
;FORCE 1S
;
/
;
/

MALARM,W
MENTRY
HALARM,W
HENTRY
ALFLAG,ALONOF
SERV_COM

;TRANSFER ALARM
;TO DATA ENTRY
;
/
;
/
;SET FLAG
;GOTO COMMON

;GET NEXT

;TEST BIT
;ELSE SET
;CLEAR FLAG
;GOTO END

DS00529E-page 21

AN529
04A2
04A3
04A4
04A5
04A6
04A6
04A7
04A7
04A8
04A9
04AA
04AB
04AB
04AC
04AD
04AE
04AF
04B0
04B1
04B1
04B2
04B3
04B4
04B4
04B5
04B6
04B7
04B8
04B9

0718
0AA6
0418
0AA7
0518
05B0
0CF0
0176
0800

05B0
0510
0430
0C05
0036
0800

0CA0
0036
0558
05B0
007A
0079
0478
0505
0800

04BA
04BA
04BB
04BC
04BD
04BE
04BF
04C0
04C1
04C2
04C3
04C4
04C5
04C6

0718
0801
0738
0801
0C0E
0193
0643
0AC7
0C0C
0193
0743
0801
0AB1

04C7
04C7
04C8
04C9
04CA
04CB

0438
0458
0C0F
0176
0AB4

0600

0600
0600
0601
0602
0603
0604
0605
0606

0738
0800
0658
0800
06B7
0A55

DS00529E-page 22

00979
00980
00981
00982
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004
01005
01006
01007
01008
01009
01010
01011
01012
01013
01014
01015
01016
01017
01018
01019
01020
01021
01022
01023
01024
01025
01026
01027
01028
01029
01030
01031
01032
01033
01034
01035
01036
01037
01038
01039
01040
01041
01042
01043
01044

BTFSS
ALFLAG,ALONOF
;TEST ON/OFF
GOTO
SET_ALONOF
;SET ON/OF FLG
BCF
ALFLAG,ALONOF
;CLEAR FLAG
GOTO
SERV_ATM_COM
;RET THRO COM
SET_ALONOF
BSF
ALFLAG,ALONOF
;SET FLAG
SERV_ATM_COM
BSF
FLAG,KEY_BEEP
;BEEP
MOVLW
B11110000
;CLEAR SEC COUNT
ANDWF
MIN_SEC, F
;
/
RETLW
0
;RETURN
;
SERV_ALARM_RTM
BSF
FLAG,KEY_BEEP
;SET BEEP FLAG
BSF
FLAG,0
;SET TO ALARM TIME
BCF
FLAG,1
;
/
MOVLW
D05
;SAVE 5 IN MIN_SEC
MOVWF
MIN_SEC
;
/
RETLW
0
;
SERV_SNOOZE
MOVLW
0A0
;SNOOZE FOR 10 MINS
MOVWF
MIN_SEC
;
/
BSF
ALFLAG,SILNC
;SET FLAG
CLR_AL_COM
BSF
FLAG,KEY_BEEP
;SET BEEP FLAG
CLRF
AATMR
;RESET AA TIMER
CLRF
AAFLAG
;CLEAR AA FLAGS
BCF
ALFLAG,INAA
;RESET INAA FLAG
BSF
PORT_A,BEP
;TURN OFF BEEPER
RETLW
0
;RET
;
CHK_AL_KEYS
BTFSS
ALFLAG,ALONOF
;ALARM ON?
RETLW
1
;NO THEN RET
BTFSS
ALFLAG,INAL
;IN ALARM?
RETLW
1
;NO THEN SKIP
MOVLW
CLR_ALARM_KEY
;CHECK IF CLR ALARM
XORWF
NEW_KEY,W
;
/
BTFSC
STATUS,Z
;NO THEN SKIP
GOTO
CLR_ALARM
;ELSE CLEAR ALARM
MOVLW
SNOOZE_KEY
;SEE IF SNOOZE HIT
XORWF
NEW_KEY,W
;
/
BTFSS
STATUS,Z
;YES THEN SKIP
RETLW
1
GOTO
SERV_SNOOZE
;
CLR_ALARM
BCF
ALFLAG,INAL
;CLEAR ALARM
BCF
ALFLAG,SILNC
;CLEAR SILENCE
MOVLW
B00001111
;CLEAR MINS
ANDWF
MIN_SEC, F
;
/
GOTO
CLR_AL_COM
;
ORG
600
;If the AA alarm is set, then this routine takes care of
;the timing in sounding the alarm.
;
SOUND_AA
BTFSS
ALFLAG,INAL
;SKIP IF IN ALRM
RETLW
0
;ELSE RETURN
BTFSC
ALFLAG,SILNC
;SKIP IF NOT IN SILENCE
RETLW
0
;ELSE RET
BTFSC
ENTFLG,INKEYBEP ;SKIP IF NOT IN KEY BEEP
GOTO
CHK_COLSN
;CHK COLLISION
SND_AA_0

1997 Microchip Technology Inc.

AN529
0606
0607
0607
0608
0609
060A
060B
060C
060D
060E
060F
0610
0611
0612
0613
0614
0615
0616
0617
0618

0778
0919
0719
0A21
0739
0A29
0759
0A31
0779
0A39
0799
0A3E
07B9
0A43
07D9
0A48
07F9
0A50
0A07

0619
0619 0079
061A 0578
061B 0A2D
061C
061C
061D
061E
061F
0620
0621
0621
0622
0623
0624
0625
0625
0626
0627
0628
0629
0629
062A
062B
062C
062D
062D
062E
062F
0630
0631
0631
0632
0633
0634
0635
0636
0637
0638
0639

00FA
021A
0743
0801
0800

091C
0743
0800
0519
0505
0C14
003A
0800

091C
0743
0800
0539
0405
0C14
003A
0800

091C
0743
0800
0559
0505
0C64
003A
0800

01045
01046
01047
01048
01049
01050
01051
01052
01053
01054
01055
01056
01057
01058
01059
01060
01061
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076
01077
01078
01079
01080
01081
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092
01093
01094
01095
01096
01097
01098
01099
01100
01101
01102
01103
01104
01105
01106
01107
01108
01109
01110

1997 Microchip Technology Inc.

BTFSS

ALFLAG,INAA

;SKIP IF IN AA

CALL
BTFSS
GOTO
BTFSS
GOTO
BTFSS
GOTO
BTFSS
GOTO
BTFSS
GOTO
BTFSS
GOTO
BTFSS
GOTO
BTFSS
GOTO
GOTO

INIT_AA
AAFLAG,0
DO_CYCL0
AAFLAG,1
DO_CYCL1
AAFLAG,2
DO_CYCL2
AAFLAG,3
DO_CYCL3
AAFLAG,4
DO_CYCL4
AAFLAG,5
DO_CYCL5
AAFLAG,6
DO_CYCL6
AAFLAG,7
DO_CYCL7
SND_AA_1

;INIT ALL
;SKIP IF DONE
;DO FIRST CYCL
;SKIP IF DONE
;ELSE 2ND CYCLE
;SKIP IF DONE
;ELSE DO 3RD CYCLE
;SKIP IF DONE
;DO CYCLE 4
;SKIP IF DONE
;DO CYCLE 5
;SKIP IF DONE
;DO CYCLE 6
;SKIP IF DONE
;DO CYCLE 6
;SKIP IF DONE
;DO CYCLE 7
;GO BACK

CLRF
BSF
GOTO

AAFLAG
ALFLAG,INAA
PUT_ON_100

;CLEAR ALL FLAGS


;SET IN AA FLAG
;ON 100 MSECS

AATMR, F
AATMR,W
STATUS,Z
1
0

;REDUCE TIMER
;GET IN W
;CHECK IF Z
;NO THEN NZ
;ELSE 0

DEC_AA_TMR
STATUS,Z
0
AAFLAG,0

;REDUCE TIMER
;IF NZ THEN RET

PORT_A,BEP
D20
AATMR
0

;TURN OFF BEEPER


;FOR 100 MSECS
;
/

DEC_AA_TMR
STATUS,Z
0
AAFLAG,1

;REDUCE TIMER
;IF NZ THEN RET

PORT_A,BEP
D20
AATMR
0

;TURN ON BEEPER
;FOR 100 MSECS
;
/

DEC_AA_TMR
STATUS,Z
0
AAFLAG,2
PORT_A,BEP
D100
AATMR
0

;REDUCE TIMER
;IF NZ THEN RET
;
/
;SET DONE FLAG
;TURN OFF BEEPER
;FOR 500 MSECS
;
/

SND_AA_1

;
INIT_AA

;
DEC_AA_TMR
DECF
MOVF
BTFSS
RETLW
RETLW
;
DO_CYCL0
CALL
BTFSS
RETLW
BSF
PUT_OFF_100
BSF
MOVLW
MOVWF
RETLW
;
DO_CYCL1
CALL
BTFSS
RETLW
BSF
PUT_ON_100
BCF
MOVLW
MOVWF
RETLW
;
DO_CYCL2
CALL
BTFSS
RETLW
BSF
BSF
MOVLW
MOVWF
RETLW
;
DO_CYCL3

;SET DONE FLAG

;SET DONE FLAG

DS00529E-page 23

AN529
0639
063A
063B
063C
063D
063E
063E
063F
0640
0641
0642
0643
0643
0644
0645
0646
0647
0648
0648
0649
064A
064B
064C
064D
064E
064F
0650
0650
0651
0652
0653
0654
0655
0655
0656
0657
0658
0659
065A
065B
065C
065C
065D

091C
0743
0800
0579
0A2D

091C
0743
0800
0599
0A25

091C
0743
0800
05B9
0A2D

091C
0743
0800
05D9
0505
0CC8
003A
0800

091C
0743
0800
05F9
0A2D

0605
0A06
021A
0643
0A5C
00FA
0800
02BA
0800

07FF
07FF
07FF 0A00

DS00529E-page 24

01111
01112
01113
01114
01115
01116
01117
01118
01119
01120
01121
01122
01123
01124
01125
01126
01127
01128
01129
01130
01131
01132
01133
01134
01135
01136
01137
01138
01139
01140
01141
01142
01143
01144
01145
01146
01147
01148
01149
01150
01151
01152
01153
01154
01155
01156
01157
01158
01159
01160
01161
01162
01163
01164

CALL
BTFSS
RETLW
BSF
GOTO

DEC_AA_TMR
STATUS,Z
0
AAFLAG,3
PUT_ON_100

;REDUCE TIMER
;IF NZ THEN RET
;
/
;SET DONE FLAG
;DO NEXT CYCLE

DEC_AA_TMR
STATUS,Z
0
AAFLAG,4
PUT_OFF_100

;REDUCE TIMER
;IF NZ THEN RET
;
/
;SET DONE FLAG
;DO NEXT CYCLE

DEC_AA_TMR
STATUS,Z
0
AAFLAG,5
PUT_ON_100

;REDUCE TIMER
;IF NZ THEN RET
;
/
;SET DONE FLAG
;DO NEXT CYCLE

DEC_AA_TMR
STATUS,Z
0
AAFLAG,6
PORT_A,BEP
D200
AATMR
0

;REDUCE TIMER
;IF NZ THEN RET
;
/
;SET DONE FLAG
;TURN OFF BEEPER
;FOR 1000 MSECS
;
/

DEC_AA_TMR
STATUS,Z
0
AAFLAG,7
PUT_ON_100

;REDUCE TIMER
;IF NZ THEN RET
;
/
;SET DONE FLAG
;DO NEXT CYCLE

PORT_A,BEP
SND_AA_0
AATMR,W
STATUS,Z
LD_AAT_1
AATMR, F
0

;IF ON THEN SKIP


;ELSE RET
;GET TIMER
;NZ THEN SKIP
;LOAD A 1 IN TMR
;REDUCE TIMER
;RETURN

AATMR, F
0

;INC TIMER
;RET

;
DO_CYCL4
CALL
BTFSS
RETLW
BSF
GOTO
;
DO_CYCL5
CALL
BTFSS
RETLW
BSF
GOTO
;
DO_CYCL6
CALL
BTFSS
RETLW
BSF
BSF
MOVLW
MOVWF
RETLW
;
DO_CYCL7
CALL
BTFSS
RETLW
BSF
GOTO
;
CHK_COLSN
BTFSC
GOTO
MOVF
BTFSC
GOTO
DECF
RETLW
LD_AAT_1
INCF
RETLW
;
ORG
SYS_RESET
GOTO
;
END

PIC57
START

1997 Microchip Technology Inc.

AN529
0000
0040
0080
00C0
0100
0200
0240
0280
0400
0440
0480
04C0
0600
0640
07C0

:
:
:
:
:
:
:
:
:
:
:
:
:
:
:

XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXX---XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
----------------

XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXX------XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
---------------XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXX-----------------

XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
---------------XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXX---------XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
---------------XXXXXXXXXXXXXXXX
-------------------------------

XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
---------------XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
---------------XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
---------------XXXXXXXXXXXXXXXX
------------------------------X

All other memory blocks unused.


Program Memory Words Used:
Program Memory Words Free:

Errors
:
Warnings :
Messages :

0
0 reported,
0 reported,

1997 Microchip Technology Inc.

746
1302

0 suppressed
6 suppressed

DS00529E-page 25

Note the following details of the code protection feature on PICmicro MCUs.

The PICmicro family meets the specifications contained in the Microchip Data Sheet.
Microchip believes that its family of PICmicro microcontrollers is one of the most secure products of its kind on the market today,
when used in the intended manner and under normal conditions.
There are dishonest and possibly illegal methods used to breach the code protection feature. All of these methods, to our knowledge, require using the PICmicro microcontroller in a manner outside the operating specifications contained in the data sheet.
The person doing so may be engaged in theft of intellectual property.
Microchip is willing to work with the customer who is concerned about the integrity of their code.
Neither Microchip nor any other semiconductor manufacturer can guarantee the security of their code. Code protection does not
mean that we are guaranteeing the product as unbreakable.
Code protection is constantly evolving. We at Microchip are committed to continuously improving the code protection features of
our product.

If you have any further questions about this matter, please contact the local sales office nearest to you.

Information contained in this publication regarding device


applications and the like is intended through suggestion only
and may be superseded by updates. It is your responsibility to
ensure that your application meets with your specifications.
No representation or warranty is given and no liability is
assumed by Microchip Technology Incorporated with respect
to the accuracy or use of such information, or infringement of
patents or other intellectual property rights arising from such
use or otherwise. Use of Microchips products as critical components in life support systems is not authorized except with
express written approval by Microchip. No licenses are conveyed, implicitly or otherwise, under any intellectual property
rights.

Trademarks
The Microchip name and logo, the Microchip logo, FilterLab,
KEELOQ, microID, MPLAB, PIC, PICmicro, PICMASTER,
PICSTART, PRO MATE, SEEVAL and The Embedded Control
Solutions Company are registered trademarks of Microchip Technology Incorporated in the U.S.A. and other countries.
dsPIC, ECONOMONITOR, FanSense, FlexROM, fuzzyLAB,
In-Circuit Serial Programming, ICSP, ICEPIC, microPort,
Migratable Memory, MPASM, MPLIB, MPLINK, MPSIM,
MXDEV, PICC, PICDEM, PICDEM.net, rfPIC, Select Mode
and Total Endurance are trademarks of Microchip Technology
Incorporated in the U.S.A.
Serialized Quick Turn Programming (SQTP) is a service mark
of Microchip Technology Incorporated in the U.S.A.
All other trademarks mentioned herein are property of their
respective companies.
2002, Microchip Technology Incorporated, Printed in the
U.S.A., All Rights Reserved.
Printed on recycled paper.

Microchip received QS-9000 quality system


certification for its worldwide headquarters,
design and wafer fabrication facilities in
Chandler and Tempe, Arizona in July 1999. The
Companys quality system processes and
procedures are QS-9000 compliant for its
PICmicro 8-bit MCUs, KEELOQ code hopping
devices, Serial EEPROMs and microperipheral
products. In addition, Microchips quality
system for the design and manufacture of
development systems is ISO 9001 certified.

2002 Microchip Technology Inc.

M
WORLDWIDE SALES AND SERVICE
AMERICAS

ASIA/PACIFIC

Japan

Corporate Office

Australia

2355 West Chandler Blvd.


Chandler, AZ 85224-6199
Tel: 480-792-7200 Fax: 480-792-7277
Technical Support: 480-792-7627
Web Address: http://www.microchip.com

Microchip Technology Australia Pty Ltd


Suite 22, 41 Rawson Street
Epping 2121, NSW
Australia
Tel: 61-2-9868-6733 Fax: 61-2-9868-6755

Microchip Technology Japan K.K.


Benex S-1 6F
3-18-20, Shinyokohama
Kohoku-Ku, Yokohama-shi
Kanagawa, 222-0033, Japan
Tel: 81-45-471- 6166 Fax: 81-45-471-6122

Rocky Mountain

China - Beijing

2355 West Chandler Blvd.


Chandler, AZ 85224-6199
Tel: 480-792-7966 Fax: 480-792-7456

Microchip Technology Consulting (Shanghai)


Co., Ltd., Beijing Liaison Office
Unit 915
Bei Hai Wan Tai Bldg.
No. 6 Chaoyangmen Beidajie
Beijing, 100027, No. China
Tel: 86-10-85282100 Fax: 86-10-85282104

Atlanta
500 Sugar Mill Road, Suite 200B
Atlanta, GA 30350
Tel: 770-640-0034 Fax: 770-640-0307

Boston
2 Lan Drive, Suite 120
Westford, MA 01886
Tel: 978-692-3848 Fax: 978-692-3821

Chicago
333 Pierce Road, Suite 180
Itasca, IL 60143
Tel: 630-285-0071 Fax: 630-285-0075

Dallas
4570 Westgrove Drive, Suite 160
Addison, TX 75001
Tel: 972-818-7423 Fax: 972-818-2924

Detroit
Tri-Atria Office Building
32255 Northwestern Highway, Suite 190
Farmington Hills, MI 48334
Tel: 248-538-2250 Fax: 248-538-2260

Kokomo
2767 S. Albright Road
Kokomo, Indiana 46902
Tel: 765-864-8360 Fax: 765-864-8387

Los Angeles
18201 Von Karman, Suite 1090
Irvine, CA 92612
Tel: 949-263-1888 Fax: 949-263-1338

China - Chengdu
Microchip Technology Consulting (Shanghai)
Co., Ltd., Chengdu Liaison Office
Rm. 2401, 24th Floor,
Ming Xing Financial Tower
No. 88 TIDU Street
Chengdu 610016, China
Tel: 86-28-6766200 Fax: 86-28-6766599

China - Fuzhou
Microchip Technology Consulting (Shanghai)
Co., Ltd., Fuzhou Liaison Office
Unit 28F, World Trade Plaza
No. 71 Wusi Road
Fuzhou 350001, China
Tel: 86-591-7503506 Fax: 86-591-7503521

China - Shanghai
Microchip Technology Consulting (Shanghai)
Co., Ltd.
Room 701, Bldg. B
Far East International Plaza
No. 317 Xian Xia Road
Shanghai, 200051
Tel: 86-21-6275-5700 Fax: 86-21-6275-5060

China - Shenzhen

150 Motor Parkway, Suite 202


Hauppauge, NY 11788
Tel: 631-273-5305 Fax: 631-273-5335

Microchip Technology Consulting (Shanghai)


Co., Ltd., Shenzhen Liaison Office
Rm. 1315, 13/F, Shenzhen Kerry Centre,
Renminnan Lu
Shenzhen 518001, China
Tel: 86-755-2350361 Fax: 86-755-2366086

San Jose

Hong Kong

Microchip Technology Inc.


2107 North First Street, Suite 590
San Jose, CA 95131
Tel: 408-436-7950 Fax: 408-436-7955

Microchip Technology Hongkong Ltd.


Unit 901-6, Tower 2, Metroplaza
223 Hing Fong Road
Kwai Fong, N.T., Hong Kong
Tel: 852-2401-1200 Fax: 852-2401-3431

New York

Toronto
6285 Northam Drive, Suite 108
Mississauga, Ontario L4V 1X5, Canada
Tel: 905-673-0699 Fax: 905-673-6509

India
Microchip Technology Inc.
India Liaison Office
Divyasree Chambers
1 Floor, Wing A (A3/A4)
No. 11, OShaugnessey Road
Bangalore, 560 025, India
Tel: 91-80-2290061 Fax: 91-80-2290062

Korea
Microchip Technology Korea
168-1, Youngbo Bldg. 3 Floor
Samsung-Dong, Kangnam-Ku
Seoul, Korea 135-882
Tel: 82-2-554-7200 Fax: 82-2-558-5934

Singapore
Microchip Technology Singapore Pte Ltd.
200 Middle Road
#07-02 Prime Centre
Singapore, 188980
Tel: 65-6334-8870 Fax: 65-6334-8850

Taiwan
Microchip Technology Taiwan
11F-3, No. 207
Tung Hua North Road
Taipei, 105, Taiwan
Tel: 886-2-2717-7175 Fax: 886-2-2545-0139

EUROPE
Denmark
Microchip Technology Nordic ApS
Regus Business Centre
Lautrup hoj 1-3
Ballerup DK-2750 Denmark
Tel: 45 4420 9895 Fax: 45 4420 9910

France
Microchip Technology SARL
Parc dActivite du Moulin de Massy
43 Rue du Saule Trapu
Batiment A - ler Etage
91300 Massy, France
Tel: 33-1-69-53-63-20 Fax: 33-1-69-30-90-79

Germany
Microchip Technology GmbH
Gustav-Heinemann Ring 125
D-81739 Munich, Germany
Tel: 49-89-627-144 0 Fax: 49-89-627-144-44

Italy
Microchip Technology SRL
Centro Direzionale Colleoni
Palazzo Taurus 1 V. Le Colleoni 1
20041 Agrate Brianza
Milan, Italy
Tel: 39-039-65791-1 Fax: 39-039-6899883

United Kingdom
Arizona Microchip Technology Ltd.
505 Eskdale Road
Winnersh Triangle
Wokingham
Berkshire, England RG41 5TU
Tel: 44 118 921 5869 Fax: 44-118 921-5820
03/01/02

2002 Microchip Technology Inc.

Anda mungkin juga menyukai