Sie sind auf Seite 1von 38

Date:

8/14/2010

ELECTRONIC NAME CARD


ELEC 254 – Final Report

This report presents the design and implementation of a novel


‘electronic’ name card device that makes use of an 80XX
microprocessor.

Group 23
Lieuwe Leene [08562315]
WANG Wei [07607948]
YIN Jufeng [07604570]
Table of Contents
Abstract: .................................................................................................................................................................... 3
Introduction: ............................................................................................................................................................. 3
Principles of operation: .............................................................................................................................................. 4
Setup Instructions: ..................................................................................................................................................... 4
Operating Instructions: .............................................................................................................................................. 5
Hardware: ................................................................................................................................................................. 5
Hardware Summary: .............................................................................................................................................. 5
Hardware Schematic: ............................................................................................................................................. 6
Hardware Description: ........................................................................................................................................... 6
Timing Diagrams ................................................................................................................................................ 7
PCB Layout ......................................................................................................................................................... 9
Software: ................................................................................................................................................................... 9
Software Summary ................................................................................................................................................ 9
Start up & Initialization: ....................................................................................................................................10
Main Menu: ......................................................................................................................................................11
Display Info: ......................................................................................................................................................11
Contact Book: ...................................................................................................................................................12
Screen Saver & the Graphical Animation ...........................................................................................................13
IR Communication and Transmission Protocol ...................................................................................................14
Conclusion and Evaluation: .......................................................................................................................................17
APPENDIX A [Additional Illustrations] .......................................................................................................................18
APPENDIX B [Source Code].......................................................................................................................................20

2
Abstract:

This report presents the design and implementation of a novel ‘electronic’ name card device that makes use
of an 80XX microprocessor emulator. In addition of a micro processor, this device implements the use of a 4 level
gray-scale graphical LCD, a IR transceiver module, as well as a FRAM external memory component that allows non-
volatile data storage of up to 1000+ contact users. As a whole, the system has been oriented towards meeting three
specific purposes; Contact storage/browsing, Contact information exchange, and Innovative Presentation of
Credentials.

Introduction:

The aim of this project is to digitize the paper based name card on a standalone system controlled by a
single micro controller. The project will be geared toward meeting four requirements on functionality; presenting
ones’ personal information, sending and receiving contact data, presenting a visually attractive screen saver, and
present a contact book that allows users to browse though their stored contacts. We will be using a graphical LCD
display by TOPWAY that allows a 128 x 96 pixel resolution each allowing a 4 level gray scale state. In addition we will
make use of a 24MHz 8xC51 with 4K ROM. Each function will be handled separately in the software domain with a
simple 3 button user interface that will allow of simple and efficient navigation. To allow the device user to save new
users we will use non-volatile external memory space that should efficiently store each user’s contact package as a
stack which can easily be addressed by the contact book function. Another important aspect of this project is the
protocol used for the transmission of IR data signals between two devices that allow for reliable data transmission
without being prone to error. Each of the before mentioned aspects will be carefully considered in both hardware
and software design and we will aim for a design that is optimal in minimized hardware resources (cost) and
maximized in functionality (value).

The basis of our system consists of a main menu platform that will run after system initialization and allow
simply handle the user interaction to choose what kind of task should be scheduled next. From this platform we will
call functions that will run and after completion will return to its original state waiting for the user to queue the next
processing task. This assures us that the RAM data segment will not get corrupt easily since it avoids the nesting of
multiple functions and therefore allows one to dedicate RAM to a particular function.

The proposed platform is a very generic and simple approach to user interfaces; Present the User with
options, wait for a selection, continue in accordance to selection. In principle this easily allows for a ‘top down’
method and should allow us to design each function independently which will improve out efficiency by allowing
members to work on multiple functions simultaneously without conflict given that the data structure is well
organized and each program has well defined dedicated memory spaces that cannot be altered during the execution
of that program. The trade off by simplifying the design in such an extent is that some program functionality might
be duplicated in different forms. For example one function requires a string to be printed from the ROM while
another function requires a string to be printed from the RAM, clearly both programs will almost implement the
same functionality but because of the independent development it will result in near ‘duplication’ of code

3
fortunately we prefer swift development over high quality source code since it will allow us to implement much
more functionality in a limited period of time.

Principles of operation:

The device operation is very simplistic from a user point of view. We simply on start up procedure and 4
states in which the user can interact with the device after ‘power on’. Each state is intuitive and listed below
together with a brief description

1. Start up - The start and welcome message will be display every time the system restarts.
2. Main menu mode - The main menu includes the 4 major selections, “display info”, “infrared”, “screen saver”
and contact book”. After the welcome message or transmission, the program will return to main menu.
3. Screen saver mode - This mode will display the screen saver animations.
4. Infrared transmission mode - Under this mode, the user can select to send user contact information or
receive contact information by interrupt.
5. Contact Book mode – This will allow the user to browse all stored contacts and view further details after
selection

Figure 1: Operational Flowchart of E-Card System

Setup Instructions:
The system needs three voltage source, 5V, 3.1V and -5V.

1. Connect three grounds to a common one.


2. Connect 5V to 8051 port 0 and VDD of external memory.
3. Connect 3.1V to VDD of LCD.
4. Connect -5V to VDD of op-amps between infrared transceiver and 8051.
5. Set mode of emulator to “8X51(4K ROM), Internal Clock 24MHz”.
6. Simply runs the program and use buttons to select and confirm your actions.

4
Operating Instructions:
When LCD is displaying “Main Menu”, use buttons to move arrow up and down, and confirm your selection.

In “display info” mode, press “enter” to return to main menu.

In “infrared” mode, use buttons to move the arrow to select and confirm a contact to transmit.

In “screen saver” mode, if you want to return to main menu, simply press “enter”.

In “contact book” mode, after all names are loaded and shown on the LCD, move the arrow, with the help of
buttons, to select and confirm a particular contact in which you want to look in detail. After all information has been
shown, press “enter” to return to main menu.

If an interrupt is detected, which means someone is sending information through the infrared port to your device,
you just choose whether to accept or decline the user’s contact information by pushing buttons. The program will
automatically returns to the main menu after done with transmission.

Hardware:
Hardware Summary:
Micro Controller: - 8051

External Memory: - RAMTRON FM1808-70-P

Graphical LCD: - TOPWAY LM9033a

IR Transceiver: - TL071CP [OPAMP]

Buffer Circuit: - 2N3904 [BJT]

Pull up Resistor: - 5K

5
Hardware Schematic:

Figure 2: Detailed Hardware Schematic

Hardware Description:
As shown in figure 1, the finalized device hardware design consists of 3 main aspects with the micro
controller centered as the control & data signal hub. The simplest hardware aspect is the direct pin to pin
connection from the 8051 to the RAMTRON ‘FM1808-70-P’. This connection is considerably net list intensive. We
could have used a D-Latch to alleviate this issue but since each component was used non-concurrently there was no
necessity to up free pins and we simply joined the high-byte FRAM address bus and LCD data bus as an alternative to
the addition of such a D Latch. In addition, since LCDs normally operate under relatively low voltage conditions we
had to make us of a step-down voltage buffer to interface the 8051 5V output pins to the 3V input pins of the LCD
module. Fortunately, we resolved this issue with the use of a BJT and a resistor since we deliberately did not make
use of the ‘read - status’ function of the LCD such that the connection is one directional. Given that the load resistor
on the buffer is large enough this will also allow the BJT to reject the noise signals from the GND node as well as the
VDD node

Figure 3: Illustrated Schematic of the Hardware system layout Figure 4: Schematic of the voltage buffer

6
The more hardware involved aspect of this project was with respect to designing the IR transceiver. As
shown in FIG & FIG the IR transceiver consists of two individual OPAMP circuits that allow for half and full duplex IR
communication. Since this design uses a near IR (960nm) LED that is driven by a single stage inverting OPAMP. In
comparison the receiver module uses a near IR sensitive LDR that consists of a cascaded inverting and non-inverting
OPAMP. The two stage OPAMP circuit was necessary because the passive LDR has a very large resistance such that
and loading capacitance on the input amplifier has a very slow temporal response if the pull down resistor is not
made considerably small such that high switching speeds may be attained. Using a small pull down resister of course
degenerates the input signal from the LDR and thus requires the additional amplification stage. The pull down
resistor was a variable resistor so that we my later fine-tune the tradeoff between low signal degeneration or high
switching speed. Clearly inverting amplifiers were used so that the passive ‘high’ state of the serial port is translated
to the passive ‘low’ or no light state on the IR port which as results allows for better SNR. The OPAMP used was a
‘OP074’ component which we connected to a +5 V and -5V voltage source but as result one also had to implement a
positive half wave rectifier circuit to protect the 8051 from negative voltage inputs. For convenience we simply used
the same voltage buffer circuit as the LCD set-up with its voltage source connected to 5V.

Figure 5: Schematic of the LED Driver Circuit Figure 6: Schematic of the IR Receiver Circuit

Timing Diagrams

Figure 7: LCD Display - LM9033a


Figure 8: External Memory - RAMTRON

Figure 9: Table of Write Parameters

Figure 10:External Memory - RAMTRON

8
Figure 11: Table of Read parameters

PCB Layout

Figure 12: Hardware PCB layout

Software:
Software Summary
Interrupt Vector & Sequence
Timer 0 : Serial Time Out Interrupt
Serial : Serial SBUF interrupt

S_TIMER: main menu return sequence after timeout


S_RCV: IR contact data reception sequence

