Professional Documents
Culture Documents
by Christopher W. Tullar
MASTER OF SCIENCE
in Applied Physics
December, 2001
A Simplified Linear Refreshable Braille Display
December, 2001
Approved By:
__________________________________________
Thomas L. Rokoske, Ph.D.
Chairperson, Thesis Committee
__________________________________________
J. Sid Clements, Ph.D.
Member, Thesis Committee
__________________________________________
Brian W. Raichle, Ph.D.
Member, Thesis Committee
__________________________________________
Anthony G. Calamai, Ph.D.
Chairperson, Department of Physics and Astronomy
__________________________________________
Judith E. Domer, Ph.D.
Dean of Graduate Studies and Research
Copyright by Christopher W. Tullar, 2001
All Rights Reserved
A Simplified Linear Refreshable Braille Display
Christopher W. Tullar
Abstract
A linear braille display has been developed which is simple in design so that it
may be of low cost. The display is activated by movement of the hand and automated by
the use of an 8051 microcontroller. The braille display uses a 40-cell line composed of
design developed at ASU. These cells are the same size as used in braille books, so they
are easy to read. Text to be read is first converted to an ASCII document, and then
downloaded to the braille display for reading. The instrument uses sound to guide the
iv
Acknowledgments
I would like to thank my thesis advisor, Dr. Tom Rokoske, for starting the
refreshable braille display projects at ASU, giving me something neat to do for a year,
and for his willingness to help on every occasion I asked for it. Mr. Robert Miller
deserves a great deal of thanks for his constant help in the mechanical design process, his
excellent machining skills, and his dedication to make room for my schedule. I would
also like to thank Dr. Sid Clements, who helped at troubleshooting software, gave ideas
for electronic hardware, and let me all but live in his computer lab. I wish to thank
Graduate Studies and Research at ASU for the grant that partially funded my project.
Thanks to Guardian Electric, who donated the solenoids used in this project. Thanks also
to Mr. Josh Hastings who seems to always save the day. Thanks to Mr. Mike Abaray
who did some footwork and sent me a huge history on braille displays. And I would
finally like to thank my wife Raeleen, who helped me with the thought process, helped
v
Table of Contents
Page
List of Figures……………………………………………………………….……...viii
Chapter 1: Introduction……………………………………………………………. 1
1.1 Braille……………………………………………………………….……….. 1
2.1 Pinboard……………………………………………………………………… 12
2.2 Solenoids……………………………………………………………………...13
2.7 Shuttle………………………………….…………………………………….. 19
2.8 Eraser………………………………………………………………………… 20
3.1 SBC-51………………………………………………………………………..21
vi
3.2 Optocouplers………………………………………………………….……… 22
3.5 Speaker………………………………………………………………………..23
3.6 Handshaking…………………………………………………………………. 23
Chapter 4: Software…………………………………………………….…………. 24
25
4.7 Sound………………………………………………………………………… 30
4.9 Testing………………………………………………………………………...32
Chapter 5: Discussion……………………………………………………………... 34
5.2 Problems……………………………………………………………………... 36
References…………………………………………………………………………..38
vii
Appendix A: Mechanical and Electronic Schematics……………………………...39
Vita…………………………………………………………………………………..66
List of Figures
viii
5-1 The Finished Refreshable Braille Display……………………………………. 34
ix
Chapter 1: Introduction
1.1 Braille
Perhaps the most significant invention bestowed upon the blind has been braille.
This international system of reading for the blind has endured for over 175 years without
significant rivalry from any other form of written communication. Braille is found at
automatic teller machines, elevators, hospitals, on public signs and menus, and many
Before the advent of braille, the blind read ordinary letters in relief. This method
was cumbersome and difficult to read quickly. However, around 1824 in Paris, France, a
code that used cells made of six easily producible dots. He was directly influenced by a
new code shown to him by a French artillery captain Charles Barbier. The captain had
developed what he called “night writing” for messages delivered in the dark within the
army. He almost immediately tried to make it accessible to the blind under the name of
“sonography” and in doing so met Louis Braille, who developed the idea into what is
Despite the ease of creating braille cells with the proper tools, it soon became
apparent that transliterating every letter (English or otherwise) into braille was going to
be a problematic practice. The characters could not be the same size as written text
because of the resolutional capability of the average human fingers. So they were made
1
2
larger and their size became standardized for the most part (the Japanese have slightly
smaller characters).2 This meant that a page of braille was immensely larger than a page
of standard written text. Also, braille could only be written on one side of a page because
the dots were punched from the reverse side. So, to contain the same information, a
braille page would have to be four times as long and three times as wide as a printed
page. Naturally, a page that size would be hard to handle, very tedious to transcribe, slow
letters, as well as many words, were assigned their own characters, or groups of
efficient to read. This new contracted braille was dubbed Grade II braille and is the type
most widely used today. Thus, the uncontracted form of braille became Grade I.3
Some criticize Grade II of being arcane and difficult to use. There are many
nested rules regarding when contractions should be used and several common symbols
are not represented. Early on, many of the contractions were created in direct relation to
Christianity, because a main focus was enabling the blind to read the bible, and many
today feel that too many contractions were used for this practice. There are many other
codes in existence and people are constantly working on new ones. Most of the current
projects involve eight-dot cells and include characters to enable the blind to read
mathematical and other non-Latin symbols. It should be noted that even with contracted
braille, a book that could fit in a pocket in printed text form would be several large
Braille can be produced in several ways. The simplest form is with a slate and
stylus. In this method, the braille is manually embossed into paper with a stylus. Using
guide depressions, the stylus presses the paper into depressions on the slate.
Unfortunately, this method requires writing backwards because the braille is embossed
more modern and rapid way to produce braille is with a braille printer. In this case a
computer sends the printer information and the printer embosses the braille on a page.
This is usually done with a lot of pressure, sometimes up to ten tons per braille cell!4
Many braille printers, called interpoint printers, can emboss braille on both sides of a
page by adjusting spacing on each side. The main disadvantage to braille printers is that
they are very noisy. They routinely produce noise at levels of 70dba or more.4 Many
models on the market today have sound-attenuating hoods to reduce noise. Finally, there
is the refreshable braille display, which is a device that produces braille electronically by
raising and lowering pins which correspond to cell dots. Since this is the main concern of
Refreshable Braille displays were first introduced in the mid-1970’s and were
electromechanical displays that used tiny solenoids to move the pins. By the late 1970’s,
piezoelectric displays, first introduced by Oleg Tretiakoff, were on the market. The
piezoelectric cell consists of a small ceramic substrate which, when around 200 volts is
applied, bends and activates a pin. These actuators are small, which is preferred, but they
are expensive. The first mass produced display, the VersaBraille, was based on his
4
design and manufactured by TeleSensory in the early 1980’s, and by the end of the
Figure 1-1: Refreshable Braille Displays – 20, 40, and 80 Cell Models6
find a cheaper alternative to piezoelectric technology. One idea was a moving braille
cell, tried by IBM, which slid along a track and merely punched braille into the finger.
This was deemed unacceptable because the movement of the finger over the braille is
important. In another prototype, dots were pressed into a moving belt of Mylar and then
pressed flat again after being read. This was tried more than once by separate companies,
but was rejected because the Mylar wore out too quickly, was noisy, and felt unnatural.
The pneumatic display was also a promising technology which was abandoned. One
attempt at cost efficiency called the BrailleMate (TeleSensory) eliminated all but one
cell.5 In the early 1990’s, more experimental methods were being tried, mainly fluids
technology and with materials which change their integrity when a voltage is applied.
And then there are the rotating display ideas. In this technique, the fingers remain
stationary and the braille, constantly being refreshed, moves underneath. Only three
prototypes were accounted for in the research for this paper. Two rotating disk displays
5
Maryland, uses a rotating drum with the braille cells on the perimeter of the drum. This
machine uses stationary solenoids to punch specially designed pins into one of two states,
up or down.7
Of the braille displays that exist on the market, the most important and
competitive features are those that involve navigation through a screen of text. Some of
the newer models use two-dimensional navigational control, where horizontal and
though not replacing the reading of braille, is becoming a standard in technology for the
blind. In the refreshable braille display, however, speech synthesis is usually confined to
simple messages giving information about text attributes or graphics located at the cursor
position. 8
Xiong Lu’s prototype was built at Appalachian State University and completed in
1993. This showed that a display was feasible in which the actuators remain stationary
and the pins move above them by means of a rotating disk. This display has only two
refreshable cells which are larger than standard braille cell size, and its operation is
relatively slow. The cells are held in place by means of a spring mechanism. One
optocoupler sensor informs the computer that the six solenoids are in line with the pins
and a character was formed on the display. This machine is an external apparatus driven
by an IBM PC.9
consists of 36 braille cells lining the perimeter of a rotating disk. The pins, which
correspond to the individual dots, are held by magnetic attraction in a rotating disk.
Holes were drilled through a piece of flexible magnetic material sandwiched between two
pieces of plastic. The pins were inserted into the holes and were kept from falling by
means of being attracted to the wall of the hole. This is by no means a bistable
mechanism, which would be ideal, but greatly simplified the machining of the pin and
7
proved to be effective. This method had two drawbacks however, both related to the
instability of the material. First, the flexible material is difficult to machine, making the
holes very tedious to drill and leaving the end result less than accurate. Second, it
absorbs moisture and swells. When the machine was examined three years after its
completion, nearly all of the pins had to be worked into moving condition again.
In Bruce Stansell’s prototype, six optocoupler sensors determine when one of the
software available through the American Federation of the Blind. The encoded dot file is
then transmitted to the braille display. The user can scroll 50 or 150 cells at a time, and
there are also the options of scrolling by word or sentence. The display can insert
bookmarks to save the reader’s place in the file. This prototype includes a keypad
interface, LCD display, both serial and parallel ports for PC interface, and adjustable disk
speed control. Software is contained both on-board the display and on the IBM PC.
Maximum reading rate is one hundred fifty cells per minute, or, using an average word
As sophisticated technology makes braille easier to produce, the blind are faced
with the unavoidable problem of high cost. Currently braille printers cost from $1,700 to
$80,000 and refreshable braille displays cost from $3,500 to $15,000 (usually around
$5,000 per 40 cells).11 Unfortunately, most visually impaired people can’t afford these
prices and the available machines are limited mainly to business and educational uses.
The current project and many others are dedicated to making affordable braille displays
The goal for this thesis was to create a greatly simplified in-line refreshable
braille display which is reliable and easy to use, using the fewest, most cost-efficient
parts. The following are the desired features for the proposed display:
Due to the size limitations of the actuators used in most braille displays, the cells
are larger than standard size. Since the blind prefer to read standard cell size and spacing,
this machine should ideally have these characteristics. This has been shown possible by
Stansell’s prototype.
Dependable Pinboard
An innovative concept in Stansell’s display was to use a magnetic material to hold the
braille pins in place. Holes were drilled through a flat vinyl magnet and the pins were
inserted through the holes.10 Unfortunately, the material which was chosen was rather
unstable and subsequently became brittle and left residue on the pins. When the machine
was examined after several years of not being used, it was found that many braille pins
were locked fast and required considerable pressure to free them. It should also be noted
that machining the holes was difficult and at the end of the project no suitable lubrication
had been found to improve the stability of the pinboard. So without question this method
Shuttle
of a shuttle which will move the solenoid carriage underneath the braille pins with the
movement of the hand. The shuttle is to be similar in size and function to a computer
9
mouse, and its linear position will be slightly offset from the solenoid carriage so that
There are several benefits to the use of a shuttle. Besides reducing cost, noise
(mechanical and electrical), and software, it would also ease navigation and spacial
orientation within a document. This could be done by adding several buttons to the
shuttle, similar to those on a mouse. Two buttons will be used for scrolling back and
forth through the document, and in a more advanced version, a third button could be
added to act as a left mouse click, for example. This feature would eliminate the need for
“touch dots” which are sensors situated above each braille cell in many commercially
If the proposed braille display system is to be thought of in analogy with a dot matrix
printer, with solenoids making up the “print head”, several disadvantages come into view.
In order to provide a maximum reading rate of 100 - 200 words per minute, a fast motor
would be needed to ensure that the user would not have to wait to read a line. This would
require more software, more hardware, and therefore more complexity and cost. It would
Three actuators
There will be a carriage on which the solenoids travel beneath the pins. The
solenoids will strike the pins at designated times determined by the exact position of the
solenoid carriage. However, horizontal travel only requires three actuators, as there are
three rows of dots. So the solenoid carriage need only house three solenoids. Compared
to commercial displays, this saves 237 parts! Compared to Stansell’s prototype, this
Speed
Average braille reading rates are under 100 words per minute in Grade II braille,
and most common rates are from 50 - 70 words per minute. However, some can read
over 300 words per minute, which if read aloud would be very fast speech.12 Since an
ASCII to Grade I translator will be used, producing one hundred words (around 500
20% longer than Grade II, so it would take 20% longer to read.13 The maximum speed
of this machine in Grade I is expected to be at least one hundred fifty words per minute.
A software “governor” will be added to protect the hardware in the event that the
On-board translator
The device will have an on-board translator which will translate ASCII into Grade
I braille. This feature will maintain the machine’s independence and make the system
easier to operate. In text-editing modes, many braille displays switch from Grade II to
is used so the user can read each character on the screen when editing text. However, this
is not comfortable to read. Translating ASCII to Grade I avoids the contractions and
exceptions of Grade II, but comes with its own set of exceptions, which will have to be
taken into consideration. These will be discussed in further detail in the software
implementation. Admittedly, Grade I is also not completely comfortable to read, but will
be used for this prototype due to the massive amount of software required for a Grade II
• Ease of use
PC and start up without need for a technical tutorial. Whenever possible, messages such
as “too fast”, “buffer full”, etc. will be conveyed by a sound. It should require as little
setup on the PC as possible. There should be one simple connection to the serial port of
the computer and when the power is turned on the braille display will await information
The mechanical hardware was built from the pinboard outward so each part could
be built referencing the previous part, the most important reference being the fixed
location of the pins. When possible, lightweight materials such as aluminum and PVC
were used. This is especially important for the moving carriage assembly which should
reader.
2.1 Pinboard
Improving the stability of the pinboard was a major goal of this project. The
pinboard is the mechanism which holds the braille pins in place. Several non-magnetic
methods were attempted, but the final solution involved ceramic magnets. Holes of .0625
inch diameter were drilled through two thin plates of low carbon steel, chosen for its
ferromagnetic properties, and the pins were fitted through the two layers. The pins were
turned from steel welding wire, which also has optimal ferromagnetic properties.
Ceramic magnets were placed between the two layers, on either side of the pins. Since
the ceramic magnets have higher magnetic strength than the flexible magnetic material,
their close proximity to the pins is enough to pull the pins to the sides of their holes and
hold them in place. The magnets are kept from touching the pins by means of recessed
shoulders which were milled into the top steel layer (shown in Figure 2-1). Before the
final pinboard was assembled, the steel plates were treated chemically to prevent
potential rust damage. The final pinboard of 40 braille cells contains 240 pins and is
highly stable.
12
13
Figure 2-1: Pinboard Cross-section. The ceramic magnets (dark areas) are sandwiched
between the two layers of low-carbon steel, and the pins fit through the center.
2.2 Solenoids
Solenoids were chosen for the highest impulse and speed. It was calculated that a
maximum reading rate of 200 words per minute, which is in excess of the original goal,
would allow a maximum total stroke time of around 24 ms. The solenoids were therefore
tested using a 10 ms pulse, assuming that the downward stroke of the plunger would take
longer than the upward stroke. In addition, a translational mechanism would be needed
to raise the pins, which are separated by only 0.10 inch, while the centers of the
solenoids are 0.50 inch apart. The energy absorbed from the solenoid stroke by the
translational mechanism had to be taken into consideration when choosing the proper
solenoid.
The Guardian T-3.5X9 DC 24V solenoid was chosen for high speed, strength, and
small dimensions. Modifications were made to prevent the plunger from sticking to the
solenoid cavity at the top of its stroke and to keep it from dropping from the solenoid at
the bottom of its stroke. Small aluminum collars were machined and fitted to the bottoms
of the plungers to prevent the plunger cone from striking the interior of the solenoid. A
small plastic plate was used to position the bottom of the solenoid stroke (see Figure 2-4).
14
The strength of the solenoid depends partially on the distance of its stroke, so the plate
The solenoid carriage is responsible for holding the solenoids in place and
translating the centers of the solenoid strokes to the centers of the pins. The mechanical
drawings for the solenoid carriage parts are shown in the Appendix as Figures A-5 (page
46) and A-6 (page 47). The problem with translating this force is overcoming the lateral
torque that will be created about the centers of the solenoids. Merely bending a plunger
tip will not solve the problem because the plungers are free to rotate about their
longitudinal axis. Thus, hitting the pins would be very unlikely. Stabilizing the bent
The translational mechanism is shown in Figure 2-2. It uses two paddles that are
free to rotate about an axis that is 1.5 inches from the centers of the plunger tips. The tips
of the outer solenoid plungers are hinged to the outer edges of the paddles with small
pins, so that the plunger and the paddle will function as a unit. A plunger pushes the
outer edge of a paddle and forces it to rotate upward until the inner edge of the paddle,
equipped with a small striking pin, contacts the cell pin. In this way the torque is
absorbed by the rigid aluminum paddle’s axis, and the energy of the stroke is minimally
affected. The horizontal component of the rotation of the paddle, which is a few
Figure 2-2: Conceptual Drawing of the Solenoid Carriage. The threaded bushings,
which hold the solenoids into the carriage base plate, are not shown. The solenoid
plunger tips are hinged at the outer edges of the paddles, while the middle plunger tip is
extended.
The middle plunger, being lined up with the center pin already, was merely
lengthened to reach the pin. All striking pins are chamfered to allow the striking pins to
be forced back down in the event of a collision with a cell pin. Without the chamfer, the
The plungers are also fitted with small springs (see Figure 2-3) which apply a
constant downward pressure. These springs greatly increase the speed of the downward
stroke as well as reduce bouncing of the plungers off the plastic stop plate.
The solenoids are threaded into brass bushings that fit into 0.5 inch diameter holes
in the base plate of the solenoid carriage. The bushings are held in place with setscrews
so the solenoid position may be adjusted. The height of the pins is ultimately controlled
Figure 2-3: Close-up of the Solenoid Carriage. The restraining springs lie just
below the paddles.
which slides on a pair of parallel rails as the user slides the shuttle. To allow for vertical
adjustment of the carriage, the mounting was made in two pieces that are dovetailed
together to minimize movement in other directions (shown in Figures A-7 and A-8). The
mounting is adjusted vertically by turning two screws whose ends rotate freely in the
bottom surface of the upper part of the mounting. The screws are threaded through the
mounting plate and are thus able to pull or push the upper portion of the mounting. When
the desired vertical position is achieved, a set screw, which is threaded through the back
of the lower piece, pushes the dovetailed pieces in opposite directions, thereby locking
The carriage mounting is also laterally adjustable. A key on the lower part of the
mounting fits into a slot in the mounting plate. The whole fixture may be moved in the
slot by means of another adjusting screw. Two screws fasten the mounting to the
17
mounting plate in the desired lateral position from underneath. The carriage adjustments
Figure 2-4: View from Below the Mounting Plate. Shown above is the plastic
stop plate. In the middle are the adjusting screws for the adjustable mounting. To the
right is one of the Teflon sliders and at the left are the aluminum encoder strips and
optocoupler circuit.
The aluminum mounting plate supports the solenoid carriage rigidly in place with
respect to the rails. It is attached directly to Teflon sliders which move along the rails.
The plate was designed so the shuttle would push it approximately from the center of
mass of the solenoid carriage assembly, thereby reducing torque and friction on the
sliders.
18
Figure 2-5: Conceptual Drawing of the Solenoid Carriage, the Mounting Plate, and the
Teflon Sliders
Optical sensors are used to locate the position of the shuttle. Two are used, one
for each of the two vertical columns of dots in a braille cell. The U-shaped optocouplers
straddle aluminum encoder strips which run the length of the encasing and have slits
Figure 2-6: Optocouplers and Encoder Strips. Seen above the mounting plate is the
horizontal adjustment screw for the adjustable mounting. At left are the wires that power
the shuttle switches.
The sensors are mounted to the underside of the mounting plate and the strips are
attached at the ends to the case, so the optocouplers move and the strips remain
19
stationary. The strips may be adjusted to align properly with the cell placement. The
offset distance between slits is also adjustable using screws that set the strips in place.
2.7 Shuttle
The shuttle consists of a shell made from Sculpey, a modeling material that sets
when baked, and an aluminum frame which is equipped with the two shuttle switches.
The shell was made by making a sculpture of the desired shuttle shape with modeling
clay that was 0.25 inch smaller on every surface than the predetermined shuttle
dimensions. Then a 0.25 inch sheet of Sculpey was laid over the clay model and worked
into shape. Next, the model was baked, hardening the outer layer so the clay could be
removed from the inside. Once fully hardened, the inside of the shell was reinforced with
epoxy.
The shell encloses a small aluminum frame which holds the switches and mounts
the shuttle to the shuttle plate. The switch buttons are elongated with aluminum
extension rods to reach the outer surface of the shuttle. On the inner surface of the shuttle
there is a plate to which the erasing mechanism is fastened. The entire shuttle assembly,
complete with erasing mechanism, is screwed through a spacer to the carriage mounting
plate below. The finished shuttle and eraser assembly is shown in Figure 2-7.
20
2.8 Eraser
The erasing mechanism must move the raised pins back to their recessed position.
There are two options to do this: push or pull. Pulling requires a strong electromagnet,
electrical noise. To push the pins down, an arm which is fixed to a plate on the shuttle
reaches to the top of the pinboard and applies downward pressure. To reduce the bulk of
magnet was chosen to provide the necessary downward force to erase the cells. The
magnet is held in place by a cradle made from PVC. This cradle is attached to the shuttle
5V, 24V DC power supply supplies the voltage for both the electronic
3.1 SBC-51
The URDA SBC-51 single-board computer was chosen for ease in development
of the system. The circuit diagram is shown in Figure A-1. It has a serial port, parallel
port, and 16KB of user external memory. It also has three jacks that allow access to the
8155 pins (parallel interface chip) and to the available 8032 port pins. The Timec
12MHz 8032 microcontroller was chosen because it has a third timer, which was used for
21
Figure 3-1: System Electronics
22
23
3.2 Optocouplers
The position of a dot column in a cell is sensed by one of two optocoupler circuits
attached to the solenoid carriage. When an optocoupler passes over a slit in the encoder
strip, light can pass through the slit, thereby exciting a photo-detector which produces an
The circuitry necessary to power the optocouplers was soldered to a circuit board
and attached to the carriage mounting plate. The LED emitter of the circuit, shown in
Figure A-2, uses a 470 Ω current-limiting resistor and the detector uses a 1.5 kΩ load
resistor. When no light is detected by the optocoupler, the detector voltage goes low.
This signal controls a one-shot (74LS123, 74LS122) which produces a 10 ms high pulse
duration. Here a 33 kΩ resistor and 1 µ F capacitor are used as shown in Figure A-3.
When the optocoupler-initiated interrupt has been processed, the braille output for
that cell column is sent out to the 8155 parallel port. Each of these three lines is sent to a
one-shot which outputs a 10 ms pulse (if the input signal was high) to enable a 754410
driver chip, as shown in Figure A-3 (page 44). This chip is triggered by a 5V pulse and
outputs a 24V pulse directly to each solenoid. If two highs were sent in succession to this
circuit, there would only be one 10 ms output from the monostable multivibrator because
it must be first reset with a low. This problem is solved in software by pulsing each
output line low before data transfer, thereby resetting the one-shots.
24
The shuttle switches require debouncing so they may be accurately monitored by the
microcontroller. The simple nand gate latch is shown in Figure A-4 (page 45). As with
the rest of the electronic hardware, the circuitry is localized, so the shuttle requires
3.5 Speaker
System sound is sent directly from port 1 on the 8032 through a 7404 inverter
gate (see Figure A-3) because the inverter has more drive-current capability than the
3.6 Handshaking
RS232 signal voltages. The system uses the chip for transmitting and receiving data, so
there are three lines for RS232 communication, which are transmit, receive, and ground.
However, since a handshaking signal is necessary to control the data flow from the
sending device, an extra line is needed. P1.0 on the 8032 controls the CTS line, which
was hard-wired through the MAXIM’s extra inverter and to pin 5 on jack 1 (RS232
interface).
Chapter 4: Software
The entire program for the display is written in 8051 assembly language. To
make the machine more independent and easy to use, all of the software, including the
translator, is executed solely by the 8032 microcontroller. The memory of the system has
four components: 1) internal 8032 user RAM (128 bytes), 2) external ROM (8K bytes),
which contains only I. Scott McKenzie’s MON51 monitor program, 3) external user
ROM (8K bytes), which contains the custom software for the machine, and 4) external
user RAM (8K bytes), which is used as the input text buffer.
The main objective of the controller software is to input a text file (composed of
ASCII characters), translate it into Grade I Braille, and send the braille output to the
electronic hardware. This is achieved by first storing the ASCII file in external RAM.
The program extracts these stored data one character at a time and translates each byte
into Grade I braille. After a byte is translated, it is stored as encoded braille in a buffer
inside the 8032’s on-board RAM. Finally, the program waits for signals from the cell
position sensors on the solenoid carriage and, when activated, transmits the braille
The program is mostly interrupt driven. When no interrupts are being executed,
the system waits for the reset switch to be pressed or empties the character output buffer,
which will be discussed in the section on the internal buffer. The reset switch is
responsible for initiating the program and subsequently for resetting the shuttle position
as a method of cell position correction. The switch, which is active low, is directly
25
26
connected to a port pin on the 8032 and is depressed when the shuttle is moved to the
extreme left, or the home position, where the cell count is -1.
There are two buffers designated to handle the information in the input file. The
largest buffer, the external buffer, stores raw data from a text file. Its task is to store as
much information as possible, because its size limits how far back the reader can scroll
The external buffer fill executes using the 8032’s serial port interrupt. In this way
a character is stored when it arrives but the system does not exclusively wait for it. This
prevents the system from hanging up when the external buffer is not completely full and
allows the braille display to operate while the external buffer is being filled.
If not hindered, the serial port interrupt subroutine will refill the external buffer,
writing over the stored data, as long as there are incoming data on the receive line. A
handshaking signal must be used to start and stop the data transmission. When the
external buffer is full, the clear-to-send line (CTS) is disabled, forcing the computer to
cease transmission. If an incoming word is incomplete at the end of the buffer, the buffer
will take in more characters until the word is finished or until the end of memory. This is
done to prevent word cutoff at the end of a line. If the file ends before the external buffer
is full, the CTS signal remains high and the system is capable of receiving more data.
The method of filling the internal buffer is shown in Figure 4-2. Characters are
extracted from the external buffer by the “fill” subroutine. Since there is only one
27
external data pointer in the 8032, and all variables are global in 8051 assembly language,
special care must be taken not to destroy the data pointer. For this reason, both the
external buffer and internal buffer store the current value of the 16-bit data pointer in
The fill routine first points to the current external character to be read and sends it
to add one or more number signs, letter signs, or capital signs. For example, if the
sign-cap sign-L-S-number sign-A-B-C. In this case two capital signs indicate that there
is more than one capital letter following, and the numbers are represented with the
number sign followed by corresponding letters. There are several characters which must
be spelled out in grade I such as plus, greater than, etc. In this case, the data pointer is
incremented to the next character as normal and the spelled out translation takes up more
characters in the internal buffer. In fact, one of the reasons two buffers are used in this
program is because Grade I braille takes up more characters than ASCII, and having a
small translated buffer saves more space for the text file in the external buffer.
There is a more concise computer braille code than Grade I or Grade II called the
Nemeth code. This code is often used by braille displays in text-editing modes, but is not
preferable for reading purposes. Most braille displays use Grade II braille, but since a
Grade II translator was not a practical task for this prototype, Grade I was chosen as a
The translated character is stored in the internal buffer as an encoded byte where
the most significant hexadecimal digit represents the information for the left side of the
braille cell and the least significant digit represents information for the right side. For
example, the letter f, which is represented in braille by dots 1, 2, and 4, would be encoded
as 31h, or 00110001b. Each nibble has a maximum of binary 7, or 0111b, which would
correspond to all three solenoids being fired. This system of encoding leaves two bits
unused, which could be utilized for an eight-dot braille code. A half-cell is output by
stripping off one of the encoded nibbles and sending the remaining byte to port A on the
8155.
Figure 4-1: Braille Cell Encoding Byte Translation. A) The dot numbers in a
braille cell. B) The letter f represented by dots 1, 2, and 4. C) Left and right cell-halves
encode into binary 3 and binary 1 respectively.
The internal buffer holds 40 characters of data. However, at the end of a line the
fill routine checks to see if a word has been cut off. If so, it erases the incomplete word
and decrements the data pointer so the word will be printed in its entirety on the next line.
If in the middle of an internal fill, the end of the external buffer is encountered, the
remainder of the internal buffer is cleared and the CTS is enabled so the external buffer
may refill. This is done because the fill routine can take in characters much faster than
external fill routine can input characters (2400 baud). Word cutoff is eliminated in this
29
case by the external fill subroutine, because as mentioned before, the external buffer
Figure 4-2: Filling the Internal Buffer (current forty cells of braille).
There are only two external interrupts on the 8032, denoted here as left and right.
In this program, they are used to tell the system when to output a character and to keep
track of the shuttle position. The left interrupt corresponds to the left column of three
dots (1,2,3) in a braille cell and the right interrupt corresponds to the right column (4,5,6).
As the shuttle moves, it causes two sets of optical sensors to pass between two sets of
slits that each correspond to a cell column. When a column’s slit is encountered as the
Both interrupts are used for cell position sensing so the direction of shuttle
movement may be known. A boolean flag, f0 is designated for this purpose. Each
interrupt complements the value of the flag (1 or 0) and the left interrupt decides in which
direction the shuttle is moving. Let’s say the left interrupt is executed and the shuttle is
moving forward (to the right). First, the interrupt routine complements f0. If f0 = 0 after
30
complementing its value, the shuttle is perceived to be moving forward. Now if the same
interrupt is executed before the right interrupt has complemented f0 to 1, then the left
interrupt will complement f0 back to 1 and perceive this as a change in direction. This
process is illustrated in Figure 4-3. This only works if the shuttle starts from a known
position. So the shuttle must be moved to the home position to begin reading.
Figure 4-3: Cell Direction/Counting Method A) Left interrupt executes and the
display is moving forward. B) The right interrupt executes, neither count nor direction
changes. C) Left interrupt; count changes direction does not. D) The left interrupt
executes. Since no right interrupt was detected, direction must have changed.
When the shuttle is moving forward, the machine is outputting the information of
the current line of braille being read. When it is moving backward, there is no output,
because the information is still on the pinboard. A timing system ensures the shuttle does
not move too fast for the solenoid stroke while moving forward (the maximum reading
rate of the machine is dependent on the response time of the full solenoid stroke). If the
machine were to read faster than the maximum speed, hardware damage could occur.
When each external interrupt is executed, a timer loaded with a predetermined value is
set. The value is easily changed at the beginning of the program. If the next interrupt is
31
executed before the timer has finished counting, the interrupt has been requested too
early. Though cell count and direction will continue to be updated, there will be no
The external interrupts are also responsible for keeping count of which cell is
being read. Each time a new cell is encountered the count is changed. When the reader
comes to the end of a line (cell 40), the last external interrupt refreshes the internal buffer
so the next line of text is ready. Then, as the shuttle is moved back toward the start
position, the cell count is decremented. If the shuttle were to move forward at a point in
the middle of the line, the middle of the newly refreshed line would be the output.
The shuttle is equipped with two document navigation buttons, which may be
used to scroll through the document by line or by page. Since there are no remaining
external interrupts and high-speed response is not required, a polling timer interrupt is
used (Timer 2 on the 8032). This timer interrupts the program and checks the two
switches every 50 ms, so no delay can be detected by the user when a switch is pressed.
If a switch has been activated, the subroutine for that switch is called and executed.
Using one of the timers, the depression of the switch is timed. If the switch is depressed
and released quickly (within a half-second), the machine will scroll by line. If the switch
is held down for longer, the machine will scroll by page. Using a polling sequence also
leaves room for more user switches to be added in the future, such as right and left
4.7 Sound
primarily used for testing the software (no debugging software was used), but some
sounds remain in the final product. All sounds were made using two timers, Timer 0 and
Timer 1. Since there are only three timers, Timer 0 had to be “borrowed” from the serial
port. Because there are never any sounds activated during an external fill, borrowing the
timer will never pose a problem. One timer determines frequency and the other
determines note length, and all tunes are composed in their playing order in a lookup
table. There are several important sounds to listen for. A click means that the shuttle has
returned to its home position. A short “wip!” means that the internal buffer has filled and
a long “bwwwiiiip!” means the external buffer has filled. When scrolling forward by
page, “Shave and a Haircut” tells you that the buffer limit has been exceeded.
simultaneously outputs braille to the display through the parallel port and text to a
monitor through the serial port. In fact, the braille output is translated back to text
directly using a separate lookup table. Examples of characters sent to the screen are
shown in Table 4-1. It must be translated from the braille output because the braille is
different from incoming text, and in this way each cell may be viewed in text form
(number sign, capital sign, etc.). Each time the internal buffer is filled, the data pointer
location is loaded into the character output buffer and each time there is a braille output
during an external interrupt, its translated ASCII character is loaded into the buffer.
33
When the interrupt has finished execution, the main program empties the character output
buffer.
Because the serial port interrupt is executed when either the transmit or receive
flag is set, the transmission of data to the monitor is not entirely straightforward. Another
boolean flag was created, called “key”, which is set when the transmit flag executes the
serial port interrupt. Using this flag in the character-send subroutine, the character may
Another problem encountered was that only one character was transmitted during
an interrupt, but more characters could be transmitted after the interrupt was finished
executing. Since all characters transmitted occur during the external interrupts, a method
to work around this problem was needed. The solution is to fill a small character output
buffer during the interrupt and empty the buffer to the monitor after every interrupt. If no
characters are sent to the buffer, then none will be sent to the monitor. This is achieved
by incrementing the pointer called “obuff” when a character is added to the buffer and
decrementing it when a character is emptied. This way, if the number is zero upon
4.9 Testing
During most of the software development, the braille display had not yet been
constructed. Since no debugging software was used, several methods of testing the
software were implemented. Sounds and transmission of data to the external monitor
were useful methods of debugging, but in order to study the interrupts and the outputs in
real-time use, a testing apparatus was needed. The apparatus consisted of two encoder
strips, two optocouplers, and the reset switch (see Figure 4-3). The encoder strips were
attached to the outside of three strips of plywood of the same width but different heights
in such a way that the middle strip of plywood would act as a runner and the plastic strips
were spaced apart from the middle piece of plywood enough to slide between the
optocouplers (Figure 4-3, right). Finally, a wooden base was fitted with two strips of
wood to create a slot for the runner and encoder strips to slide through. The reset switch
was attached to the wooden base. When in use, the encoder strips moved and the
optocouplers remained stationary. Three LEDs on the output control circuit board
allowed the braille output to be monitored, and thus the final machine could be simulated.
The refreshable braille display created for this thesis has successfully met the
without cumbersome external hardware or fragile wiring. The machine has one simple
serial connection to the host computer and when it is powered, it awaits a text file. After
a text file has been sent, the user merely moves the shuttle to the home position and
Standard cell size was achieved with the idea of a translational mechanism using
paddles that are free to rotate on a fixed axis to reduce torque and friction. The end effect
was that all of the striking pins are 0.10 inches apart. The cells on the pinboard are
spaced to meet standard cell size and spacing. This is the first machine at Appalachian
35
36
The pinboard is a highly stable device and was relatively simple to machine. It
was also made from inexpensive materials. The solenoids chosen were the fastest
available and have no trouble moving the pins to the desired height of 0.02 inch. Once
the pins are up, they may be read many times without being pushed back down. The
Alnico magnet easily erases the cells with downward force provided by the magnetic
Only three solenoids were used which further simplified the design and made the
solenoid carriage much less expensive to construct. Using three solenoids instead of six
should only slightly slow down the device because the critical governor of speed is the
time of the return stroke of the solenoids. At just over the maximum speed of the braille
display, the striking pins collide with the cell pins, thereby altering the performance of
The solenoids perform very quickly, even equipped with springs and fastened to
the aluminum paddles. The reading speed of the machine was calculated using an
oscilloscope to measure the time between cells when the solenoids were being activated
at every opportunity and the shuttle was moving at a maximum speed. The desired speed
of the machine was at least 150 words per minute. Using an average word length of five
characters, it was calculated that the machine performed at rates up to 200 words per
minute. The speed governor in the software is set according to this maximum mechanical
The shuttle is a very efficient way to reduce cost and to simplify the machine. It
prevents the need for a motor and drive system that would be associated with it, and it
makes navigation through the document convenient. At the time of this writing, a blind
37
user has not tested the machine. The two possible drawbacks are that the shuttle may
cause fatigue to the reader and it is not a simple way to read. The shuttle was designed to
be relatively ergonomic, but due to time constraints and distance, no visually impaired
people were consulted with an actual model of the system. If the system is deemed
difficult to use in its present state, then it may be redesigned for use with an idle hand or
The onboard translator stands as a very efficient way of dealing with the text. It
prevents the need for any external software which makes the machine easier to use and
faster to set up. Even though it is only a Grade I translation, the translation subroutine is
the largest section of the program. An ASCII to Grade II translator would be a large
program, but the only requirement to implement it would be more system memory.
Ease of use was a main concern for this project. Its simple connections and
5.2 Problems
The friction noticed as the shuttle moves back and forth is higher than was
collars were considered for their very low friction. However, with
The optocoupler/encoder strip combination works fairly well, but because of the
resolutional limitations of the optocouplers, the cell direction often becomes confused,
causing the machine to write backwards. More precise optocouplers should solve the
38
problem. If not, it may be necessary to have a direction sensor that would constantly
Finally, because the striking pins are positioned ahead of the reader’s hand, the
shuttle must move past the beginning of the braille line to align the solenoids with the
first cell and activate the reset switch. There is no solution to this but it remains to be
The next step for this refreshable braille display would be to use it in a text-
editing situation. In this case, the shuttle would become a much more useful device,
because it could be used like a mouse to select the cursor position or other options. When
editing text, the braille output would change to the Nemeth Code. A Grade II translator
for reading mode would be essential for a more natural reading environment. The
References
1. Roblin, Jean, The Reading Fingers, Life of Louis Braille, 1809-1852, (New York:
American Foundation for the Blind, 1955). pp. 32-35.
3. English Braille, American Ed., (Louisville, KY: American Printing House for the
Blind, 1994).
4. Enabling Technologies Company, “Tools for Braille Power 1996”, 3102 Jay Street,
Stuart, FL 34997.
5. Blazie, Dean, “Refreshable Braille Now and in the Years Ahead”, Braille Monitor,
43(1) (National Federation for the Blind, 2000) pp. 1-6.
10. Stansell, Bruce, Design and Development of a Cost Efficient Braille Display,
(Appalachian State University, 1997) p. 69.
11. AFB National Technology Program, Braille Technology, (American Foundation for
the Blind, 2000) pp. 1-2.
12. White, Jerry, Building Braille Reading Speed: Some Helpful Suggestions,
http://nfbn.inetnebr.com/student/NABSinfo/Braille.htm.
13. Private communication, Elinor Pester, American Printing House for the Blind.
14. MacKenzie, I. Scott, The 8051 Microcontroller, (Prentice-Hall, 1999) pp. 210-212.
APPENDIX A
40
41
System Software
53
54
;----------------------------------------------------------------------------
;Cmain.asm
;Chris Tullar
;July 5, 2001
;The following segments work:
; Xbuffer modified to do its job without hanging up by using the
; 8051’s evil serial port interrupt. Waits for character input and is
; open to take interrupts at any time. Characters may be sent to the screen
; for display purposes by using the obuffer during an interrupt. The outchr
; routine may only be accessed by the serial port interrupt. Essential to
; OUTCHR being used by OEMPTY is the 'key' bit. This is set by the SPISR
; upon a high TI flag.
; The internal buffer is used exclusively by the FILL routine. This
; routine translates information from the dptr into grade1 braille using the
; GRADE1 routine (ASCII to braille translator) and stores it in the internal
; cell buffer. Also included in the routine is the ability to wrap words to
; the next line (discarding words that will not fit on the current line).
; The external interrupts (EX0ISR and EX1ISR) have four functions. They
; determine the shuttle direction, output three bits of braille information
; per half-cell, keep count of which cell is being activated, and decide when
; to fill the internal buffer. These interrupts are activated when the begin
; switch is activated. This is initially for reference and subsequently for
; error checking and reinitializing.
; The TUNE routine controls the system sounds. It uses TR0 and TR1 for
; frequency and note length, respectively. The notes to be played are
; selected, as well as speed. Included in reportoire: Shave and a Haircut.
; REHASH is a simple routine to translate braille to ASCII. This is for
; monitor display purposes and allows to see just what is in the internal
; buffer without reading braille. Symbols have been designated for number
; sign, capital sign, etc.
; T2ISR is the polling interrupt initiated by timer2. Its tasks are to
; monitor the fast forward and rewind switches about every 20ms. FF and RW
; subtract or add 40 to the current dptr position. FFPAGE and RWPAGE add
; or subtract a page (about 25 lines of braille). NOTE!: the numbers viewed
; on the screen for the dptr will differ from expected values because the FILL
; routine ignores words it cannot complete, making each line fewer than 40
; characters total.
; Note: interrupts may be interfered with by electrical noise in the
; system. Easy on the software.
;----------------------------------------------------------------------------
$MOD52 ;file including 8032 commands
decdptr macro ;decdptr macro
dec dpl ;decrement low dptr byte
mov r7, dpl ;move to r7
cjne r7, #0ffh,$+4 ;if underflow to ff
dec dph ;dec high byte also
endm ;end of macro
showdptr macro
mov a, dhigh ;look at dph/dhigh
call show
mov a, dlow
call show
endm
showcell macro
mov a, @cell
call show
endm
pushdptr macro ;push dptr macro
push dPH
push dPL
endm
popdptr macro ;reverse order of push
pop DPL
55
pop dPH
endm
cts macro
clr p1.2 ;p1.2 activates the cts signal
endm ; it is connected to the MAXIM
ncts macro
setb p1.2 ;opposite of clear to send
endm
pushcell macro ;push the value of cell
mov a, cell
push acc
endm
popcell macro ;pop the value of cell
pop acc
mov cell, a
endm
return macro
mov a, #0dh
call ofill
mov a, #0ah
call ofill
endm
inchar macro
mov a, sbuf ;read character into a
mov c, p ;set p for odd parity in a
cpl c ;complementing indicates if error
clr acc.7 ;strip off parity
endm
;------------------------INTERNAL BUFFER-------------------------------------
dseg at 40h ;put in data segment (absolute, internal)
length equ 40
buffer: ds length ;40 bytes reserved
;------------------------EXTERNAL BUFFER-------------------------------------
xstart equ 9500h ;external buffer starting at 9000h
xlength equ 300h ;109h ; extending to the end of memory
xseg at xstart ;set up an external data segment
xbuffer: ds xlength ;'buffer' represents 9000h
;-------------------------OUTCHR BUFFER--------------------------------------
;this buffer is to eliminate the problem of not being able to output
;a character during an interrupt. This way the serial port interrupt may
;be used to output up to ten characters to the screen after an interrupt
dseg at 73h ;internal buffer starting at end of 'buffer'
olength equ 10 ; CANNOT start at 69!! messes with memory
obuffer: ds olength ;end is at 6Bh + 10d = 75h
;----------------------------------------------------------------------------
cseg at 8000h ;without this, code isn't recognized
ljmp main ; only after a data seg has been set
ljmp ex0isr ;jump over interrupt vectors
ljmp t0isr
ljmp ex1isr
ljmp t1isr
ljmp spisr
ljmp t2isr
org 8050h
;--------------------------DIRECTIVES----------------------------------------
;bank zero registers r0-r7
cell equ r0 ;braille cell pointer
obuff equ r1 ;obuffer pointer
; r3 ;obuffer place-keeper
bdata equ r4 ;data in external buffer
dlow equ r5 ;dpl gets saved in this
dhigh equ r6 ;dph gets saved in this
; r7 ;open for frequent destruction
56
execute: jnb begin, lo ;THE ENTIRE PROGRAM WILL INTERRUPT THIS LOOP
call oempty ; waiting on begin switch(active low) and
sjmp execute ; and outputting characters with oempty
lo: clr f0 ;clear direction flag for braille cells
setb tf0 ;tells interrupt not too fast at first
mov cell, #(buffer-1) ;so the first interrupt increments to start
setb ex0 ;now we are ready for external interrupts
setb ex1 ; Play ball!
sjmp execute ;wait to be interrupted by exs, tr2, sp
;****************************************************************************
; SUBROUTINES AND INTERRUPT SERVICE ROUTINES ;
;****************************************************************************
;-------------------RECEIVE OR TRANSMIT A CHARACTER--------------------------
outchr: mov c, p ;put parity bit in c flag
cpl c ;change to odd parity
mov acc.7, c ;add character code
jnb key, $ ;key is set by the sp interrupt
clr key ; ti alone will NOT do the trick!
mov sbuf, a ;send character
clr acc.7 ;strip off parity bit
ret
ofill: mov @obuff, a ;send character to obuffer spot
inc obuff ;go to next spot
inc r3 ;r3 keeps track of where we are
ret ; and leaves it at that value
oempty: cjne r3, #0, oyes ;if r3 is zero then leave subroutine
ret
oyes: mov obuff, #obuffer ;start at beginning of obuffer
o2: mov a, @obuff ;move contents of obuff to a
call outchr ; and output to the screen
inc obuff ;go to next obuffer location
djnz r3, o2 ;decrement until start of buffer
mov obuff, #obuffer ;initialize character-out buffer
mov r3, #0 ; with these two lines
ret
;----------------------------DISPLAY BYTE------------------------------------
;displays a byte held in the accumulator in ASCII form
show: push acc ;save byte
swap a ;swap nibbles in the accumulator
anl a, #0fh ;erase upper nibble
orl a, #30h
cjne a, #':', $+3 ;see if number or letter
jc show1 ;if less than 10, use 3xh
add a, #7 ;make it a letter
show1: call ofill ;output high nibble
58
reti
;f0=1>backwards for ex1, f0=0>forwards!
ex1isr: ;for right three dots (4,5,6)
cpl f0 ;toggle direction flag
jb f0, nok ;if going backwards no output
jb tf0, ok ;if the timer flag is not set
;call too ; then we got here too quickly
jmp nok ; and the solenoids will not fire
ok: call routcell ;send out character half
cjne cell, #(buffer+length-1), $+3 ;forward until 67h=the top
jc nok ;if <, then keep filling the
buffer
mov cell, #(buffer+length-1) ; if not, don't go off the map
call buzz
call fill ;refill the int buffer
nok: clr tr0 ;clear off the 'too fast' timer
clr tf0
mov th0, #high speedlim ; reload
mov tl0, #low speedlim
setb tr0 ; and restart
reti
;-------------------------TUNE.ASM-------------------------------------------
; September 29, 2000
;A subroutine which plays the tune you call (realtime) on port pin P1.0
;no interrupts used. More of a region than a subroutine I guess.
;----------------------------------------------------------------------------
toofast:
mov r7, #2
x2: mov speed, #4 ;how fast
mov note, #0 ;starting (or present) note
mov fnote, #7 ;ending note
call tune ;play those notes
djnz r7, x2
ret
shave: mov speed, #26 ;shave and a haircut
mov note, #32
mov fnote, #52 ;two bits
call tune
ret
charge: mov speed, #35 ;how fast
mov note, #0 ;starting (or present) note
mov fnote, #8 ;ending note
call tune ;play those notes
ret
click: mov r7, #2 ;a very quick digital phone bell
clicka: mov speed, #2
mov note, #15
mov fnote, #18
call tune
djnz r7, clicka
ret
buzz: mov r7, #2 ;sort of like a digital phone bell
buzza: mov speed, #8
mov note, #9
mov fnote, #12
call tune
djnz r7, buzza
ret
doo: mov speed,#60 ;need I say more?
mov note, #15
mov fnote,#16
call tune
ret
63
mov @cell, a
aust: mov dhigh, dph ;save the value in dptr
mov dlow, dpl
popdptr
ret ;shew!
;---------------------------------------------------------------;
; trans: ASCII to Braille lookup table ;
;format: LRh where L is the left half-cell and R is the right ;
; xLLLxRRR in binary
;---------------------------------------------------------------;
trans: inc a
movc a, @a+pc
ret
; 0 1 2 3 4 5 6 7 8 9 A B C D E F
db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h ;0
db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h ;1
db 00h,62h,00h,00h,26h,00h,00h,00h,66h,66h,00h,00h,20h,44h,26h,41h ;2
db 23h,10h,30h,11h,13h,12h,31h,33h,32h,21h,22h,60h,00h,00h,00h,64h ;3
db 00h,10h,30h,11h,13h,12h,31h,33h,32h,21h,23h,50h,70h,51h,53h,52h ;4
db 71h,73h,72h,61h,63h,54h,74h,27h,55h,57h,56h,00h,41h,00h,00h,77h ;5
db 00h,10h,30h,11h,13h,12h,31h,33h,32h,21h,23h,50h,70h,51h,53h,52h ;6
db 71h,73h,72h,61h,63h,54h,74h,27h,55h,57h,56h,66h,43h,66h,44h,00h ;7
string: clr a
movc a, @a+dptr ;get string
jz stout ;end of string
call trans ;loosely translate it into braille
mov @cell, a ;put letter in cell location
inc cell ;get next one ready
inc dptr ;for the string increment
sjmp string ;do it until end of string
stout: ret
plus: db 'plus', 00h
lthan: db 'less than', 00h
gthan: db 'greater than', 00h
equals: db 'equals', 00h
atsymb: db 01h, 'at', 00h
;--------------------------REHASH-------------------------------------;
;this look up table is used to translate the braille information
; inside the internal buffer to ASCII text which can be output
; to the computer monitor. For demonstration only.
rehash: inc a
movc a, @a+pc
ret
; 0 1 2 3 4 5 6 7 8 9 A B C D E F
db 20h,20h,20h,20h,5Eh,20h,40h,20h,00h,00h,00h,00h,00h,00h,00h,00h ;0
db 'a','c','e','d',20h,20h,20h,20h,00h,00h,00h,00h,00h,00h,00h,00h ;1
db 2Ch,'i',3Ah,'j',20h,20h,2Eh,'w',00h,00h,00h,00h,00h,00h,00h,00h ;2
db 'b','f','h','g',20h,20h,20h,20h,00h,00h,00h,00h,00h,00h,00h,00h ;3
db 27h,2Fh,2Ah,7Ch,2Dh,20h,22h,23h,00h,00h,00h,00h,00h,00h,00h,00h ;4
db 'k','m','o','n','u','x','z','y',00h,00h,00h,00h,00h,00h,00h,00h ;5
db ';','s','!','t',22h,20h,28h,20h,00h,00h,00h,00h,00h,00h,00h,00h ;6
db 'l','p','r','q','v',20h,20h,20h,00h,00h,00h,00h,00h,00h,00h,00h ;7
;-----------------------POLLING EXTERNAL SWITCHES----------------------
; October 23, 2000. Debugged December1, 2000
; Uses timer 2 to poll port pins on the 8032.
; A click less than 'hold' means 40 cells forward or backward
; A click longer than 'hold' yields a whole page forward or back
; This routine depends on ff, ffpage, rw, and rwpage
; which fill buffers as necessary. With no signal on polling pins
; only three lines are executed, minimizing time.
;----------------------------------------------------------------------
t2isr: clr tf2 ;clear timer2 flag REQUIRED
68
; THE
END
VITA
Chris Tullar was born in Greensboro, North Carolina in 1974, and lived there
study, but decided physics was too interesting to pass up, so he went on to receive a
State University in 1996, but deferred his acceptance for three years. In 1997, he married
Raeleen Wilson who, shortly thereafter, went to graduate school at Wake Forest
University. During that time Chris worked as a faux painter/muralist and an instructor at
Sylvan Learning Center. In August 1999, he started the ASU program in Applied
Physics.
69