June
1998, Issue 95
Gotchya!
Alarming
the Alarm System
by
Steve Ciarcia & Jeff Bachiochi
Fancy
Footwork
As
I mentioned, its easy to say its just a
matter of software when you dont have to write
it yourself. One of the more challenging aspects of
the software was catching the key presses while doing
all the other system functions.
This
task was accomplished via the BASIC-52 ONEX1 command.
This interrupt command temporarily redirects the normal
program flow to a special subroutine.
ONEX1
is triggered by a high-to-low transition on Dominos
INT1 input pin. Obviously, it should be reserved for
a high-priority function. Listing 1
illustrates the high points.
The
piezo beeper output connects to INT1. When ONEX1 is
triggered, the routine samples the I/O port where all
the row and column data is connected to the Domino.
This beeper interrupt can occur during either phase
of the row drivers.
To
ensure the sample is valid, the program checks whether
there is a high level on at least one column input line.
If none of the first three bits are high, we assume
its the wrong phase and take another sample. Once
there is a valid sample, the row driver levels (indicating
the two phases) can be compared with the column inputs
to determine which of the 12 keys was pressed.
Before
leaving the interrupt routine, there are two more tasks.
First, save the key-press code into the data-logging
buffer and increment the buffer pointer. If the on/off
key was pressed, a time/date stamp is added to the log.
Finally,
we need to make sure the physical key-press action has
ended (to prevent interrupt on the same key press).
This is accomplished by repeatedly sampling the port
and looking for invalid data (columns all low) on both
phases of the row driver outputs. When RETI is executed,
the program resumes where it left off.