9
Main Code Segments
Main: Start-up Sequence LD_USR: Loads selected user from FRAM
MAIN_MENU: Han MEMORY_READ: Reads a single byte from FRAM
Reset: LCD Reset MEMORY_WRITE: Writes a single byte from FRAM
LCD_INIT: LCD Initialization NMCARD: Prints out user data that is stored in ROM
BLACK: LCD Clear Screen A_INIT: Graphical animation sequence
SND_IR: IR send data sequence ARRAY_GEN: gray scale Byte generation
S_SCS: Prompt Send success WRT_TRACY: Prints a 3 page string
S_FAIL: Prompt Send failed WRT_IN_ONE_PAGE: Prints a 1 page string
INS: LCD write a instruction CONTACT_BOOK: Contact Book sequence
DTA: LCD write a data CONTACT_BOOK_PERSON: loads user data and prints it
DEFINE_USR: Loads user into RAM from ROM START_MENU: Start Menu I/O handler
IR_FRAM: Saves received user to FRAM INFRARED_CONFIRM: confirm save User I/O handler

ROM Stored Data Tables:


PTABLE: 64 byte approximation of a sine function
USR: Stored the user’s animation scroll name
LETTER_TABLE: Stores pictographic ASCII character information
USR_DEFINED: Stores main user’s contact info (name, phone, email, logo)
STR_SND: Stores a STRING
STR_SC: Stores a STRING
STR_FL: Stores a STRING

Software Description – listed by function

Start up & Initialization:


The Startup sequence makes use of the LCD screen and the LETTER_TABLE which is described earlier. As the
program starts, initialization of stack pointer and variable definition will be executed. For demo use, we predefine
three users, including their names, email addresses, phone numbers and personalized icons, to store into the external
memory so that we can show the contact book immediately after start sequence is done. The LCD_INIT function will
send a sequence of instructions, which refers to the data sheet, to LCD for initialization. A BLACK function will be
called to clear the screen and then program reaches Main_menu.

Figure 13: Flow Chart of startup sequence

10
Main Menu:
Main Menu is more or less an idle state which listens to user’s input through buttons as well as waiting for
interrupt from the serial communication channel. The Start_Menu function displays four options, including “Display
Info” which shows basic information of product’s handler on LCD, “Infrared” which enters contact book, confirms
user’s will and sends out a particular contact’s information through infrared port, “Screen Saver” which runs an
interesting animation and will be introduced later and “Contact Book” which make effective use of an fast and non-
volatile external memory as an folder to store other’s contact details. An arrow is placed before the first option,
waiting for pushes over buttons. As long as “enter” button is pressed, the program reads the arrow’s position, does
an appropriate call. Meanwhile, if any interrupt from serial communication is detected, program will jump to the
interrupt vector to handle the information.

Figure 14: Flow Chart of Main Menu Program

Display Info:

This function is done by NMCARD function. This function is relatively simple since it makes use of
WRT_IN_ONE_PAGE function, which will be introduced later. Basically when entering the main menu, the program
will load a predefined user from ROM (USR_DEFINED1) to RAM (30H to 66H) then call WRT_IN_ONE_PAGE function
to display the information on the LCD.

Figure 15: Flow Chart of Show ID program

WRT_IN_ONE_PAGE: this function, which takes the row position, column position, start byte address, length of string
and a size indicator (bit F0) as input and output a set of instruction and data to the LCD so as to display character

11
onto screen, is the most frequently function that being called in the whole program. Due to the restriction of the LCD
module, we, at the very beginning, defined a table (

LETTER_TABLE) to draw every character and some special symbols (‘@’ ‘.’ And etc.) The WRT_IN_ONE_PAGE function
first makes use of TRANSLATE_COLUMN_POINTER function to translate a column pointer into two instructions and
then send to the LCD. After setting the position, the function reads an ASCII code from the starting byte address and
calls MATCH_OFFSET to set the relative offset in the LETTER_TABLE.

Finally, WRT_IN_ONE_PAGE_ONE_LETTER function does some calculations to store the responding value in A and
send to the LCD module. This will display one single character at the desired position with a user-defined size (bit F0).

The function decrements string length and loop until a complete string is shown on the LCD.

Contact Book:
The contact book function was implemented for users to store and view other people’s information. This
function mainly makes use of 8051’s parallel data bus and the high speed of a FRAM which was produced by
RAMTRON International.

Figure 16: Flow Chart of Contact Book Program

At the beginning of the CONTACT_BOOK function, the program will read the very first byte from the FRAM,
which indicates the number of current contacts in the contact book, then set a memory space 21H to loop through
the procedure to load all users’ names.

The function CONTACT_BOOK_DISPLAY will display a list of current users in the contact book. Basically it
follows the protocol for storing each user (i.e. first byte indicating length of name etc.), and display each user’s name
with the help of WRT_IN_ONE_PAGE function. Each time when it finishes displaying one’s name, it will add the
pointer, which is the data pointer inside 8051, to the start of next contact.

12
Up to here, an arrow will point to the first person in the contact book. The user is allowed make a selection
by pushing the buttons. This procedure is simply implemented by polling technique which is the same as in the main
menu.

After confirming user’s selection, CONTACT_BOOK_PERSON function will display the person’s information. It
first moves the FRAM pointer to the right position and then loads the 54 bytes into the RAM. Lastly it calls NMCARD
function to display the particular person’s information.

Screen Saver & the Graphical Animation


The screen saver mode that was implemented on this name card system makes use of the 8051’s simple and
rapid computational power and the gray scale functionality of the graphical LCD. Although one can only display 4
shades of tone on the ‘lm9300a’ LCD we were able to implement interesting visual effect by using a single two-
dimensional sine function. Due to our constraint on quick memory access we decided to let an algorithm generate a
picture frame on the fly instead of storing the frame in the external or internal memory allowing a much more
dynamic picture that it not constrained to its resolution as well as achieving much higher frame rates. The animation
(SEE A_INIT) consists of 32 unique frames in which the program loops though back and forth effectively looping a 64
frame moving picture. Each frame consists of 128 by 56 pixels that are calculated with dependence on the pixel (X &
Y) position as well as the current frame number. By simple scaling and manipulation of these three variables we can
formulate a function that manipulates the offset of a data pointer which points to 64byte stack that holds a sine
approximation. Using the resulting sine value we can determine which shade of gray the particular pixel is. Iterating
this algorithm across the LCD screen per frame created the following effect.

Figure 17: illustration of Animation Sequence

The complete program that handles this algorithm “A_INIT” consists of a initialization followed by 3 nested loops;
A_LOOP, A_LOOP1, and A_LOOP2. Intuitively each loop handles one of the before mentioned variables; Frame
number, page position, and column position respectively. These loops simple handle the current pixel variable states
in specified registers as wells as readjusting the LCD DRAM pointer once a loop is initialized. Within these loops there
exists a function called “ARRAY_GEN”. This function is necessary because LCD reads two bytes of information per
write instruction which corresponds to writing a whole column on a specific page in 4-level gray scale per write data
function. As a result one must pre calculate these two bytes before we call the function. We note here that this
function make use of the two bit addressable registers at location 20H & 21H to temporarily shift the relevant pixel
information in one by one.

13
As shown above we also implemented a roll over text (see WRITE_STRING) which makes effective use of the
function “WRITE_TRACY” and excellent use of the carry flag to detect a roll over letter case. The letter is printed one
by one with dependence on a column variable which depends on the frame number and a certain off set which of
course depends on the character’s order which ranges from 1st up to 5th. It is advised however that the 5th character is
a ‘space’ or blank such that there is a separation between the end and beginning of the string. Intuitively, after the
completion of drawing a particular frame, the system checks the status of the return button allowing the user to
return to the main menu when pressing the return button.

Figure 18: Flow Chart of Animation Program

IR Communication and Transmission Protocol


We implemented the infrared communication protocol based on the situation of the hardware. The protocol includes
2 parts, the transmission and the reception, respectively. These 2 parts follow some matched procedures, like the
echoing and the double send or receive for error check, etc.

14
Figure 19: Flow Chart of IR reception protocol

First we look at the sending, i.e. the method “SND_IR”, it’s jumped by an external interrupt of selecting the function
of “infrared” in the main menu and after choosing a right person to send. A confirms message will be asked to
confirm send, only “yes” will start the sending procedure and sending protocol. On start sending, the sender first
initializes a silence check to see if the infrared channel is idle, which enables “REN” and done by the loops of “IR_LP1”
and “IR_LP2”. If the SBUF is not empty, meaning there’s other client sending information, then the program will jump
to a “S_FAIL” handler, implying a sending failure. Otherwise, the sender will send out an echo message with the
content “AA” (in the method “ECO”) when the channel is deemed idle. It then will wait for an echo back with the
same content of “AA”. If the sender doesn’t receive the echo message back, it will keep sending echo. On receiving an
echo message, the sender will go to “E_PAS” and check if it’s the right echo message. If the message isn’t “AA”, it will
go to “S_FL” gain. Otherwise it will then send the contact information of the selected person twice. The contact
information is fixed as 54 bytes, with the three fields of 18 bytes, for name and phone number, logo, email,
respectively. The reason we choose fixed length of data packages is first, it’s easy to handle, second, for variable size
of packages, both sides needs to check the size and the transmission procedure will not be fluent. Being not influent
in the transmission, the communications needs more checking and will introduce more noise, thus increases the error
rate. As such, we chose to use the fixed data packages size. Finally after transmission, it’ll display the message as
“DONE” implying a successful transmission of the selected contact.

15
Figure 20: Flow Chart of IR Transmission Protocol

As mentioned above, the receiving procedure and protocol is similarly matched the sending part. It’s implemented in
the method “RCV_IR”, included in the serial interrupt vector, showing that the serial reception is triggered by serial
interrupt of the “RI” flag, and this interrupt is only enabled in the main menu, which represents the idle state. On
receiving the serial interrupt and confirmed that it’s the “RI”, the receiver will clear the flag and jump to method
“S_RCV”, checking if the received package is the echo message “AA” first. If not, then the program will simply return
from this interrupt mode and back to idle state in the main menu, waiting for further instructions or interrupts.
Otherwise, it’ll disable the serial interrupt and start sending an echo “AA” back to the sender. Meanwhile, the
receiver will also start a timer for the timeout, in case it waits longer than 65.5ms and didn’t get the echo back, it’ll
simply timeout and jump to an error handler (“S_timer”). But if the receiver gets the echo message back, then it’ll
prepare the start position and receive the first pack of the contact information (in “RCV_USR”), which includes 54
bytes as mentioned above. It’ll store in the RAM while receiving, and start to receive the same pack of information
for the second time. In the second receiving, the receiver will first receive the package will check with the original
reception (“CHK_USR” method), if the second reception has any error with exceptions from the first reception, the
receiving program will jump to error handler “S_ERR”, which handles the error by re-enabling serial interrupt and
stopping the timer. Otherwise, the receiver will go on checking further errors, and if overall errorless, then it’ll jump
to “INFRARED_INTO_FRAM”, which stores the received contact information to the contact book stored in the
external RAM.

16
Figure 21: Flow Chart of Timer 0 Interrupt Procedure

Conclusion and Evaluation:

The finalized ‘Electronic Name Card’ design successfully met all our initial expectations and we were able to
implement an efficient and stable system. We found that even though our source code was not optimized to its full
extent the operation of the device was still very smooth and even the animation performed beyond our expectations.
In addition we succeeded in wirelessly sending packages from one device to another with nearly 100% success rate.

For future improvements I would make an attempt to optimize the source code by unifying some of the
subprograms into a single general function that can be reused in multiple ways. This should increase programming
complexity but significantly reduce the code segment length. I would also like to include some sort of additional
notification when some one’s contact information is received and the system prompt the user to save the data like a
buzzer sound for example. In addition I would like to allow the user to also disable the serial reception of other
people’s contact data with the use of some kind of switch so that one could ignore another person persistently trying
to send their contact info.

A more ambitions though would be to use a color screen instead of the gray scale LCD that is used in this
project to make the presentation even more appealing without necessarily increasing program complexity. This
would make the user interface much more capable to engage more complex functionality as well as make the
animation a much more interesting. As closing remark one may also like to standardize the contact information
package for future integration instead of using our developed protocol. An example would be the vCARD format that
is nowadays commonly used for the transmission of such data among mobile devices.

17
APPENDIX A [Additional Illustrations]

Figure 22: Group Photo

Figure 1: Operational Flowchart of E-Card System ....................................................................................................... 4


Figure 2: Detailed Hardware Schematic ....................................................................................................................... 6
Figure 3: Illustrated Schematic of the Hardware system layout .................................................................................... 6
Figure 4: Schematic of the voltage buffer ..................................................................................................................... 6
Figure 5: Schematic of the LED Driver Circuit ............................................................................................................... 7
Figure 6: Schematic of the IR Receiver Circuit .............................................................................................................. 7
Figure 7: LCD Display - LM9033a .................................................................................................................................. 7
Figure 8: External Memory - RAMTRON ....................................................................................................................... 8
Figure 9: Table of Write Parameters ............................................................................................................................ 8

18
Figure 10:External Memory - RAMTRON ...................................................................................................................... 8
Figure 11: Table of Read parameters............................................................................................................................ 9
Figure 12: Hardware PCB layout................................................................................................................................... 9
Figure 13: Flow Chart of startup sequence ................................................................................................................. 10
Figure 14: Flow Chart of Main Menu Program ............................................................................................................ 11
Figure 15: Flow Chart of Show ID program ................................................................................................................. 11
Figure 16: Flow Chart of Contact Book Program ......................................................................................................... 12
Figure 17: illustration of Animation Sequence ............................................................................................................ 13
Figure 18: Flow Chart of Animation Program.............................................................................................................. 14
Figure 19: Flow Chart of IR reception protocol ........................................................................................................... 15
Figure 20: Flow Chart of IR Transmission Protocol ...................................................................................................... 16
Figure 21: Flow Chart of Timer 0 Interrupt Procedure ................................................................................................ 17
Figure 22: Group Photo .............................................................................................................................................. 18

19
APPENDIX B [Source Code]

ORG 0000H
SJMP MAIN ;CALL DEFINE_USR
;------------------------------------------------------------------------------- ;JMP SND_IR
ORG 0018H ;JMP $
CLR TF0
CLR TR0 MAIN_MENU:
LJMP S_TIMER SETB ES
ORG 0023H SETB EA
RCV_IR: CLR RI CALL START_MENU
LJMP S_RCV ;----------------
;------------------------------------------------------------------------------- CALL DEFINE_USR
;18H CALL BLACK
STR_START EQU 2EH ;THE MEMORY POINTER OF THE FIRST CLR ES
CHARACTER MOV R0,18H
STR_LEN EQU 2FH ;THE STRING LENGTH
OFFSET EQU 1AH CJNE R0, #0B8H, SELECTION_NMCARD
LCD_ACCESS EQU P3.5 ;CLR LCD_ACCESS
ORG 0028H SETB ES
CLR TI JMP A_INIT
RETI SELECTION_NMCARD:
;p1.0 register select: 1 for data, 2 for instruction CJNE R0, #0B4H, SELECTION_INFRARED
;\ serial clock ;CLR LCD_ACCESS
;p1.2 serial data CALL DEFINE_USR
; reset 1 for normal running, 0 for initialization CALL BLACK
ORG 0030H CALL NMCARD
;18H IS THE ROW POINTER SJMP MAIN_MENU
;19H IS THE COLUMN POINTER SELECTION_INFRARED :
MAIN: MOV SP,#066H ;Handles 32 nested Process calls CJNE R0, #0B6H, SELECTION_CTCBOOK
MOV IP,#00000010B ;set timer0 priority to 1 CLR 6FH
ANL PCON,#01111111B CALL CONTACT_BOOK
MOV SCON,#01010000B ;Bits per Second: 9600, bit/s JMP SND_IR
MOV TH1,#0FDH ;TH1=-3 SJMP MAIN_MENU
MOV TL1,#0FDH SELECTION_CTCBOOK:
SETB TR1 ;enable timer1 SETB 6FH
MOV TMOD,#00100001B ;timer1 and timer0 for CALL CONTACT_BOOK
timeout SJMP MAIN_MENU
SETB ET0 ;----------------
MOV P0,#00H DONE: SJMP DONE
MOV P1,#0FFH S_TIMER:
;Clear IO pins POP ACC
MOV P2,#0FFH POP ACC
; CLR LCD_ACCESS JB 7Eh, SND_RCV
SETB CE MOV DPTR, #S_ERR
CALL Reset PUSH DPL
CALL LCD_INIT PUSH DPH
CALL BLACK RETI
CALL MEMORY_TEST SND_RCV:

20
MOV DPTR, #S_FL CALL INS
PUSH DPL MOV A, #08BH
PUSH DPH CALL INS
RETI MOV A, #088H
Reset: CALL INS
CLR P3.7 MOV A, #08CH
CALL DELAY CALL INS
SETB P3.7 MOV A, #0BBH
CALL DELAY CALL INS
CLR P0.2 MOV A, #08DH
RET CALL INS
LCD_INIT: MOV A, #0BBH
MOV A, #048H CALL INS
CALL INS MOV A, #08EH
MOV A, #060H CALL INS
CALL INS MOV A, #0EEH
MOV A, #0A1H CALL INS
CALL INS MOV A, #08FH
MOV A, #0C8H CALL INS
CALL INS MOV A, #0EEH
MOV A, #044H CALL INS
CALL INS MOV A, #02CH
MOV A, #010H CALL INS
CALL INS CALL DELAY
MOV A, #040H MOV A, #02EH
CALL INS CALL INS
MOV A, #000H CALL DELAY
CALL INS MOV A, #02FH
MOV A, #0ABH CALL INS
CALL INS CALL DELAY
MOV A, #066H mov a, #10100010b
CALL INS call ins
MOV A, #027H call delay
CALL INS MOV A, #0AFH
MOV A, #081H CALL INS
CALL INS CALL DELAY
MOV A, #020H CALL BLACK
CALL INS CALL START_MESSAGE
MOV A, #054H RET
CALL INS BLACK:
MOV A, #093H MOV R1,#010110000b
CALL INS MOV R2,#000010000b
MOV A, #088H MOV R3,#000000000b
CALL INS MOV R6, #0FFH
MOV A, #000H MOV R7, #12
CALL INS SCRN:
MOV A, #089H CALL WRT
CALL INS INC R1
MOV A, #000H ; INC R6
CALL INS DJNZ R7, SCRN
MOV A, #08AH RET
CALL INS WRT:
MOV A, #088H MOV A,R1

21
CALL INS MOV 20H, SBUF
MOV A,R2 MOV R0, #0FFH
CALL INS IR_LP1: MOV B, #0FFH
MOV A,R3 IR_LP2: MOV A, SBUF
CALL INS CJNE A,20H, S_FL
MOV R4,#256 DJNZ B, IR_LP2
BL1: DJNZ R0, IR_LP1
MOV A, R6 MOV TL0,#0
;CPL A MOV TH0,#0
;MOV R6, A SETB TR0
CALL DTA SETB 7EH
DJNZ R4, BL1 ECO: MOV SBUF, #0AAH ; ECO
RET JNB TI, $
S_RCV: CLR TI
MOV A, SBUF MOV B, #080H
CJNE A, #0AAH, S_RTI DJNZ B, $
CLR ES JB RI, E_PAS
CLR 7EH JMP ECO
MOV SBUF, #0AAH ; ECO E_PAS:
JNB TI, $ CLR TR0
CLR TI CLR RI
JNB RI, $ MOV A,SBUF
CLR RI CJNE A, 20H, S_ECO
MOV TL0,#0 MOV SBUF, #0AAH
MOV TH0,#0 JNB TI, $
SETB TR0 CLR TI
MOV B, #53 SJMP S_NXT
MOV R1, #30H S_ECO: CJNE A, #0AAH, S_FL
RCV_USR: S_NXT: SETB 7FH
JNB RI, $ SND_S: MOV B, #53
CLR RI MOV R1,#31H
MOV @R1, SBUF MOV SBUF,30H
INC R1 SND_USR:
DJNZ B, RCV_USR MOV A, @R1
MOV TH0,#0 INC R1
MOV TL0,#0 JNB TI, $
MOV B, #53 CLR TI
MOV R1, #30H MOV SBUF, A
CHK_USR: DJNZ B, SND_USR
JNB RI, $ CPL 7FH
CLR RI JNB 7FH, SND_S
MOV A, @R1 JMP S_SCS
CJNE A, 99H, S_ERR S_FL: JMP S_FAIL
INC R1
DJNZ B, CHK_USR
CLR TR0 S_SCS:
JMP INFRARED_INTO_FRAM CALL BLACK
S_ERR: SETB 0F0H
SETB ES MOV 18H,#0B4H
CLR TR0 MOV 19H,#20
S_RTI: RETI MOV STR_START,#26H
SND_IR: MOV STR_LEN,#8
CLR ES MOV DPTR, #STR_SND

22
CALL FECH_STR CLR PSW.3
MOV 18H,#0B8H RET
MOV 19H,#20 LONG_DELAY :
MOV STR_START,#26H SetB PSW.3
MOV STR_LEN,#8 MOV R0,#255
MOV DPTR, #STR_SC L_1: MOV R1,#255
CALL FECH_STR L_2: DJNZ R1,L_2
JB ENTER, $ DJNZ R0,L_1
CLR RI CLR PSW.3
CLR TI RET
JMP MAIN_MENU INS:
S_FAIL: CLR P0.2
CALL BLACK CALL CLK_DATA
SETB 0F0H RET
MOV 18H,#0B4H DTA:
MOV 19H,#20 SETB P0.2
MOV STR_START,#26H CALL CLK_DATA
MOV STR_LEN,#8 RET
MOV DPTR, #STR_SND DTA_DELAY:
CALL FECH_STR SETB P0.2
MOV 18H,#0B8H CALL CLK_DATA
MOV 19H,#16 CALL DELAY
MOV STR_START,#26H RET
MOV STR_LEN,#8 ;p0.0 READ
MOV DPTR, #STR_FL ;p0.1 WRITE
CALL FECH_STR ;p0.2 register select: 1 for data,0 for instruction
JB ENTER, $ ;p3.7 reset 1 for normal running, 0 for initialization
CLR RI ;p3.5 Chip Select
CLR TI CLK_DATA:
JMP MAIN_MENU SETB P0.0
FECH_STR: CLR P0.1
MOV R1, #26H CLR LCD_ACCESS
MOV R0, #0 NOP
FECH_LP:MOV A, R0 ;CALL DIULEI
MOVC A, @A+DPTR MOV P2, A
MOV @R1, A NOP
INC R1 SETB LCD_ACCESS
INC R0 NOP
CJNE R0,#08H, FECH_LP SETB P0.1
CALL WRT_IN_ONE_PAGE RET
RET DEFINE_USR:
STR_SND: MOV B, #54
DB 'SENDING ' MOV R1, #30H
STR_SC: MOV DPTR, #USR_DEFINED1
DB ' DONE ' MOV A, #0
STR_FL: MOV R2,#0
DB ' FAILED ' SV_USR:
DELAY: MOVC A, @A+DPTR
SetB PSW.3 MOV @R1, A
MOV R0,#20 INC R1
L1: MOV R1,#100 INC R2
L2: DJNZ R1,L2 MOV A,R2
DJNZ R0,L1 DJNZ B, SV_USR

23
RET call nmcard
;----------------------INFRARED INTO FRAM----------------------- ;-----------MEMORY TEST-----------------
INFRARED_INTO_FRAM: MEMORY_TEST:
call black CLR EA
CALL INFRARED_CONFIRM CALL MEMORY_SET
MOV R0,18H MOV DPTR,#0
CJNE R0,#0B7H,INFRARED_INTO_FRAM_RET MOV A,#3
MOV DPTR,#0 CALL MEMORY_WRITE
CALL MEMORY_READ MOV DPTR,#USR_DEFINED
MOV R0,A CALL USR_INTO_RAM
INC A MOV DPTR,#1
CALL MEMORY_WRITE; INCREMENT THE NUMBER OF USERS CALL USER_INTO_FRAM
call memory_read MOV DPTR,#USR_DEFINED1
INC DPTR CALL USR_INTO_RAM
INFRARED_INTO_FRAM_LOOP: MOV DPTR,#55
MOV R1,#54 CALL USER_INTO_FRAM
INFRARED_INTO_FRAM_LOOP1: MOV DPTR,#USR_DEFINED2
INC DPTR CALL USR_INTO_RAM
DJNZ R1,INFRARED_INTO_FRAM_LOOP1 MOV DPTR,#109
DJNZ R0,INFRARED_INTO_FRAM_LOOP CALL USER_INTO_FRAM
CALL USER_INTO_FRAM ;JMP LD_USR
INFRARED_INTO_FRAM_RET: RET
POP ACC USR_INTO_RAM:
POP ACC MOV R1,#30H
MOV DPTR, #MAIN_MENU MOV R2,#0
PUSH DPL MOV R3,#54
PUSH DPH INPUT_USER:
RETI MOV A,R2
;---------------------------------------------------------------- MOVC A,@A+DPTR
;----------------------external memory access---------------------------------- MOV @R1,A
LD_USR: INC R2
CLR LCD_ACCESS INC R1
CALL BLACK DJNZ R3,INPUT_USER
SETB LCD_ACCESS RET
MOV R0,#1 USER_INTO_FRAM:
MOV R2,#0 MOV R1,#30H
CALL MEMORY_READ MOV R3,#54
MOV 1EH, #30H INPUT_FRAM:
PUSH 11H MOV A,@R1
SETB PSW.3 CALL MEMORY_WRITE
MOV B,#30H INC DPTR
;CALL MEMORY_SET INC R1
SV_STK: MOV R1,#30H DJNZ R3,INPUT_FRAM
MOV R0,#1 ;MOV R3,#54
MOV R2,#0 ;MOV DPTR,#109
MOV R3,#54 ;MOV R1,#30H
SV_STK_LOOP: ;TEST_LOOP_MEMO:
;CALL MEMORY_READ
CALL MEMORY_READ ;MOV @R1,A
MOV@ R1,A ;INC DPTR
INC R1 ;INC R1
INC R0 ;DJNZ R3,TEST_LOOP_MEMO
DJNZ R3,SV_STK_LOOP RET

24
;------------------------------------------------- MOV 18H, #0B5H
CE EQU P3.4 MOV 19H, #005H
OE EQU P3.3;RD CALL WRT_IN_ONE_PAGE
WE EQU P3.2;WRITE
MEMORY_SET: ;CNVRT PHONE
CLR CE MOV B, R1
NOP PUSH 0F0H
SETB CE MOV B, R0
NOP PUSH 0F0H
SETB WE CLR 7FH
SETB OE MOV R1,#3CH
MOV P2,#0FFH MOV R0,#30H
MOV P0,#0FFH MOV B, #6
MOV P1,#0FFH
RET
MEMORY_READ: MVUPPR:
MOV P1,#0FFH MOV A, @R1
SETB WE SWAP A
MOV P0,DPL;dpl IS A0 TO A7 ANL A, #0FH
MOV P2,DPH;DPH IS A8 TO A14 ADD A,#30H
CLR CE MOV @R0, A
CLR OE INC R0
MOV A,P1 MOV A,#0
NOP XCHD A, @R1
SETB CE ADD A,#30H
SETB OE MOV @R0, A
NOP INC R0
RET INC R1
MEMORY_WRITE: DJNZ B, MVUPPR
MOV P0,DPL;DPL IS A0 TO A7
MOV P2,DPH;DPH IS A8 TO A14 ;JB 7FH, CNVERT
CLR WE ;MOV R1,# 41H
CLR CE ;MOV R0,# 41H
MOV P1,A
NOP ;MOV B, #4
nop ;SETB 7FH
SETB CE ;SJMP MVUPPR
SETB WE CNVERT: POP 0F0H
NOP MOV R0, B
RET POP 0F0H
;----------------------external memory access---------------------------------- MOV R1, B
NMCARD: CLR PSW.5
SETB LCD_ACCESS MOV STR_LEN, #12
; WRITE name MOV STR_START, #30H
MOV STR_LEN, 30H MOV 18H, #0B9H
MOV STR_START, #31H MOV 19H, #005H
CLR F0 CALL WRT_IN_ONE_PAGE
MOV 18H, #0B1H ; DRAW LOGO
MOV 19H, #005H SETB PSW.4
CALL WRT_IN_ONE_PAGE MOV 20h, #00
; WRITE EMAIL MOV R5, #0B8H
MOV STR_LEN, 42H MOV R4, #016H
MOV STR_START, #43H MOV R3, #005H

25
MOV R0, #54H USR_DEFINED1:
MOV R7, #3 DB 8
LGO1: MOV A,R5 DB 'TIM '
CALL INS DB 00, 00, 00, 08H , 52H, 68H, 50H, 78H, 48H;18
MOV A, R4 DB 15
CALL INS DB 'eetim@abc.hk '
MOV A, R3 DB 00, 00;18
CALL INS DB 000H, 001H, 010H, 001H, 010H, 000H
MOV R6,#06 DB 000H, 00FH, 0f0H, 00fH, 0F0H, 000H
LGO2: CLR 7FH DB 0C6H, 023H, 011H, 011H, 032H, 06CH
MOV A, @R0 USR_DEFINED2:
INC R0 DB 10
SWAP A DB 'JUFENG YIN'
SD_LGO2: DB 00, 08H , 52H, 66H, 22H, 36H, 96H;18
MOV C, ACC.0 DB 13
MOV 07H, C DB 'ee_YJF@ust.hk'
MOV C,ACC.1 DB 00, 00, 00, 00;18
MOV 05H, C DB 000H, 007H, 044H, 044H, 046H, 067H
MOV C,ACC.2 DB 0f8H, 08fH, 099H, 099H, 0f1H, 01fH
MOV 03H, C DB 0e6H, 062H, 022H, 022H, 02eH, 000H
MOV C,ACC.3 ;------------------------------------------------------
MOV 01H, C ;R0 - FRM ABS
MOV B, A ;R1 - Y ABS & Y POSITION
MOV A, 20H ;R2 - X ABS
RR A ;R3 - FRM MAX
ORL A, 20H ;R4 - CURRENT FRM NUMBER
CPL A ;R5 - ARRAY GEN VAR
CALL DTA ;R6 - X LOOP VAR
CALL DTA ;R7 - Y LOOP VAR
JB 7FH, EX_LGO2 A_INIT:
SETB 7FH SETB PSW.4 ; REG BANK 1
MOV A, B MOV R4, #03EH ; RESET FRAME
SWAP A MOV R3, #03FH ; SET FRAME NUMBER
MOV B, A MOV DPTR,#PTABLE ; MOVE POINTER
JMP SD_LGO2 A_LOOP:
EX_LGO2: DJNZ R6, LGO2 MOV A, R4
INC R5 ANL A, #03FH
DJNZ R7, LGO1 MOVC A,@A+DPTR
CLR PSW.4 MOV R0,A
SETB ENTER MOV A,#010110000b
NMCARD_RETURN: CALL INS
JB ENTER, NMCARD_RETURN MOV A,#000010000b
RET CALL INS
USR_DEFINED: MOV A,#000000000b
DB 8 CALL INS ;SET CURSOR PAGE & COLL
DB 'L. Leene' MOV R6,#0 ;IMG size 132 pix.x
DB 00, 00, 00, 08H , 52H, 65H, 15H, 23H, 68H;18 A_LOOP1:
DB 13 CLR C
DB 'ee_llb@ust.hk' MOV A, R6
DB 00, 00, 00, 00;18 RL A
DB 000H, 001H, 010H, 001H, 010H, 000H RL A
DB 000H, 00FH, 0f0H, 00fH, 0F0H, 000H RL A
DB 0C6H, 023H, 011H, 011H, 032H, 06CH MOV R1, A

26
MOV A,#010110000b MOV A, 21H
ADD A,R6 CALL DTA
CLR PSW.4 SETB PSW.4
CALL INS
MOV A,#000010000b DJNZ R7,A_LOOP2
CALL INS INC R6
MOV A,#000000000b MOV A,R6
CALL INS ADD A, -7
SETB PSW.4 JNZ A_LOOP1
MOV R7,#128 ;IMG size 132 pix.y MOV R5, #05
WRITE_STRING:
A_LOOP2: MOV A, R5
MOV B, #0CH
MOV A, R7 MUL AB
RR A ADD A, R4
ANL A, #03FH RL A
MOVC A,@A+DPTR ADD A,#80H
MOV R2, A JB CY, OF
ADD A,#80H
OF: MOV 19H,A
MOV R5, #08 MOV 18H,#0B8H
MOV A, R5
MOV 1FH, #00 DEC A
MOV 1EH, #00 MOV DPTR,#USR
MOVC A,@A+DPTR
ARRAY_GEN: MOV 1AH,A
MOV A, R1 CLR PSW.4
ANL A, #03FH CALL WRITE_TRACY
MOVC A,@A+DPTR SETB PSW.4
ADD A,R0 MOV DPTR,#PTABLE
ADD A,R2 DJNZ R5,WRITE_STRING
ADD A,#40 JNB ENTER,NT3_NEXT;
RLC A DJNZ R4,NT3
cpl c JMP A_INIT
MOV 00H,C NT3:
ADD A,#20 LJMP A_LOOP
RLC A NT3_NEXT:
cpl c CLR PSW.4
MOV 08H,C JMP MAIN_MENU
MOV A, 21H USR:
RR A DB 17, 26, 02, 03, 38
MOV 21H,A PTABLE:
MOV A, 20H DB 020H,023H,026H,029H,02CH,02FH,032H,035H,037H,039H
RR A DB 03BH,03CH,03EH,03FH,040H,040H,040H,040H,03FH,03EH
MOV 20H,A DB 03DH,03CH,03AH,038H,036H,033H,031H,02EH,02BH,028H
INC R1 DB 025H,022H,01EH,01BH,018H,015H,012H,00FH,00DH,00AH
DJNZ R5,ARRAY_GEN DB 008H,006H,004H,003H,002H,001H,000H,000H,000H,000H
MOV A, R1 DB 001H,002H,004H,005H,007H,009H,00BH,00EH,011H,014H
ADD A, -8 DB 017H,01AH,01DH,020H
MOV R1, A ;-----------------WRT WORDS-----------MAXIMUM 5 LETTERS---
CLR PSW.4 ;22H 23H 24H IS BEING USED IN THIS FUNCTION
MOV A, 20H WRITE_TRACY:
CALL DTA ;_______________________________ SS MOVING NAME

27
MOV R1,18H HALF_COLUMN_DONE:
SETB PSW.3 MOV R2,#8
MOV A,19H WRT_LET0:
ANL A, #0F0H CALL DTA
SWAP A DJNZ R2,WRT_LET0
ORL A, #010H ;-----------LEFT SHIFT TO COMPARE
MOV R6, A MOV A,22H
MOV A,19H RL A
ANL A,#0FH MOV 22H,A
MOV R3, A MOV A,23H
CLR PSW.3 RL A
MOV DPTR,#LETTER_TABLE MOV 23H,A
CALL WRT_PER_LETTER ;---------
RET DJNZ R0,WRT_LET
; ;------------WRITE FIVE LETTERS INC R4
WRT_PER_LETTER: INC R1
MOV R3,#4 MOV A,R1
MOV R4,#0;to record which column it is accessing CALL INS
;ADJUST THE DPTR TO THE WANTED LETTERS DJNZ R3,WRT_LET1
MOV A, OFFSET ; <------------ CHNG MOV DPTR,#LETTER_TABLE
MOV B,#8 RET;RET OF ONE LETTER
MUL AB RET
ADD A,DPL ;--------------START MESSAGE------------
MOV DPL,A START_MESSAGE:
MOV A,B MOV 18H,#0B4H
ADDC A,DPH MOV 19H,#20
MOV DPH,A SETB F0
MOV A,R1 MOV STR_START,#26H
CALL INS MOV STR_LEN,#7
WRT_LET1: ; MOV 26H,#'W'
MOV R0,#6 MOV 27H,#'E'
SETB PSW.3 MOV 28H,#'L'
MOV A,R6 MOV 29H,#'C'
CALL INS MOV 2AH,#'O'
MOV A,R3 MOV 2BH,#'M'
CALL INS MOV 2CH,#'E'
CLR PSW.3 CALL WRT_IN_ONE_PAGE
MOV A,R4 MOV 18H,#0B7H
MOVC A,@A+DPTR MOV 19H,#10
MOV 23H ,A CLR F0
INC R4 MOV STR_LEN,#8
MOV A,R4 MOV STR_START,#26H
MOVC A,@A+DPTR MOV 26H,#'L'
MOV 22H,A MOV 27H,#'O'
WRT_LET:; WRITE 1 PAGE, 4 COLUMNS EACH TIME MOV 28H,#'A'
;ADD A,0 ; OFFSET IS THE REFERENCE ADDRESS OF THE LETTER MOV 29H,#'D'
TO '0' MOV 2AH,#'I'
MOV A,#00H MOV 2BH,#'N'
JB 15H, LOWER_BIT MOV 2CH,#'G'
ORL A,#0F0H MOV 2DH,#' '
LOWER_BIT: CALL WRT_IN_ONE_PAGE
JB 1DH, HALF_COLUMN_DONE MOV 18H,#0B7H
ORL A,#0FH MOV 19H,#58

28
MOV STR_LEN,#5 CALL WRITE_ARROW
MOV STR_START,#26H MOV P0,#0FFH
MOV 26H,#'Y' INFRARED_CONFIRM_CHECK:
MOV 27H,#'O' JNB UP, INFRARED_CONFIRM_CHECKUP
MOV 28H,#'U' JNB DOWN, INFRARED_CONFIRM_CHECKDOWN
MOV 29H,#'R' JNB ENTER, INFRARED_CONFIRM_CHECKRETURN
MOV 2AH,#' ' SJMP INFRARED_CONFIRM_CHECK
CALL WRT_IN_ONE_PAGE INFRARED_CONFIRM_CHECKUP:
MOV 18H,#0B7H CALL ERASE_ARROW
MOV 19H,#88 MOV R0,18H
MOV STR_LEN,#4 CJNE R0,#0B6H,INFRARED_CONFIRM_CHECKUP0
MOV STR_START,#26H MOV 18H,#0B8H
MOV 26H,#'D' CALL WRITE_ARROW
MOV 27H,#'A' SJMP INFRARED_CONFIRM_CHECKUP_END
MOV 28H,#'T' INFRARED_CONFIRM_CHECKUP0:
MOV 29H,#'A' MOV 18H,#0B6H
CALL WRT_IN_ONE_PAGE CALL WRITE_ARROW
MOV A,#0FFH INFRARED_CONFIRM_CHECKUP_END:
SETUP1: JNB UP,INFRARED_CONFIRM_CHECKUP_END
DJNZ ACC, SETUP1 LJMP INFRARED_CONFIRM_CHECK
RET INFRARED_CONFIRM_CHECKDOWN :
;------------------------------------------ CALL ERASE_ARROW
CONFIRM_SEND_PERSON: MOV R0,18H
MOV 18H,#0B3H CJNE R0,#0B6H,INFRARED_CONFIRM_CHECKDOWN0
MOV 19H,#20 MOV 18H,#0B8H
CLR F0 CALL WRITE_ARROW
MOV STR_START,#26H SJMP INFRARED_CONFIRM_CHECKDOWN_END
MOV STR_LEN,#8 INFRARED_CONFIRM_CHECKDOWN0:
MOV 26H,#'C' MOV 18H,#0B6H
MOV 27H,#'O' CALL WRITE_ARROW
MOV 28H,#'N' INFRARED_CONFIRM_CHECKDOWN_END:
MOV 29H,#'F' JNB DOWN,INFRARED_CONFIRM_CHECKDOWN_END
MOV 2AH,#'I' LJMP INFRARED_CONFIRM_CHECK
MOV 2BH,#'R' INFRARED_CONFIRM_CHECKRETURN :
MOV 2CH,#'M' MOV 10H,#4
MOV 2DH,#'?' INFRARED_CONFIRM_CHECKRETURN_LOOP:
CALL WRT_IN_ONE_PAGE CALL ERASE_ARROW
MOV 18H,#0B6H CALL LONG_DELAY
MOV 19H,#20 CALL LONG_DELAY
MOV STR_START,#26H CALL WRITE_ARROW
MOV STR_LEN,#3 CALL LONG_DELAY
MOV 26H,#'Y' CALL LONG_DELAY
MOV 27H,#'E' DJNZ 10H, INFRARED_CONFIRM_CHECKRETURN_LOOP
MOV 28H,#'S' MOV R0,18H
CALL WRT_IN_ONE_PAGE CJNE R0,#0B6H,DIULEILOUMOU
MOV 18H,#0B8H RET
MOV 19H,#20 DIULEILOUMOU:
MOV STR_START,#26H LJMP MAIN_MENU
MOV STR_LEN,#2 ;------------------CONTACT BOOK--------------
MOV 26H,#'N' CONTACT_BOOK:
MOV 27H,#'O' CONTACT_BOOK_INDEX EQU 20H
CALL WRT_IN_ONE_PAGE CONTACT_BOOK_NUM EQU 1FH
MOV 18H,#0B6H MOV DPTR,#0

29
CALL MEMORY_READ MOV A,18H
INC DPTR CALL CONTACT_BOOK_BOTTOM
MOV 18H,#0B0H ;NOW R2 IS THE BOTTOM PAGE ADDRESS
MOV 21H,A CJNE A,02H,CONTACT_BOOK_DOWN_NORMAL
MOV 1FH,A MOV 18H,#0B0H
CONTACT_BOOK_DISPLAY:; THIS WILL DISPLAY A LIST OF NAMES CALL WRITE_ARROW
CALL MEMORY_READ SJMP CONTACT_BOOK_DOWN_RET
MOV 25H,A CONTACT_BOOK_DOWN_NORMAL:
MOV 30H,25H INC 18H
INC DPTR INC 18H
CALL CONTACT_BOOK_NAME;25H IS THE LENGTH OF THE NAME CALL WRITE_ARROW
STRING CONTACT_BOOK_DOWN_RET:
INC 18H JNB DOWN,$
INC 18H JMP CONTACT_BOOK_LOOP
DJNZ 21H,CONTACT_BOOK_DISPLAY CONTACT_BOOK_ENTER:
MOV 18H,#0B0H MOV 10H,#4
CALL WRITE_ARROW CONTACT_BOOK_ENTER_LOOP:
MOV P0,#0FFH CALL ERASE_ARROW
CONTACT_BOOK_LOOP: CALL LONG_DELAY
JNB UP, CONTACT_BOOK_UP CALL LONG_DELAY
JNB DOWN,CONTACT_BOOK_DOWN CALL WRITE_ARROW
JNB ENTER,CONTACT_BOOK_ENTER CALL LONG_DELAY
SJMP CONTACT_BOOK_LOOP CALL LONG_DELAY
CONTACT_BOOK_RET: DJNZ 10H, CONTACT_BOOK_ENTER_LOOP
MOV R0,18H JMP CONTACT_BOOK_RET
MOV CONTACT_BOOK_INDEX,#0 CONTACT_BOOK_NAME:; TO MOVE THE NAME FROM EXTERNAL
CONTACT_BOOK_HERE: MEMORY TO RAM
CJNE R0,#0B0H,CONTACT_BOOK_END MOV R1,#31H
LJMP CONTACT_BOOK_PERSON CONTACT_BOOK_NAME_LOOP:
CONTACT_BOOK_END: CALL MEMORY_READ
DEC R0 MOV @R1,A
DEC R0 INC R1
INC CONTACT_BOOK_INDEX INC DPTR
SJMP CONTACT_BOOK_HERE DJNZ 25H,CONTACT_BOOK_NAME_LOOP
;CONTACT BOOK INDEX IS 0 TO 5 MOV 25H,30H
; AFTER SET THE INDEX, DISPLAY A PERSON'S INFO SETB C
CONTACT_BOOK_UP: MOV A,#54
CALL ERASE_ARROW SUBB A,25H
MOV R0,18H MOV R0,A
CJNE R0,#0B0H,CONTACT_BOOK_UP_NORMAL CONTACT_BOOK_NAME_LOOP1:
CALL CONTACT_BOOK_BOTTOM INC DPTR
MOV 18H,R2 DJNZ R0,CONTACT_BOOK_NAME_LOOP1
CALL WRITE_ARROW MOV 7FH,DPH
SJMP CONTACT_BOOK_UP_RET MOV 7EH,DPL
CONTACT_BOOK_UP_NORMAL: MOV 19H,#30
DEC 18H CLR F0
DEC 18H MOV STR_START,#31H
CALL WRITE_ARROW MOV STR_LEN,30H
CONTACT_BOOK_UP_RET: CALL WRT_IN_ONE_PAGE
JNB UP,$ MOV DPH,7FH
SJMP CONTACT_BOOK_LOOP MOV DPL,7EH
CONTACT_BOOK_DOWN: RET
CALL ERASE_ARROW

30
CONTACT_BOOK_BOTTOM:;RETURN R2 AS THE BOTTOM PAGE INC STR_START
ADDRESS CALL LONG_DELAY
MOV R1,CONTACT_BOOK_NUM DJNZ STR_LEN,WRT_IN_ONE_PAGE_LOOP
DEC R1; RET; RETURN OF WRT IN ONE PAGE
MOV R2,#0B0H WRT_IN_ONE_PAGE_ONE_LETTER:
CONTACT_BOOK_UP_GAN: MOV DPTR,#LETTER_TABLE
INC R2 MOV A,OFFSET
INC R2 MOV B,#8
DJNZ R1,CONTACT_BOOK_UP_GAN; A SPECIAL CASE MUL AB
RET ADD A,DPL
CONTACT_BOOK_PERSON: MOV DPL,A
MOV R1,CONTACT_BOOK_INDEX MOV A,B
MOV DPTR,#1 ADDC A,DPH
CJNE R1,#0,CONTACT_BOOK_PERSON_CONT MOV DPH,A
SJMP CONTACT_BOOK_PERSON_READ ;NOW DPTR IS AT THE LETTER WE WANNA INPUT
CONTACT_BOOK_PERSON_CONT: MOV R3,#2
MOV R5,#54 MOV R2,#0
CONTACT_BOOK_PERSON_CONT_LOOP: WRT_IN_ONE_PAGE_HALF_LETTER:
INC DPTR MOV A,0CH
DJNZ R5,CONTACT_BOOK_PERSON_CONT_LOOP CALL INS
DJNZ R1,CONTACT_BOOK_PERSON_CONT MOV A,0AH
CONTACT_BOOK_PERSON_READ: CALL INS
MOV R3,#54 MOV A,0BH
MOV R1,#30H CALL INS
CONTACT_BOOK_PERSON_DISPLAY: MOV R0,#4
CALL MEMORY_READ MOV R1,#25H
MOV @R1,A WRT_IN_ONE_PAGE_READ_ONE_LETTER:
INC DPTR MOV A,R2
INC R1 MOVC A,@A+DPTR
DJNZ R3,CONTACT_BOOK_PERSON_DISPLAY MOV @R1,A
CALL BLACK DEC R1
JB 6FH,CONTACT_BOOK_NORMAL_DISPLAY INC R2
LJMP CONFIRM_SEND_PERSON DJNZ R0,WRT_IN_ONE_PAGE_READ_ONE_LETTER
CONTACT_BOOK_NORMAL_DISPLAY: MOV R0,#6
LJMP NMCARD WRT_IN_ONE_PAGE_DISPLAY:
;---------------------WRT IN TWO PAGE--- MOV C,15H
WRT_IN_ONE_PAGE: MOV B.7,C
MOV 0CH,18H ;0CH IS THE PAGE ADDRESS MOV A,22H
;0AH AND 0BH STORE THE COLUMN ADDRESS RLC A
;;--------------CURSOR IS SET. MOV 22H,A
;-----TEST LOOP----- MOV C,1DH
WRT_IN_ONE_PAGE_LOOP: MOV B.6,C
CALL TRANSLATE_COLUMN_POINTER MOV A,23H
MOV R0,STR_START RLC A
MOV A,@R0 MOV 23H,A
CALL MATCH_OFFSET MOV C,25H
CALL WRT_IN_ONE_PAGE_ONE_LETTER MOV B.5,C
MOV A,19H MOV A,24H
ADD A,#6 RLC A
JNB F0, WRT_SMALL MOV 24H,A
ADD A,#6 MOV C,2DH
WRT_SMALL: MOV B.4,C
MOV 19H,A MOV A,25H

31
RLC A MOV 2CH,#'Y'
MOV 25H,A MOV 2DH,#' '
MOV C,B.7 CALL WRT_IN_ONE_PAGE
MOV ACC.7,C MOV 18H,#0B4H
MOV ACC.6,C MOV 19H,#68
MOV C,B.6 MOV STR_START,#26H
MOV ACC.5,C MOV STR_LEN,#4
MOV ACC.4,C MOV 26H,#'I'
MOV C,B.5 MOV 27H,#'N'
MOV ACC.3,C MOV 28H,#'F'
MOV ACC.2,C MOV 29H,#'O'
MOV C,B.4 CALL WRT_IN_ONE_PAGE
MOV ACC.1,C MOV 18H,#0B6H
MOV ACC.0,C MOV 19H,#20
CPL A MOV STR_START,#26H
CALL DTA MOV STR_LEN,#8
CALL DTA MOV 26H,#'I'
JNB F0,WRT_IN_ONE_PAGE_DISPLAY_SMALL MOV 27H,#'N'
CALL DTA MOV 28H,#'F'
CALL DTA MOV 29H,#'R'
WRT_IN_ONE_PAGE_DISPLAY_SMALL: MOV 2AH,#'A'
DJNZ R0, WRT_IN_ONE_PAGE_DISPLAY MOV 2BH,#'R'
INC 0CH MOV 2CH,#'E'
DJNZ R3, WRT_IN_ONE_PAGE_HALF_LETTER MOV 2DH,#'D'
;RESET POINTERS CALL WRT_IN_ONE_PAGE
MOV DPTR,#LETTER_TABLE MOV 18H,#0B8H
DEC 0CH MOV 19H,#20
DEC 0CH MOV STR_START,#26H
RET;RETURN OF WRT ONE LETTER IN ONE PAGE MOV STR_LEN,#8
;------------------------------------- MOV 26H,#'S'
START_MENU: MOV 27H,#'C'
CALL BLACK MOV 28H,#'R'
MOV 18H,#0B1H MOV 29H,#'E'
MOV 19H,#40 MOV 2AH,#'E'
SETB F0 MOV 2BH,#'N'
MOV STR_START,#26H MOV 2CH,#' '
MOV STR_LEN,#4 MOV 2DH,#'S'
MOV 26H,#'M' CALL WRT_IN_ONE_PAGE
MOV 27H,#'E' MOV 18H,#0B8H
MOV 28H,#'N' MOV 19H,#68
MOV 29H,#'U' MOV STR_START,#26H
CALL WRT_IN_ONE_PAGE MOV STR_LEN,#4
MOV 18H,#0B4H MOV 26H,#'A'
MOV 19H,#20 MOV 27H,#'V'
CLR F0 MOV 28H,#'E'
MOV STR_START,#26H MOV 29H,#'R'
MOV STR_LEN,#8 CALL WRT_IN_ONE_PAGE
MOV 26H,#'D' MOV 18H,#0BAH
MOV 27H,#'I' MOV 19H,#20
MOV 28H,#'S' MOV STR_START,#26H
MOV 29H,#'P' MOV STR_LEN,#8
MOV 2AH,#'L' MOV 26H,#'C'
MOV 2BH,#'A' MOV 27H,#'O'

32
MOV 28H,#'N' START_MENU_UP_END:
MOV 29H,#'T' JNB UP,START_MENU_UP_END
MOV 2AH,#'A' LJMP START_MENU_LOOP
MOV 2BH,#'C' START_MENU_DOWN :
MOV 2CH,#' T' CALL ERASE_ARROW
MOV 2DH,#' ' MOV R0,18H
CALL WRT_IN_ONE_PAGE CJNE R0,#0B4H,START_MENU_DOWN0
MOV 18H,#0B6H
MOV 18H,#0BAH CALL WRITE_ARROW
MOV 19H,#68 SJMP START_MENU_DOWN_END
MOV STR_START,#26H START_MENU_DOWN0:
MOV STR_LEN,#4 CJNE R0,#0B6H,START_MENU_DOWN1
MOV 26H,#'B' MOV 18H,#0B8H
MOV 27H,#'O' CALL WRITE_ARROW
MOV 28H,#'O' SJMP START_MENU_DOWN_END
MOV 29H,#'K' START_MENU_DOWN1:
CALL WRT_IN_ONE_PAGE CJNE R0,#0B8H,START_MENU_DOWN2
MOV 18H,#0B4H MOV 18H,#0BAH
CALL WRITE_ARROW CALL WRITE_ARROW
UP EQU P0.5 SJMP START_MENU_DOWN_END
DOWN EQU P0.6 START_MENU_DOWN2:
ENTER EQU P0.7 MOV 18H,#0B4H
SETB UP CALL WRITE_ARROW
SETB DOWN START_MENU_DOWN_END:
SETB ENTER JNB DOWN,START_MENU_DOWN_END
START_MENU_LOOP: LJMP START_MENU_LOOP
JNB UP,START_MENU_UP START_MENU_RETURN :
; CALL LONG_DELAY MOV 10H,#5
JNB DOWN,START_MENU_DOWN START_MENU_RETURN_LOOP:
;CALL LONG_DELAY CALL ERASE_ARROW
JNB ENTER,START_MENU_RETURN CALL LONG_DELAY
;CALL LONG_DELAY CALL LONG_DELAY
SJMP START_MENU_LOOP CALL WRITE_ARROW
START_MENU_UP: CALL LONG_DELAY
CALL ERASE_ARROW CALL LONG_DELAY
MOV R0,18H DJNZ 10H, START_MENU_RETURN_LOOP
CJNE R0,#0B4H,START_MENU_UP0 RET
MOV 18H,#0BAH ;WHEN IT RETURN,
CALL WRITE_ARROW WRITE_ARROW:
SJMP START_MENU_UP_END MOV 19H,#01
START_MENU_UP0: SETB F0
CJNE R0,#0B6H,START_MENU_UP1 MOV STR_START,#26H
MOV 18H,#0B4H MOV STR_LEN,#1
CALL WRITE_ARROW MOV 26H,#3EH
SJMP START_MENU_UP_END CALL WRT_IN_ONE_PAGE
START_MENU_UP1: RET
CJNE R0,#0B8H,START_MENU_UP2 ERASE_ARROW:
MOV 18H,#0B6H MOV 19H,#01
CALL WRITE_ARROW SETB F0
SJMP START_MENU_UP_END MOV STR_START,#26H
START_MENU_UP2: MOV STR_LEN,#1
MOV 18H,#0B8H MOV 26H,#20H
CALL WRITE_ARROW CALL WRT_IN_ONE_PAGE

33
RET SJMP INFRARED_CONFIRM_LOOP
;---------------------------------------------------------------- INFRARED_CONFIRM_UP:
;------------when receive a infrared--------------- CALL ERASE_ARROW
INFRARED_CONFIRM: MOV R0,18H
MOV 18H,#0B1H CJNE R0,#0B7H,INFRARED_CONFIRM_UP0
MOV 19H,#30 MOV 18H,#0B9H
MOV STR_START,#31H CALL WRITE_ARROW
MOV STR_LEN,30H SJMP INFRARED_CONFIRM_UP_END
CLR F0 INFRARED_CONFIRM_UP0:
CALL WRT_IN_ONE_PAGE MOV 18H,#0B7H
MOV 18H,#0B4H CALL WRITE_ARROW
MOV 19H,#20 INFRARED_CONFIRM_UP_END:
MOV STR_START,#26H JNB UP,INFRARED_CONFIRM_UP_END
MOV STR_LEN,#8 AJMP INFRARED_CONFIRM_LOOP
CLR F0 INFRARED_CONFIRM_DOWN :
MOV 26H,#'A' CALL ERASE_ARROW
MOV 27H,#'C' MOV R0,18H
MOV 28H,#'C' CJNE R0,#0B7H,INFRARED_CONFIRM_DOWN0
MOV 29H,#'E' MOV 18H,#0B9H
MOV 2AH,#'P' CALL WRITE_ARROW
MOV 2BH,#'T' SJMP INFRARED_CONFIRM_DOWN_END
MOV 2CH,#' ' INFRARED_CONFIRM_DOWN0:
MOV 2DH,#'U' MOV 18H,#0B7H
CALL WRT_IN_ONE_PAGE CALL WRITE_ARROW
MOV 19H,#68 INFRARED_CONFIRM_DOWN_END:
MOV STR_START,#26H JNB DOWN,INFRARED_CONFIRM_DOWN_END
MOV STR_LEN,#4 LJMP INFRARED_CONFIRM_LOOP
MOV 26H,#'S' INFRARED_CONFIRM_RETURN :
MOV 27H,#'E' MOV 10H,#4
MOV 28H,#'R' INFRARED_CONFIRM_RETURN_LOOP:
MOV 29H,#'?' CALL ERASE_ARROW
CALL WRT_IN_ONE_PAGE CALL LONG_DELAY
MOV 18H,#0B7H CALL LONG_DELAY
MOV 19H,#20 CALL WRITE_ARROW
MOV STR_START,#26H CALL LONG_DELAY
MOV STR_LEN,#3 CALL LONG_DELAY
MOV 26H,#'Y' DJNZ 10H, INFRARED_CONFIRM_RETURN_LOOP
MOV 27H,#'E' RET
MOV 28H,#'S' ;WHEN IT RETURN,
CALL WRT_IN_ONE_PAGE ;--------------------------------------------------------
MOV 18H,#0B9H TRANSLATE_COLUMN_POINTER:
MOV 19H,#20 MOV A,19H
MOV STR_START,#26H ANL A,#0F0H
MOV STR_LEN,#2 SWAP A
MOV 26H,#'N' ADD A,#10H
MOV 27H,#'O' MOV 0AH,A
CALL WRT_IN_ONE_PAGE MOV A,19H
MOV 18H,#0B7H ANL A,#0FH
CALL WRITE_ARROW MOV 0BH,A;09H AND 0AH NOW IS THE COMMAND TO SET THE
INFRARED_CONFIRM_LOOP: COLUMN
JNB UP, INFRARED_CONFIRM_UP RET
JNB DOWN, INFRARED_CONFIRM_DOWN ;take A as an ascii code and match it to and offset
JNB ENTER, INFRARED_CONFIRM_RETURN MATCH_OFFSET:

34
CJNE A,#3FH,MATCH_UNDERSCORE DB 000000B ;0
MOV OFFSET,#42 DB 001000B ;1
RET DB 011000B
MATCH_UNDERSCORE: DB 001000B
CJNE A,#5FH,MATCH_ARROW DB 001000B
MOV OFFSET,#41 DB 001000B
RET DB 001000B
MATCH_ARROW: DB 011100B
CJNE A,#3EH,MATCH_BLANK DB 000000B
MOV OFFSET,#40 DB 011100B ;2
RET DB 100010B
MATCH_BLANK:;BLANK DB 000010B
CJNE A,#20H,MATCH_DOT DB 000100B
MOV OFFSET,#38;BLANK DB 001000B
RET DB 010000B
MATCH_DOT:;DOT DB 111110B
CJNE A,#2EH,MATCH_NUMBERS DB 000000B
MOV OFFSET,#37 DB 111110B ;3
RET DB 000100B
MATCH_NUMBERS:;NUMBERS AND ':' DB 001000B
CJNE A,#3AH,MATCH_NUMBERS_NEXT DB 000100B
MOV OFFSET,#39;':' DB 000010B
RET DB 100010B
MATCH_NUMBERS_NEXT: DB 011100B
JNB CY,MATCH_LETTERS DB 000000B
CLR C DB 000100B ;4
SUBB A,#48 DB 001100B
MOV OFFSET,A DB 010100B
RET DB 100100B
MATCH_LETTERS:;LETTERS AND '@' DB 111110B
CJNE A,#5AH,MATCH_LETTERS_NEXT DB 000100B
MOV OFFSET,#36 DB 000100B
RET DB 000000B
MATCH_LETTERS_NEXT: DB 111110B ;5
JNB CY,MATCH_LETTER_LOWER_CASE DB 100000B
CLR C DB 111100B
SUBB A,#54 DB 000010B
MOV OFFSET,A DB 000010B
RET DB 100010B
MATCH_LETTER_LOWER_CASE: DB 011100B
CLR C DB 000000B
SUBB A,#86 DB 001100B ;6
MOV OFFSET,A DB 010000B
RET;RET OF MATCH_OFFSET DB 100000B
;---------------------------------------------------------------------------------------- DB 111100B
LETTER_TABLE: DB 100010B
DB 011100B ;0 DB 100010B
DB 100010B ;0 DB 011100B
DB 100110B; 0 DB 000000B
DB 101010B ;0 DB 111110B ;7
DB 110010B ;0 DB 000010B
DB 100010B ;0 DB 000100B
DB 011100B ;0 DB 001000B

35
DB 010000B DB 100100B
DB 010000B DB 100010B
DB 010000B DB 100010B
DB 000000B DB 100010B
DB 011100B ;8 DB 100100B
DB 100010B DB 111000B
DB 100010B DB 000000B
DB 011100B DB 111110B ;E
DB 100010B DB 100000B
DB 100010B DB 100000B
DB 011100B DB 111100B
DB 000000B DB 100000B
DB 11100B ;9 DB 100000B
DB 100010B DB 111110B
DB 100010B DB 000000B
DB 011110B DB 111110B ;F
DB 000010B DB 100000B
DB 000100B DB 100000B
DB 011000B DB 111100B
DB 000000B DB 100000B
DB 011100B ;AT --INDEX 10 DB 100000B
DB 100010B DB 100000B
DB 000010B DB 000000B
DB 011010B DB 011100B ;G
DB 101010B DB 100010B
DB 101010B DB 100000B
DB 011100B DB 101110B
DB 000000B DB 100010B
DB 011100B ;A---INDEX 11 DB 100010B
DB 100010B DB 011110B
DB 100010B DB 000000B
DB 100010B DB 100010B ;H
DB 111110B DB 100010B
DB 100010B DB 100010B
DB 100010B DB 111110B
DB 000000B DB 100010B
DB 111100B ;B DB 100010B
DB 100010B DB 100010B
DB 100010B DB 000000B
DB 111100B DB 011100B ;I
DB 100010B DB 001000B
DB 100010B DB 001000B
DB 111100B DB 001000B
DB 000000B DB 001000B
DB 011100B ;C DB 001000B
DB 100010B DB 011100B
DB 100000B DB 000000B
DB 100000B DB 001110B ;J
DB 100000B DB 000100B
DB 100010B DB 000100B
DB 011100B DB 000100B
DB 000000B DB 000100B
DB 111000B ;D DB 100100B

36
DB 011000B DB 100010B
DB 000000B DB 101010B
DB 100010B ;K DB 100100B
DB 100100B DB 011010B
DB 101000B DB 000000B
DB 110000B DB 111100B ;R
DB 101000B DB 100010B
DB 100100B DB 100010B
DB 100010B DB 111100B
DB 000000B DB 101000B
DB 100000B ;L DB 100100B
DB 100000B DB 100010B
DB 100000B DB 000000B
DB 100000B DB 011100B ;S
DB 100000B DB 100010B
DB 100000B DB 100000B
DB 111110B DB 011100B
DB 000000B DB 000010B
DB 100010B ;M DB 100010B
DB 110110B DB 011100B
DB 101010B DB 000000B
DB 101010B DB 111110B ;T
DB 100010B DB 001000B
DB 100010B DB 001000B
DB 100010B DB 001000B
DB 000000B DB 001000B
DB 100010B ;N DB 001000B
DB 100010B DB 001000B
DB 110010B DB 000000B
DB 101010B DB 100010B ;U
DB 100110B DB 100010B
DB 100010B DB 100010B
DB 100010B DB 100010B
DB 000000B DB 100010B
DB 011100B ;O DB 100010B
DB 100010B DB 011100B
DB 100010B DB 000000B
DB 100010B DB 100010B ;V
DB 100010B DB 100010B
DB 100010B DB 100010B
DB 011100B DB 100010B
DB 000000B DB 100010B
DB 111100B ;P DB 010100B
DB 100010B DB 001000B
DB 100010B DB 000000B
DB 111100B DB 100010B ;W
DB 100000B DB 100010B
DB 100000B DB 100010B
DB 100000B DB 101010B
DB 000000B DB 101010B
DB 011100B ;Q DB 101010B
DB 100010B DB 010100B
DB 100010B DB 000000B

37
DB 100010B ;X DB 001000B
DB 100010B DB 000000B
DB 010100B DB 000000B
DB 001000B DB 000000B;'_'--------INDEX 41
DB 010100B DB 000000B
DB 100010B DB 000000B
DB 100010B DB 000000B
DB 000000B DB 000000B
DB 100010B ;Y DB 000000B
DB 100010B DB 111110B
DB 100010B DB 000000B
DB 010100B DB 011100B;'_'--------INDEX 42
DB 001000B DB 100010B
DB 001000B DB 000010B
DB 001000B DB 000100B
DB 000000B DB 001000B
DB 111110B ;Z --------INDEX 36 DB 000000B
DB 000010B DB 001000B
DB 000100B DB 000000B
DB 001000B
DB 010000B
DB 100000B
DB 111110B
DB 000000B
DB 000000B ;A DOT --INDEX 37
DB 000000B
DB 000000B
DB 000000B
DB 000000B
DB 011000B
DB 011000B
DB 000000B
DB 000000B ;BLANK --INDEX 38
DB 000000B
DB 000000B
DB 000000B
DB 000000B
DB 000000B
DB 000000B
DB 000000B
DB 000000B; ':' ----------INDEX 39
DB 011000B
DB 011000B
DB 000000B
DB 011000B
DB 011000B
DB 000000B
DB 000000B
DB 000000B;ARROW--------INDEX 40
DB 001000B
DB 000100B
DB 111110B
DB 000100B

38

Das könnte Ihnen auch gefallen