MPASM 5.46 AT89C2051_PROGRAMMER.ASM :21:50 PAGE 1 VALUE

Similar documents
Outlines. PIC Programming in C and Assembly. Krerk Piromsopa, Ph.D. Department of Computer Engineering Chulalongkorn University

Lecture (04) PIC16F84A (3)

PIC 16F84A programming (II)

Hardware Interfacing. EE25M Introduction to microprocessors. Part V. 15 Interfacing methods. original author: Feisal Mohammed

Lesson 14. Title of the Experiment: Introduction to Microcontroller (Activity number of the GCE Advanced Level practical Guide 27)

Embedded System Design

Assembly Language Instructions

EEE111A/B Microprocessors

Chapter 4 Sections 1 4, 10 Dr. Iyad Jafar

CIS-331 Exam 2 Fall 2015 Total of 105 Points Version 1

UNIVERSITY OF ULSTER UNIVERSITY EXAMINATIONS : 2001/2002 RESIT. Year 2 MICROCONTROLLER SYSTEMS. Module Code: EEE305J1. Time allowed: 3 Hours

UNIVERSITY OF ULSTER UNIVERSITY EXAMINATIONS : 2001/2002. Semester 2. Year 2 MICROCONTROLLER SYSTEMS. Module Code: EEE305J2. Time allowed: 3 Hours

Embedded Systems. PIC16F84A Sample Programs. Eng. Anis Nazer First Semester

PIC Discussion. By Eng. Tamar Jomaa

AN587. Interfacing to an LCD Module. Interfacing to an LCD Module INTRODUCTION OPERATION CONTROL SIGNAL FUNCTIONS TABLE 2: CONDITIONAL ASSEMBLY FLAGS

PIC16F87X 13.0 INSTRUCTION SET SUMMARY INSTRUCTIONS DESCRIPTIONS

CIS-331 Fall 2013 Exam 1 Name: Total of 120 Points Version 1

4. Specifications and Additional Information

University of Jordan Faculty of Engineering and Technology Department of Computer Engineering Embedded Systems Laboratory

Flow Charts and Assembler Programs

Computer Engineering Capstone Design Summer A : Handheld Video Games

Week1. EEE305 Microcontroller Key Points

CIS-331 Exam 2 Fall 2014 Total of 105 Points. Version 1

CIS-331 Fall 2014 Exam 1 Name: Total of 109 Points Version 1

C1098 JPEG Module User Manual

ECE Homework #3

TOPIC 3 INTRODUCTION TO PIC ASSEMBLY LANGUAGE. E4160 Microprocessor & Microcontroller System. Prepared by : Puziah Yahaya JKE, POLISAS / DEC 2010

16.317: Microprocessor Systems Design I Fall 2013 Exam 3 Solution

CIS-331 Exam 2 Spring 2016 Total of 110 Points Version 1

Binary Outputs and Timing

PIC16C63A/65B/73B/74B

CIS-331 Spring 2016 Exam 1 Name: Total of 109 Points Version 1

which means that writing to a port implies that the port pins are first read, then this value is modified and then written to the port data latch.

LAB WORK 2. 1) Debugger-Select Tool-MPLAB SIM View-Program Memory Trace the program by F7 button. Lab Work

CENG 336 INT. TO EMBEDDED SYSTEMS DEVELOPMENT. Spring 2006

PIC16F /40-Pin 8-Bit CMOS FLASH Microcontrollers. Devices Included in this Data Sheet: Pin Diagram PDIP. Microcontroller Core Features:

Target Board PIC877-TB - Reference Manual

EE6008-Microcontroller Based System Design Department Of EEE/ DCE

SOLUTIONS!! DO NOT DISTRIBUTE!!

When JP1 is cut, baud rate is Otherwise, baud rate is Factory default is that JP1 is shorted. (JP1 is jumper type in some model)

APPLICATION NOTE 2361 Interfacing an SPI-Interface RTC with a PIC Microcontroller

PIC16F870/ /40-Pin, 8-Bit CMOS FLASH Microcontrollers. Devices Included in this Data Sheet: Pin Diagram. Microcontroller Core Features:

PIC16F87X. 28/40-pin 8-Bit CMOS FLASH Microcontrollers. Devices Included in this Data Sheet: Pin Diagram PDIP. Microcontroller Core Features:

APPLICATION NOTE Wire Communication with a Microchip PICmicro Microcontroller

Instuction set

D:\PICstuff\PartCounter\PartCounter.asm

/* PROGRAM FOR BLINKING LEDs CONEECTED TO PORT-D */

Section 4. Architecture

CIS-331 Final Exam Spring 2015 Total of 115 Points. Version 1

Section 11. Timer0. Timer0 HIGHLIGHTS. This section of the manual contains the following major topics:

PIC16F7X Data Sheet. 28/40-pin, 8-bit CMOS FLASH Microcontrollers Microchip Technology Inc. DS30325B

Embedded Systems Programming and Architectures

ECE Test #1: Name

Dept. of Computer Engineering Final Exam, First Semester: 2016/2017

CIS-331 Final Exam Spring 2018 Total of 120 Points. Version 1

DHANALAKSHMI COLLEGE OF ENGINEERING, CHENNAI DEPARTMENT OF ELECTRICAL AND ELECTRONICS ENGINEERING. EE Microcontroller Based System Design

PIC16C84. 8-bit CMOS EEPROM Microcontroller PIC16C84. Pin Diagram. High Performance RISC CPU Features: CMOS Technology: Peripheral Features:

SOLAR TRACKING SYSTEM USING PIC16F84A STEPPER MOTOR AND 555TIMER

CONNECT TO THE PIC. A Simple Development Board

Interfacing PIC Microcontrollers. ADC8BIT2 Schematic. This application demonstrates analogue input sampling

Chapter 10 Sections 1,2,9,10 Dr. Iyad Jafar

Experiment 7:The USART

movwf prevcod ; a new button is pressed - rcnt=3 movwf (mtx_buffer+1) movlw 3 movwf rcnt

PIC16F84A 7.0 INSTRUCTION SET SUMMARY INSTRUCTIONS DESCRIPTIONS

ME 6405 Introduction to Mechatronics

DHANALAKSHMI COLLEGE OF ENGINEERING, CHENNAI DEPARTMENT OF ELECTRICAL AND ELECTRONICS ENGINEERING. EE6008 Microcontroller based system design

Gateway Ascii Command Protocol

PIC16F87XA Data Sheet

The cache is 4-way set associative, with 4-byte blocks, and 16 total lines

Timer2 Interrupts. NDSU Timer2 Interrupts September 20, Background:

Chapter 13. PIC Family Microcontroller

PIC PROGRAMMING START. The next stage is always the setting up of the PORTS, the symbol used to indicate this and all Processes is a Rectangle.

Arithmetic,logic Instruction and Programs

ĐẠI HỌC QUỐC GIA TP.HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA ĐIỆN-ĐIỆN TỬ BỘ MÔN KỸ THUẬT ĐIỆN TỬ. Embedded System Design

PIC16C432 OTP 8-Bit CMOS MCU with LIN bus Transceiver

Section 13. Timer0 HIGHLIGHTS. Timer0. This section of the manual contains the following major topics:

M PIC16F84A. 18-pinEnhanced FLASH/EEPROM 8-Bit Microcontroller. High Performance RISC CPU Features: Pin Diagrams. Peripheral Features:

EECE.3170: Microprocessor Systems Design I Summer 2017 Homework 5 Solution

Learning Objectives:

CENG-336 Introduction to Embedded Systems Development. Timers

Outline. Micriprocessor vs Microcontroller Introduction to PIC MCU PIC16F877 Hardware:

S w e d i s h c r. w e e b l y. c o m j a l i l a h m e l i v e. c o m Page 1

Laboratory Exercise 5 - Analog to Digital Conversion

Application Note - PIC Source Code v1.1.doc


PIC16F8X 18-pin Flash/EEPROM 8-Bit Microcontrollers

UNH-IOL MIPI Alliance Test Program

PIC16F8X. 8-Bit CMOS Flash/EEPROM Microcontrollers PIC16F8X PIC16CR8X. Pin Diagram. Devices Included in this Data Sheet:

SOLUTIONS!! DO NOT DISTRIBUTE PRIOR TO EXAM!!

MC68705P3 Bootstrap ROM

Fortune. Semiconductor Corporation 富晶半導體股份有限公司. 8-bit MCU with 1k program ROM, 64-byte RAM, 1 R2F module and 3 13 LCD driver. TD Rev. 1.

DESIGN AND FABRICATION OF FARE METER OF TAXICAB USING MICROCONTROLLER

Performance & Applications

PIC16F84A. 18-pin Enhanced Flash/EEPROM 8-Bit Microcontroller. Devices Included in this Data Sheet: Pin Diagrams. High Performance RISC CPU Features:

Hong Kong Institute of Vocational Education Digital Electronics & Microcontroller. 8. Microcontroller

NH-67, TRICHY MAIN ROAD, PULIYUR, C.F , KARUR DT. DEPARTMENT OF ELECTRONICS AND COMMUNICATION ENGINEERING COURSE MATERIAL

Arithmetic and Logic Instructions. Hsiao-Lung Chan Dept Electrical Engineering Chang Gung University, Taiwan

The University of Texas at Arlington Lecture 5

RS 232 PINOUTS. 1. We use RJ12 for all of our RS232 interfaces (Link-2-Modbus & Link-2-PC- Serial/RS232). The diagram below shows our pin out.

Appendix D: Source Codes. PDF created with pdffactory Pro trial version

Transcription:

MPASM 5.46 AT89C2051_PROGRAMMER.ASM 7-30-2013 8:21:50 PAGE 1 00001 LIST N=102 00002 ; 00003 ; 00004 ; 00005 ; 00006 ; 00007 ; 00008 ; 00009 ; 00010 ; 00011 ; 00012 ; 00013 ; 00014 ; 00015 ; 00016 ; 00017 ; 00018 ; 00019 ; 00020 ; _ 00021 ; / \ ( _ )/ _ \ / \ / _ \ / 00022 ; / _ \ / _ \ (_) ) \ 00023 ; / \ (_) \, / / _ ) 00024 ; /_/ \_\_ \ / /_/ \ \ / / _ 00025 ; 00026 ; 00027 ; _ \ 00028 ; _) ' / _ \ / _` ' / _` '_ ` _ \ '_ ` _ \ / _ \ ' 00029 ; / (_) (_ (_ / 00030 ; _ _ \ / \, _ \,_ _ _ _ _ _ _ \ _ 00031 ; / 00032 ; 00033 ; 00034 ; 00035 ; 00036 ; 00037 ; 00038 ; 00039 ; 00040 ; 00041 ; 00042 ; 00043 ; 00044 ; 00045 ; 00046 ; 00047 ; 00048 ; 00049 ; 00050 ; 00051 ; 00052 ; 00053 ; 00054 ; 00055 ; 00056 ; 00057 ; 00058 ; 00059 ; 00060 ; 00061 ; 00062 ; 00063 ; 00064 ; 00065 ; 00066 ; 00067 ; 00068 ; 00069 ; 00070 ; 00071 ; 00072 ; 00073 ; 00074 ; 00075 ; 00076 ; 00077 ; 00078 ; 00079 ; 00080 ; Copyright (C) 2013 VICTOR MOISEY. 00081 ; Permission is granted to copy, distribute and/or modify this document 00082 ; under the terms of the GNU Free Documentation License, Version 1.3 00083 ; or any later version published by the Free Software Foundation; 00084 ; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. 00085 ; A copy of the license is included in the section entitled "GNU 00086 ; Free Documentation License". 00087 ; 00088 ; 00089 ; 00090 ; 00091 ; 00092 ; 00093 TITLE ""

MPASM 5.46 AT89C2051_PROGRAMMER.ASM 7-30-2013 8:21:50 PAGE 2 00094 PAGE

MPASM 5.46 AT89C2051_PROGRAMMER.ASM 7-30-2013 8:21:50 PAGE 3 00095 PAGE 00096 #INCLUDE P16F877.INC 00001 LIST 00002 00003 ;========================================================================== 00004 ; MPASM PIC16F877 processor include 00005 ; 00006 ; (c) Copyright 1999-2012 Microchip Technology, All rights reserved 00007 ;========================================================================== 00008 00540 LIST 2007 3F71 00097 CONFIG _XT_OSC&_WDT_OFF&_PWRTE_ON&_LVP_OFF 2000 0000 0000 0003 00098 IDLOCS 0051 ; 33H 0003 00099 00100 00101 ;.---------.-------------------.---------------------.-----------------------------. 00102 ; PIN NAME DESIGNATION DISCRIPTION 00103 ; ---------+-------------------+---------------------+----------------------------- 00104 ; 2 RA0/AN0 PRESS SWITCH DIGITAL INPUT 00105 ; 3 RA1/AN1 NOT USED DIGITAL OUTPUT 00106 ; 4 RA2/AN2/Vref- NOT USED DIGITAL OUTPUT 00107 ; 5 RA3/AN3/Vref+ NOT USED DIGITAL OUTPUT 00108 ; 6 RA4/T0CKI NOT USED DIGITAL OUTPUT 00109 ; 7 RA5/AN4/SS NOT USED DIGITAL OUTPUT 00110 ; 00111 ; 33 RB0/INT DATA IN/OUT DIGITAL I/O PULLED UP 00112 ; 34 RB1 DATA IN/OUT DIGITAL I/O PULLED UP 00113 ; 35 RB2 DATA IN/OUT DIGITAL I/O PULLED UP 00114 ; 36 RB3/PGM DATA IN/OUT DIGITAL I/O PULLED UP 00115 ; 37 RB4 DATA IN/OUT DIGITAL I/O PULLED UP 00116 ; 38 RB5 DATA IN/OUT DIGITAL I/O PULLED UP 00117 ; 39 RB6/PGC DATA IN/OUT DIGITAL I/O PULLED UP 00118 ; 40 RB7/PGD DATA IN/OUT DIGITAL I/O PULLED UP 00119 ; 00120 ; 15 RC0/T1OSO/T1CK1 RED DIGITAL OUTPUT 00121 ; 16 RC1/T1OSI/CCP2 GREEN DIGITAL OUTPUT 00122 ; 17 RC2/CCP1 BLUE DIGITAL OUTPUT 00123 ; 18 RC3/SCK/SCL NOT USED DIGITAL OUTPUT 00124 ; 23 RC4/SDI/SDA CTS DIGITAL OUTPUT 00125 ; 24 RC5/SDO RTS DIGITAL INPUT 00126 ; 25 RC6/TX/CK TX SERIAL OUTPUT 00127 ; 26 RC7/RX/DT RX SERIAL INPUT 00128 ; 00129 ; 19 RD0/PSP0 XTAL1 DIGITAL OUTPUT 00130 ; 20 RD1/PSP1 PROG DIGITAL OUTPUT 00131 ; 21 RD2/PSP2 P_33 DIGITAL OUTPUT 00132 ; 22 RD3/PSP3 P_34 DIGITAL OUTPUT 00133 ; 27 RD4/PSP4 P_35 DIGITAL OUTPUT 00134 ; 28 RD5/PSP5 VCC_OFF DIGITAL OUTPUT 00135 ; 29 RD6/PSP6 VPP_OFF DIGITAL OUTPUT 00136 ; 30 RD7/PSP7 _12V_5V DIGITAL OUTPUT 00137 ; 00138 ; 8 RE0/RD/AN5 NOT USED DIGITAL OUTPUT 00139 ; 9 RE1/WR/AN6 NOT USED DIGITAL OUTPUT 00140 ; 10 RE2/CS/AN7 NOT USED DIGITAL OUTPUT 00141 ; 00142 ; 12 VSS1-0V 00143 ; 31 VSS2-0V 00144 ; 11 VDD1 - +5V 00145 ; 32 VDD2 - +5V 00146 ; 00147 ; 1 MCLR/Vpp/THV - - 00148 ; 13 OSC1/CLKIN - - 00149 ; 14 OSC2/CLKOUT - - 00150 ; '---------'-------------------'---------------------'-----------------------------' 00151 ; 00152 ; CRYSTAL FREQUENCY = 3686400 Hertz. 00153 ; CYCLE TIME = 921600 Hertz/1,085 micro seconds. 00154 ;

MPASM 5.46 AT89C2051_PROGRAMMER.ASM 7-30-2013 8:21:50 PAGE 4 00155 PAGE 00156 00157 #DEFINE _Z STATUS,Z 00158 #DEFINE _C STATUS,C 00159 #DEFINE _DC STATUS,DC 00160 #DEFINE _RP0 STATUS,RP0 00161 #DEFINE RED PORTC,0 ; PROGRAMMER STATUS LED. 00162 #DEFINE GREEN PORTC,1 ; PROGRAMMER STATUS LED. 00163 #DEFINE BLUE PORTC,2 ; PROGRAMMER STATUS LED. 00164 #DEFINE PROG PORTD,1 00165 #DEFINE _12V_5V PORTD,7 ; 0=+12V, 1=+5V. 00166 #DEFINE XTAL1 PORTD,0 00167 #DEFINE VPP_OFF PORTD,6 ; 0=VPP, 1=VPP OFF. 00168 #DEFINE RTS PORTC,5 ; SERIAL PORT CONTROL. 00169 #DEFINE CTS PORTC,4 ; SERIAL PORT CONTROL. 00170 #DEFINE BUFFER_FLAG CONTROL,0 00171 #DEFINE PRESS_SWITCH PORTA,0 00172 #DEFINE BYTE_FLAG CONTROL,1 00173 #DEFINE BYTE_ERROR CONTROL,2 00174 #DEFINE ADDRESS_DIFFERENCE CONTROL,3 00175 00176 ;------------------------------------------------------------------------------------------------------- 00177 ; PORT C 00178 ; _12V_5V VPP_OFF VCC_OFF P_35 P_34 P_33 PROG XTAL1 00000000 00179 SIGNATURE_MODE EQU 000H ; 0 0 0 0 0 0 0 0 00000010 00180 READ_MODE EQU 010H ; 0 0 0 1 0 0 0 0 00000018 00181 WRITE_MODE EQU 018H ; 0 0 0 1 1 0 0 0 00000004 00182 ERASE_MODE EQU 004H ; 0 0 0 0 0 1 0 0 0000001C 00183 LOCK_MODE_1 EQU 01CH ; 0 0 0 1 1 1 0 0 0000000C 00184 LOCK_MODE_2 EQU 00CH ; 0 0 0 0 1 1 0 0 000000C0 00185 STEP_1 EQU 0C0H ; 0 0 1 1 0 0 0 0 00000082 00186 STEP_2 EQU 082H ; 1 0 0 0 0 0 1 0 00187 00188 ;------------------------------------------------------------------------------------------------------- 00189 00190 CBLOCK 20H 00000020 00191 SERIAL_BYTE 00000021 00192 BYTE_COUNT_HI 00000022 00193 BYTE_COUNT_LO 00000023 00194 D1 00000024 00195 D2 00000025 00196 D3 00000026 00197 HEX_ 00000027 00198 BYTE_COUNT 00000028 00199 SERIAL_BUFFER_COUNTER 00000029 00200 ADDRESS_HI 0000002A 00201 ADDRESS_LO 0000002B 00202 SERIAL_BUFFER:16 0000003B 00203 THIRTY_SEC_DELAY 0000003C 00204 CONTROL 0000003D 00205 BUFFER_BYTE 0000003E 00206 HEX_COUNTER 0000003F 00207 SIGNATURE_BYTE_COUNTER 00000040 00208 SIGNATURE_BYTE_0:3 00000043 00209 OFFSET 00000044 00210 TABLE_POINTER 00000045 00211 COLUMN_COUNTER 00000046 00212 ASCII_CHAR_HI 00000047 00213 ASCII_CHAR_LO 00000048 00214 MASTER_ADDR_LO 00000049 00215 MASTER_ADDR_HI 0000004A 00216 MODE 00217 ENDC 00218 ; BANK0 LIMIT: 7FH 00219 00220 ;-------------------------------------------------------------------------------------------------------

MPASM 5.46 AT89C2051_PROGRAMMER.ASM 7-30-2013 8:21:50 PAGE 5 00221 PAGE 00222 0000 00223 ORG 0 00224 0000 0185 00225 CLRF PORTA 0001 0186 00226 CLRF PORTB 0002 0187 00227 CLRF PORTC 0003 0188 00228 CLRF PORTD 0004 0189 00229 CLRF PORTE 00230 0005 1683 00231 BSF _RP0 ; BANK 1. 0006 3001 00232 MOVLW 1 0007 0085 00233 MOVWF TRISA ; RA5 TO RA1 - DIGITAL OUTPUTS. 00234 ; RA0 - DIGITAL INPUT. 0008 0186 00235 CLRF TRISB ; PORTB ALL OUTPUTS. 0009 0188 00236 CLRF TRISD ; ALL PINS DIGITAL OUTPUTS. 000A 0189 00237 CLRF TRISE ; RE0 TO RE2 - DIGITAL OUTPUTS. 000B 30E0 00238 MOVLW 0E0H ; RC7 TO RC5 - DIGITAL INPUT, RC4 TO RC0 - DIGITAL OUTPUT. 000C 0087 00239 MOVWF TRISC 000D 3006 00240 MOVLW 6 ; RA0-RA3, RA5, RE0-RE2 DIGITAL I/O. 000E 009F 00241 MOVWF ADCON1 00242 000F 1283 00243 BCF _RP0 ; BANK 0. 0010 01BC 00244 CLRF CONTROL 0011 1607 00245 BSF CTS 0012 2342 00246 CALL POWER_DOWN 00247 0013 01A8 00248 CLRF SERIAL_BUFFER_COUNTER 00249 0014 3011 00250 MOVLW 011H ; TIMER1-1:2 PRESCALE, OSCILLATOR IS SHUT OFF, INTERNAL 00251 ; CLOCK, TIMER 1 ON. 0015 0090 00252 MOVWF T1CON 00253 0016 1683 00254 BSF _RP0 ; BANK 1. 0017 3017 00255 MOVLW 23 ; 3,6864MHz CLOCK, 9600B/s, BRGH=1 0018 0099 00256 MOVWF SPBRG 0019 1518 00257 BSF TXSTA,BRGH ; BAUD RATE SELECT BIT - HIGH SPEED. 001A 1283 00258 BCF _RP0 ; BANK 0. 00259 001B 1798 00260 BSF RCSTA,SPEN ; ENABLE SYNCHRONOUS SERIAL PORT. 001C 1618 00261 BSF RCSTA,CREN ; ENABLE RECEPTION. 00262 001D 1683 00263 BSF _RP0 ; BANK 1. 001E 1698 00264 BSF TXSTA,TXEN ; ENABLE TRANSMISSION. 00265 001F 3057 00266 MOVLW 57H ; PORTB WEAK PULLUPS. 00267 ; INTEG - NO INFO IN MANUAL FOR THIS. 00268 ; T0CS, INTERNAL INSRTUCTION CYCLE CLOCK. 00269 ; T0SE, NOT RELEVANT. 00270 ; PSA, ASSIGNED TO TIMER0 MODULE. 00271 ; PS2:PS0, 1:256. 0020 0081 00272 MOVWF OPTION_REG 00273 0021 00274 L2340: 0021 1283 00275 BCF _RP0 ; BANK 0. 00276 0022 2333 00277 CALL LF 0023 230B 00278 CALL DRAW_LINE 00279 0024 2385 00280 CALL SIGN_ON 0025 23A1 00281 CALL CONFIGURATION 00282 0026 230B 00283 CALL DRAW_LINE 0027 2333 00284 CALL LF 00285 00286 ;------------------------------------------------------------------------------------------------------- 00287 0028 00288 MENU_LOOP: 00289 0028 2377 00290 CALL MENU 00291 0029 00292 MENU_LOOP_10: 0029 231A 00293 CALL GREEN_ON 002A 23A9 00294 CALL SOCKET_DEVICE 002B 2333 00295 CALL LF 002C 303E 00296 MOVLW ">" 002D 00A0 00297 MOVWF SERIAL_BYTE 002E 235A 00298 CALL SERIAL_OUT 002F 1207 00299 BCF CTS ; ALLOW BYTE FROM CONSOLE. 0030 2355 00300 CALL SERIAL_IN ; FETCH MENU BYTE. 0031 1607 00301 BSF CTS ; NO MORE BYTES FOR NOW. 00302 0032 307B 00303 MOVLW 07BH ; CONVERT LOWER CASE a-z TO UPPER CASE A-Z. 0033 0220 00304 SUBWF SERIAL_BYTE,W 0034 1803 00305 BTFSC _C 0035 283B 00306 GOTO $+6 ; SERIAL IN IS GREATER THAN a-z WINDOW. 0036 309F 00307 MOVLW -96-1 ; SERIAL IN IS WITHIN THE a-z WINDOW. 0037 0720 00308 ADDWF SERIAL_BYTE,W 0038 1C03 00309 BTFSS _C 0039 283B 00310 GOTO $+2 ; SERIAL IN IS LESS THAN THE a-z WINDOW. 003A 12A0 00311 BCF SERIAL_BYTE,5 ; CHANGE LOWER CASE TO UPPER CASE. 00312 003B 300D 00313 MOVLW 0DH ; CHANGE CARRIAGE RETURN TO AN "M" 003C 0620 00314 XORWF SERIAL_BYTE,W 003D 1D03 00315 BTFSS _Z 003E 2841 00316 GOTO $+3

MPASM 5.46 AT89C2051_PROGRAMMER.ASM 7-30-2013 8:21:50 PAGE 6 003F 304D 00317 MOVLW "M" 0040 00A0 00318 MOVWF SERIAL_BYTE 00319 0041 235A 00320 CALL SERIAL_OUT 0042 2333 00321 CALL LF 00322 0043 3039 00323 MOVLW "9" ; TEST FOR BINARY PROGRAM MODE. 0044 0620 00324 XORWF SERIAL_BYTE,W 0045 1903 00325 BTFSC _Z 0046 2870 00326 GOTO BINARY_PROGRAM 00327 0047 3034 00328 MOVLW "4" ; TEST FOR BINARY VERIFY MODE. 0048 0620 00329 XORWF SERIAL_BYTE,W 0049 1903 00330 BTFSC _Z 004A 208E 00331 CALL BINARY_VERIFY 00332 004B 3032 00333 MOVLW "2" ; TEST FOR READ DEVICE BINARY MODE. 004C 0620 00334 XORWF SERIAL_BYTE,W 004D 1903 00335 BTFSC _Z 004E 298F 00336 GOTO READ_DEVICE_BINARY 00337 004F 3037 00338 MOVLW "7" ; TEST FOR LOCK BITS MODE. 0050 0620 00339 XORWF SERIAL_BYTE,W 0051 1903 00340 BTFSC _Z 0052 29FC 00341 GOTO LOCK_BITS 00342 0053 3038 00343 MOVLW "8" ; TEST FOR HEX PROGRAM MODE. 0054 0620 00344 XORWF SERIAL_BYTE,W 0055 1903 00345 BTFSC _Z 0056 28D3 00346 GOTO HEX_PROGRAM 00347 0057 3035 00348 MOVLW "5" ; TEST FOR SIGNATURE MODE. 0058 0620 00349 XORWF SERIAL_BYTE,W 0059 1903 00350 BTFSC _Z 005A 29CC 00351 GOTO READ_SIGNATURE_BYTES 00352 005B 304D 00353 MOVLW "M" ; TEST FOR MENU. 005C 0620 00354 XORWF SERIAL_BYTE,W 005D 1903 00355 BTFSC _Z 005E 2828 00356 GOTO MENU_LOOP 00357 005F 3031 00358 MOVLW "1" ; TEST FOR READ DEVICE HEX. 0060 0620 00359 XORWF SERIAL_BYTE,W 0061 1903 00360 BTFSC _Z 0062 21A4 00361 CALL READ_DEVICE_HEX 00362 0063 3033 00363 MOVLW "3" ; TEST FOR HEX VERIFY. 0064 0620 00364 XORWF SERIAL_BYTE,W 0065 1903 00365 BTFSC _Z 0066 2133 00366 CALL HEX_VERIFY 00367 0067 3036 00368 MOVLW "6" ; TEST FOR BLANK CHECK. 0068 0620 00369 XORWF SERIAL_BYTE,W 0069 1903 00370 BTFSC _Z 006A 28A7 00371 GOTO BLANK_CHECK 00372 006B 3030 00373 MOVLW "0" ; TEST FOR ERASE. 006C 0620 00374 XORWF SERIAL_BYTE,W 006D 1903 00375 BTFSC _Z 006E 28BF 00376 GOTO ERASE_DEVICE 00377 006F 2829 00378 GOTO MENU_LOOP_10 00379 00380 ;------------------------------------------------------------------------------------------------------- 00381 0070 00382 BINARY_PROGRAM: 00383 0070 2348 00384 CALL RED_ON 00385 0071 237F 00386 CALL SEND_BINARY_FILE 00387 0072 2248 00388 CALL FILE_INPUT_DELAY 00389 0073 222B 00390 CALL CHIP_ERASE ; ERASE DEVICE AND SET ALL PINS TO ZERO. 00391 0074 237B 00392 CALL PROGRAMMING 00393 0075 235F 00394 CALL START_TIMER_2 00395 0076 3018 00396 MOVLW WRITE_MODE 0077 2277 00397 CALL SET_MODE 00398 0078 00399 L2457: 0078 2239 00400 CALL FETCH_BYTE ; FETCH BYTE FROM BUFFER. 0079 1C3C 00401 BTFSS BUFFER_FLAG ; TEST FOR BYTE VALIDITY. 007A 288A 00402 GOTO L2520 ; NO BYTE AVAILABLE. 007B 30FF 00403 MOVLW 0FFH ; FF'S ARE NOT PROGRAMMED. 007C 063D 00404 XORWF BUFFER_BYTE,W 007D 1903 00405 BTFSC _Z 007E 2887 00406 GOTO L2470 007F 083D 00407 MOVF BUFFER_BYTE,W ; TRANSFER BYTE TO AT89C2051. 0080 0086 00408 MOVWF PORTB 0081 2306 00409 CALL DELAY_500US 0082 1088 00410 BCF PROG ; PROGRAMMING PULSE. 0083 2884 00411 GOTO $+1 0084 2885 00412 GOTO $+1

MPASM 5.46 AT89C2051_PROGRAMMER.ASM 7-30-2013 8:21:50 PAGE 7 0085 1488 00413 BSF PROG 0086 2370 00414 CALL WAIT_PROG ; 2ms DELAY FOR PROGRAMMING CYCLE TO FINISH. 0087 00415 L2470: 0087 232A 00416 CALL INCREMENT_ADDRESS_COUNTER 00417 0088 236A 00418 CALL TOGGLE_RED 00419 0089 2878 00420 GOTO L2457 008A 00421 L2520: 008A 2342 00422 CALL POWER_DOWN 008B 0192 00423 CLRF T2CON ; STOP TIMER 2. 008C 237D 00424 CALL PROGRAMMING_COMPLETE 008D 2829 00425 GOTO MENU_LOOP_10 00426 00427 ;------------------------------------------------------------------------------------------------------- 00428 008E 00429 BINARY_VERIFY: 00430 008E 22CB 00431 CALL BLUE_ON 00432 008F 237F 00433 CALL SEND_BINARY_FILE 00434 0090 2248 00435 CALL FILE_INPUT_DELAY 00436 0091 2387 00437 CALL VERIFYING 00438 0092 235F 00439 CALL START_TIMER_2 00440 0093 3010 00441 MOVLW READ_MODE 0094 2277 00442 CALL SET_MODE 00443 0095 00444 L2840: 0095 2239 00445 CALL FETCH_BYTE ; FETCH BYTE FROM BUFFER. 0096 1C3C 00446 BTFSS BUFFER_FLAG ; TEST FOR BYTE VALIDITY. 0097 289F 00447 GOTO L2850 ; VALID BYTE NOT AVAILABLE, END OF FILE. 00448 0098 0806 00449 MOVF PORTB,W ; READ BYTE FROM DEVICE. 0099 063D 00450 XORWF BUFFER_BYTE,W 009A 1D03 00451 BTFSS _Z 009B 28A2 00452 GOTO L2860 ; VERIFY ERROR. 00453 009C 232A 00454 CALL INCREMENT_ADDRESS_COUNTER 00455 009D 2364 00456 CALL TOGGLE_BLUE 00457 009E 2895 00458 GOTO L2840 009F 00459 L2850: 009F 2395 00460 CALL VERIFY_SUCCESSFUL 00A0 2342 00461 CALL POWER_DOWN 00A1 2829 00462 GOTO MENU_LOOP_10 00A2 00463 L2860: 00A2 2342 00464 CALL POWER_DOWN 00A3 0192 00465 CLRF T2CON ; STOP TIMER 2. 00A4 2311 00466 CALL EMPTY_BUFFER 00A5 2397 00467 CALL VERIFY_ERROR 00A6 2829 00468 GOTO MENU_LOOP_10 00469 00470 ;------------------------------------------------------------------------------------------------------- 00471 00A7 00472 BLANK_CHECK: 00473 00A7 22CB 00474 CALL BLUE_ON 00475 00A8 3010 00476 MOVLW READ_MODE 00A9 2277 00477 CALL SET_MODE 00478 00AA 1788 00479 BSF _12V_5V ; VPP IS SET TO 5V. 00AB 1308 00480 BCF VPP_OFF ; VPP IS SWITCHED ON. 00AC 22DA 00481 CALL DELAY_10MS 00482 00AD 3008 00483 MOVLW 8 00AE 00A1 00484 MOVWF BYTE_COUNT_HI 00AF 00485 L2740: 00AF 01A2 00486 CLRF BYTE_COUNT_LO 00B0 00487 L2750: 00B0 0806 00488 MOVF PORTB,W 00B1 3AFF 00489 XORLW 0FFH 00B2 1D03 00490 BTFSS _Z 00B3 28BC 00491 GOTO L2760 ; DEVICE NOT BLANK. 00B4 232A 00492 CALL INCREMENT_ADDRESS_COUNTER 00493 00B5 0BA2 00494 DECFSZ BYTE_COUNT_LO,F 00B6 28B0 00495 GOTO L2750 00B7 0BA1 00496 DECFSZ BYTE_COUNT_HI,F 00B8 28AF 00497 GOTO L2740 00B9 2342 00498 CALL POWER_DOWN 00BA 2391 00499 CALL DEVICE_BLANK 00BB 2829 00500 GOTO MENU_LOOP_10 00BC 00501 L2760: 00BC 2342 00502 CALL POWER_DOWN 00BD 2393 00503 CALL DEVICE_NOT_BLANK 00BE 2829 00504 GOTO MENU_LOOP_10 00505 00506 ;------------------------------------------------------------------------------------------------------- 00507 00BF 00508 ERASE_DEVICE:

MPASM 5.46 AT89C2051_PROGRAMMER.ASM 7-30-2013 8:21:50 PAGE 8 00BF 23A3 00509 CALL PRESS_0 00C0 1207 00510 BCF CTS 00C1 2355 00511 CALL SERIAL_IN 00C2 1607 00512 BSF CTS 00C3 3030 00513 MOVLW "0" 00C4 0620 00514 XORWF SERIAL_BYTE,W 00C5 1D03 00515 BTFSS _Z 00C6 28D1 00516 GOTO $+11 00C7 23A5 00517 CALL PRESS_STAR 00C8 1207 00518 BCF CTS 00C9 2355 00519 CALL SERIAL_IN 00CA 1607 00520 BSF CTS 00CB 302A 00521 MOVLW "*" 00CC 0620 00522 XORWF SERIAL_BYTE,W 00CD 1D03 00523 BTFSS _Z 00CE 28D1 00524 GOTO $+3 00CF 222B 00525 CALL CHIP_ERASE 00D0 2829 00526 GOTO MENU_LOOP_10 00D1 23A7 00527 CALL DEVICE_NOT_ERASED 00D2 2829 00528 GOTO MENU_LOOP_10 00529 00530 ;------------------------------------------------------------------------------------------------------- 00531 00D3 00532 HEX_PROGRAM: 00533 00D3 2348 00534 CALL RED_ON ; RED LED INDICATES PROGRAMMING MODE. 00535 00D4 2381 00536 CALL SEND_HEX_FILE ; PROMPT USER. 00537 00D5 2248 00538 CALL FILE_INPUT_DELAY ; WAIT FOR FILE TO BE SENT. 00539 00D6 222B 00540 CALL CHIP_ERASE ; ERASE DEVICE AND SET ALL SOCKET PINS TO ZERO. 00541 00D7 237B 00542 CALL PROGRAMMING ; INFORM USER. 00543 00D8 235F 00544 CALL START_TIMER_2 ; FLASH RED LED WHILE PROGRAMMING. 00545 00D9 01C8 00546 CLRF MASTER_ADDR_LO ; KEEP TRACK OF INPUT BYTE ADDRESSES. 00DA 01C9 00547 CLRF MASTER_ADDR_HI 00548 00DB 3018 00549 MOVLW WRITE_MODE 00DC 2277 00550 CALL SET_MODE 00551 00DD 00552 L2560: 00DD 2239 00553 CALL FETCH_BYTE ; WAIT FOR COLON. 00DE 1C3C 00554 BTFSS BUFFER_FLAG ; MAKE SURE THERE IA A VALID BYTE. 00DF 292C 00555 GOTO L2730 ; INVALID BYTE. 00E0 303A 00556 MOVLW ":" 00E1 063D 00557 XORWF BUFFER_BYTE,W 00E2 1D03 00558 BTFSS _Z ; COLON FOUND. 00E3 28DD 00559 GOTO $-6 ; NOT COLON, TRY ANOTHER BYTE. 00E4 2269 00560 CALL GET_HEX_BYTE 00E5 193C 00561 BTFSC BYTE_ERROR 00E6 292C 00562 GOTO L2730 00E7 0826 00563 MOVF HEX_,W ; BYTE VALID, RECORD LENGTH, TEST FOR ZERO. 00E8 1903 00564 BTFSC _Z 00E9 291C 00565 GOTO L2580 ; RECORD LENGTH=0. 00EA 00BE 00566 MOVWF HEX_COUNTER 00EB 2269 00567 CALL GET_HEX_BYTE ; FETCH MSB OF DATA ADDRESS. 00EC 193C 00568 BTFSC BYTE_ERROR 00ED 292C 00569 GOTO L2730 ; INPUT BYTE ERROR. 00EE 0826 00570 MOVF HEX_,W 00EF 00A9 00571 MOVWF ADDRESS_HI 00F0 2269 00572 CALL GET_HEX_BYTE ; FETCH LSB OF DATA ADDRESS. 00F1 193C 00573 BTFSC BYTE_ERROR 00F2 292C 00574 GOTO L2730 ; INPUT BYTE ERROR. 00F3 0826 00575 MOVF HEX_,W 00F4 00AA 00576 MOVWF ADDRESS_LO 00F5 2269 00577 CALL GET_HEX_BYTE ; RECORD TYPE. DO NOTHING WITH THIS. 00F6 193C 00578 BTFSC BYTE_ERROR 00F7 292C 00579 GOTO L2730 00F8 00580 L2690: 00F8 2269 00581 CALL GET_HEX_BYTE ; FETCH DATA BYTE. 00F9 193C 00582 BTFSC BYTE_ERROR 00FA 292C 00583 GOTO L2730 ; BYTE ERROR. 00FB 00584 L2695: 00FB 082A 00585 MOVF ADDRESS_LO,W ; COMPARE MASTER AND INPUT ADDRESSES. 00FC 0648 00586 XORWF MASTER_ADDR_LO,W 00FD 1D03 00587 BTFSS _Z 00FE 2931 00588 GOTO L2735 ; ADDRESSES DIFFERENT. 00FF 0829 00589 MOVF ADDRESS_HI,W 0100 0649 00590 XORWF MASTER_ADDR_HI,W 0101 1D03 00591 BTFSS _Z 0102 2931 00592 GOTO L2735 ; ADDRESSES DIFFERENT. 0103 11BC 00593 BCF ADDRESS_DIFFERENCE ; INDICATE DIFFERENCE. 00594 0104 30FF 00595 MOVLW 0FFH ; FF'S ARE NOT PROGRAMMED. 0105 0626 00596 XORWF HEX_,W 0106 1903 00597 BTFSC _Z 0107 2910 00598 GOTO L2700 0108 0826 00599 MOVF HEX_,W ; TRANSFER BYTE TO AT89C2051. 0109 0086 00600 MOVWF PORTB 010A 2306 00601 CALL DELAY_500US 010B 1088 00602 BCF PROG ; PROGRAMMING PULSE. 010C 290D 00603 GOTO $+1 ; TWO MACHINE CYCLES. 010D 290E 00604 GOTO $+1

MPASM 5.46 AT89C2051_PROGRAMMER.ASM 7-30-2013 8:21:50 PAGE 9 010E 1488 00605 BSF PROG 010F 2370 00606 CALL WAIT_PROG ; 2ms DELAY FOR PROGRAMMING CYCLE TO FINISH. 0110 00607 L2700: 0110 232A 00608 CALL INCREMENT_ADDRESS_COUNTER 0111 232F 00609 CALL INCREMENT_MASTER_ADDRESS 0112 19BC 00610 BTFSC ADDRESS_DIFFERENCE 0113 28FB 00611 GOTO L2695 00612 0114 236A 00613 CALL TOGGLE_RED 00614 0115 2326 00615 CALL INCREMENT_ADDRESS ; INCREMENT RECORD ADDRESS. 0116 0BBE 00616 DECFSZ HEX_COUNTER,F ; COUNT BYTES IN RECORD. 0117 28F8 00617 GOTO L2690 0118 2269 00618 CALL GET_HEX_BYTE ; READ CHECKSUM. 0119 193C 00619 BTFSC BYTE_ERROR 011A 292C 00620 GOTO L2730 ; BYTE ERROR. 011B 28DD 00621 GOTO L2560 ; READ ANOTHER RECORD. 011C 00622 L2580: 011C 2269 00623 CALL GET_HEX_BYTE ; READ ADDRESS HIGH. 011D 193C 00624 BTFSC BYTE_ERROR 011E 292C 00625 GOTO L2730 ; INPUT BYTE ERROR. 011F 2269 00626 CALL GET_HEX_BYTE ; READ ADDRESS LOW. 0120 193C 00627 BTFSC BYTE_ERROR 0121 292C 00628 GOTO L2730 ; INPUT BYTE ERROR. 0122 2269 00629 CALL GET_HEX_BYTE ; READ RECORD TYPE. 0123 193C 00630 BTFSC BYTE_ERROR 0124 292C 00631 GOTO L2730 ; INPUT BYTE ERROR. 0125 2269 00632 CALL GET_HEX_BYTE ; READ CHECKSUM. 0126 193C 00633 BTFSC BYTE_ERROR 0127 292C 00634 GOTO L2730 ; INPUT BYTE ERROR. 0128 2342 00635 CALL POWER_DOWN 0129 0192 00636 CLRF T2CON 012A 237D 00637 CALL PROGRAMMING_COMPLETE 012B 2829 00638 GOTO MENU_LOOP_10 012C 00639 L2730: 012C 2342 00640 CALL POWER_DOWN 012D 0192 00641 CLRF T2CON ; STOP TIMER 2. 012E 2311 00642 CALL EMPTY_BUFFER 012F 2389 00643 CALL INPUT_BYTE_ERROR 0130 2829 00644 GOTO MENU_LOOP_10 0131 00645 L2735: 0131 15BC 00646 BSF ADDRESS_DIFFERENCE 0132 2910 00647 GOTO L2700 00648 00649 ;------------------------------------------------------------------------------------------------------- 00650 0133 00651 HEX_VERIFY: 00652 0133 22CB 00653 CALL BLUE_ON 00654 0134 2381 00655 CALL SEND_HEX_FILE 00656 0135 2248 00657 CALL FILE_INPUT_DELAY 00658 0136 2387 00659 CALL VERIFYING 00660 0137 235F 00661 CALL START_TIMER_2 00662 0138 01C8 00663 CLRF MASTER_ADDR_LO ; KEEP TRACK OF INPUT BYTE ADDRESSES. 0139 01C9 00664 CLRF MASTER_ADDR_HI 00665 013A 3010 00666 MOVLW READ_MODE 013B 2277 00667 CALL SET_MODE 013C 00668 L2790: 013C 2239 00669 CALL FETCH_BYTE ; WAIT FOR COLON. 013D 1C3C 00670 BTFSS BUFFER_FLAG ; MAKE SURE THERE IA A VALID BYTE. 013E 2983 00671 GOTO L2820 ; INVALID BYTE. 013F 303A 00672 MOVLW ":" 0140 063D 00673 XORWF BUFFER_BYTE,W 0141 1D03 00674 BTFSS _Z 0142 293C 00675 GOTO $-6 00676 0143 2269 00677 CALL GET_HEX_BYTE 0144 193C 00678 BTFSC BYTE_ERROR 0145 2983 00679 GOTO L2820 0146 0826 00680 MOVF HEX_,W ; BYTE VALID, RECORD LENGTH, TEST FOR ZERO. 0147 1903 00681 BTFSC _Z 0148 2973 00682 GOTO L2810 ; RECORD LENGTH=0. 0149 00BE 00683 MOVWF HEX_COUNTER 00684 014A 2269 00685 CALL GET_HEX_BYTE ; FETCH MSB OF DATA ADDRESS. 014B 193C 00686 BTFSC BYTE_ERROR 014C 2983 00687 GOTO L2820 ; INPUT BYTE ERROR. 014D 0826 00688 MOVF HEX_,W 014E 00A9 00689 MOVWF ADDRESS_HI 00690 014F 2269 00691 CALL GET_HEX_BYTE ; FETCH LSB OF DATA ADDRESS. 0150 193C 00692 BTFSC BYTE_ERROR 0151 2983 00693 GOTO L2820 ; INPUT BYTE ERROR. 0152 0826 00694 MOVF HEX_,W 0153 00AA 00695 MOVWF ADDRESS_LO 00696 0154 2269 00697 CALL GET_HEX_BYTE ; RECORD TYPE. DO NOTHING WITH THIS. 0155 193C 00698 BTFSC BYTE_ERROR 0156 2983 00699 GOTO L2820 0157 00700 L2800:

MPASM 5.46 AT89C2051_PROGRAMMER.ASM 7-30-2013 8:21:50 PAGE 10 0157 2269 00701 CALL GET_HEX_BYTE ; FETCH DATA BYTE. 0158 193C 00702 BTFSC BYTE_ERROR 0159 2983 00703 GOTO L2820 ; BYTE ERROR. 015A 00704 L2805: 015A 082A 00705 MOVF ADDRESS_LO,W ; COMPARE MASTER AND INPUT ADDRESSES. 015B 0648 00706 XORWF MASTER_ADDR_LO,W 015C 1D03 00707 BTFSS _Z 015D 298D 00708 GOTO L2835 ; ADDRESSES DIFFERENT. 00709 015E 0829 00710 MOVF ADDRESS_HI,W 015F 0649 00711 XORWF MASTER_ADDR_HI,W 0160 1D03 00712 BTFSS _Z 0161 298D 00713 GOTO L2835 ; ADDRESSES DIFFERENT. 00714 0162 11BC 00715 BCF ADDRESS_DIFFERENCE ; ADDRESSES ARE THE SAME. 00716 0163 0806 00717 MOVF PORTB,W 0164 0626 00718 XORWF HEX_,W 0165 1D03 00719 BTFSS _Z 0166 2988 00720 GOTO L2830 ; VERIFY ERROR. 0167 00721 L2808: 0167 232A 00722 CALL INCREMENT_ADDRESS_COUNTER 0168 232F 00723 CALL INCREMENT_MASTER_ADDRESS 0169 19BC 00724 BTFSC ADDRESS_DIFFERENCE 016A 295A 00725 GOTO L2805 00726 016B 2364 00727 CALL TOGGLE_BLUE 00728 016C 2326 00729 CALL INCREMENT_ADDRESS ; INCREMENT RECORD ADDRESS. 016D 0BBE 00730 DECFSZ HEX_COUNTER,F ; COUNT BYTES IN THE RECORD. 016E 2957 00731 GOTO L2800 016F 2269 00732 CALL GET_HEX_BYTE ; READ CHECKSUM. 0170 193C 00733 BTFSC BYTE_ERROR 0171 2983 00734 GOTO L2820 ; BYTE ERROR. 0172 293C 00735 GOTO L2790 ; READ ANOTHER RECORD. 0173 00736 L2810: 0173 2269 00737 CALL GET_HEX_BYTE ; READ ADDRESS HIGH. 0174 193C 00738 BTFSC BYTE_ERROR 0175 2983 00739 GOTO L2820 ; INPUT BYTE ERROR. 0176 2269 00740 CALL GET_HEX_BYTE ; READ ADDRESS LOW. 0177 193C 00741 BTFSC BYTE_ERROR 0178 2983 00742 GOTO L2820 ; INPUT BYTE ERROR. 0179 2269 00743 CALL GET_HEX_BYTE ; READ RECORD TYPE. 017A 193C 00744 BTFSC BYTE_ERROR 017B 2983 00745 GOTO L2820 ; INPUT BYTE ERROR. 017C 2269 00746 CALL GET_HEX_BYTE ; READ CHECKSUM. 017D 193C 00747 BTFSC BYTE_ERROR 017E 2983 00748 GOTO L2820 ; INPUT BYTE ERROR. 017F 2342 00749 CALL POWER_DOWN 0180 0192 00750 CLRF T2CON 0181 2395 00751 CALL VERIFY_SUCCESSFUL 0182 2829 00752 GOTO MENU_LOOP_10 0183 00753 L2820: 0183 2342 00754 CALL POWER_DOWN 0184 0192 00755 CLRF T2CON 0185 2311 00756 CALL EMPTY_BUFFER 0186 2389 00757 CALL INPUT_BYTE_ERROR 0187 2829 00758 GOTO MENU_LOOP_10 0188 00759 L2830: 0188 2342 00760 CALL POWER_DOWN 0189 0192 00761 CLRF T2CON ; STOP TIMER 2. 018A 2311 00762 CALL EMPTY_BUFFER 018B 2397 00763 CALL VERIFY_ERROR 018C 2829 00764 GOTO MENU_LOOP_10 018D 00765 L2835: 018D 15BC 00766 BSF ADDRESS_DIFFERENCE 018E 2967 00767 GOTO L2808 00768 00769 ;------------------------------------------------------------------------------------------------------- 00770 018F 00771 READ_DEVICE_BINARY: 00772 018F 2373 00773 CALL CODE_DATA 00774 0190 22CB 00775 CALL BLUE_ON 00776 0191 3010 00777 MOVLW READ_MODE 0192 2277 00778 CALL SET_MODE 00779 0193 235F 00780 CALL START_TIMER_2 00781 0194 3008 00782 MOVLW 8 0195 00A1 00783 MOVWF BYTE_COUNT_HI 0196 00784 L2500: 0196 01A2 00785 CLRF BYTE_COUNT_LO 0197 00786 L2510: 0197 0806 00787 MOVF PORTB,W 0198 00A0 00788 MOVWF SERIAL_BYTE 0199 235A 00789 CALL SERIAL_OUT 00790 019A 232A 00791 CALL INCREMENT_ADDRESS_COUNTER 00792 019B 2364 00793 CALL TOGGLE_BLUE 00794 019C 0BA2 00795 DECFSZ BYTE_COUNT_LO,F 019D 2997 00796 GOTO L2510

MPASM 5.46 AT89C2051_PROGRAMMER.ASM 7-30-2013 8:21:50 PAGE 11 019E 0BA1 00797 DECFSZ BYTE_COUNT_HI,F 019F 2996 00798 GOTO L2500 01A0 2333 00799 CALL LF 01A1 2342 00800 CALL POWER_DOWN 01A2 0192 00801 CLRF T2CON ; STOP TIMER 2. 01A3 2829 00802 GOTO MENU_LOOP_10 00803 00804 ;------------------------------------------------------------------------------------------------------- 00805 01A4 00806 READ_DEVICE_HEX: 00807 01A4 2373 00808 CALL CODE_DATA 00809 01A5 22CB 00810 CALL BLUE_ON 00811 01A6 3010 00812 MOVLW READ_MODE 01A7 2277 00813 CALL SET_MODE 00814 01A8 235F 00815 CALL START_TIMER_2 00816 01A9 01C9 00817 CLRF MASTER_ADDR_HI 01AA 01C8 00818 CLRF MASTER_ADDR_LO 01AB 3010 00819 MOVLW 16 01AC 00C5 00820 MOVWF COLUMN_COUNTER 01AD 3008 00821 MOVLW 8 01AE 00A1 00822 MOVWF BYTE_COUNT_HI 01AF 00823 L2770: 01AF 01A2 00824 CLRF BYTE_COUNT_LO 01B0 00825 L2780: 01B0 1E45 00826 BTFSS COLUMN_COUNTER,4 01B1 29B7 00827 GOTO $+6 00828 01B2 0849 00829 MOVF MASTER_ADDR_HI,W 01B3 234C 00830 CALL SEND_HEX_BYTES 00831 01B4 0848 00832 MOVF MASTER_ADDR_LO,W 01B5 234C 00833 CALL SEND_HEX_BYTES 00834 01B6 22C6 00835 CALL BLANK_SPACE 00836 01B7 0806 00837 MOVF PORTB,W 01B8 234C 00838 CALL SEND_HEX_BYTES 00839 01B9 22C6 00840 CALL BLANK_SPACE 00841 01BA 0BC5 00842 DECFSZ COLUMN_COUNTER,F 01BB 29BF 00843 GOTO $+4 01BC 2333 00844 CALL LF 01BD 3010 00845 MOVLW 16 01BE 00C5 00846 MOVWF COLUMN_COUNTER 00847 01BF 232A 00848 CALL INCREMENT_ADDRESS_COUNTER 00849 01C0 2364 00850 CALL TOGGLE_BLUE 00851 01C1 3001 00852 MOVLW 1 ; INCREMENT MASTER ADDRESS. 01C2 07C8 00853 ADDWF MASTER_ADDR_LO,F 01C3 1803 00854 BTFSC _C 01C4 07C9 00855 ADDWF MASTER_ADDR_HI,F 00856 01C5 0BA2 00857 DECFSZ BYTE_COUNT_LO,F 01C6 29B0 00858 GOTO L2780 01C7 0BA1 00859 DECFSZ BYTE_COUNT_HI,F 01C8 29AF 00860 GOTO L2770 01C9 2342 00861 CALL POWER_DOWN 01CA 0192 00862 CLRF T2CON ; STOP TIMER 2. 01CB 2829 00863 GOTO MENU_LOOP_10 00864 00865 ;------------------------------------------------------------------------------------------------------- 00866 01CC 00867 READ_SIGNATURE_BYTES: 00868 01CC 22CB 00869 CALL BLUE_ON 00870 01CD 3000 00871 MOVLW SIGNATURE_MODE 01CE 2277 00872 CALL SET_MODE 00873 01CF 3040 00874 MOVLW SIGNATURE_BYTE_0 01D0 0084 00875 MOVWF FSR 01D1 3003 00876 MOVLW 3 01D2 00BF 00877 MOVWF SIGNATURE_BYTE_COUNTER 00878 01D3 0806 00879 MOVF PORTB,W 01D4 0080 00880 MOVWF INDF 00881 01D5 232A 00882 CALL INCREMENT_ADDRESS_COUNTER 00883 01D6 0A84 00884 INCF FSR,F 01D7 0BBF 00885 DECFSZ SIGNATURE_BYTE_COUNTER,F 01D8 29D3 00886 GOTO $-5 00887 01D9 2383 00888 CALL SIGNATURE_BYTES 00889 01DA 3040 00890 MOVLW SIGNATURE_BYTE_0 01DB 0084 00891 MOVWF FSR 01DC 3003 00892 MOVLW 3

MPASM 5.46 AT89C2051_PROGRAMMER.ASM 7-30-2013 8:21:50 PAGE 12 01DD 0800 00893 MOVF INDF,W 01DE 234C 00894 CALL SEND_HEX_BYTES 00895 01DF 22C6 00896 CALL BLANK_SPACE 01E0 22D5 00897 CALL DASH 01E1 22C6 00898 CALL BLANK_SPACE 01E2 301E 00899 MOVLW 1EH ; TEST FOR ATMEL DEVICE. 01E3 0600 00900 XORWF INDF,W 01E4 1D03 00901 BTFSS _Z 01E5 29E8 00902 GOTO $+3 01E6 2399 00903 CALL ATMEL_DEVICE 01E7 29E9 00904 GOTO $+2 01E8 239D 00905 CALL UNKNOWN_DEVICE 01E9 0A84 00906 INCF FSR,F 01EA 0800 00907 MOVF INDF,W 01EB 234C 00908 CALL SEND_HEX_BYTES 00909 01EC 22C6 00910 CALL BLANK_SPACE 01ED 22D5 00911 CALL DASH 01EE 22C6 00912 CALL BLANK_SPACE 01EF 3021 00913 MOVLW 21H ; TEST FOR 89C2051. 01F0 0600 00914 XORWF INDF,W 01F1 1D03 00915 BTFSS _Z 01F2 29F5 00916 GOTO $+3 01F3 239B 00917 CALL AT89C2051 01F4 29F6 00918 GOTO $+2 01F5 239F 00919 CALL UNKNOWN_TYPE 01F6 0A84 00920 INCF FSR,F 01F7 0800 00921 MOVF INDF,W 01F8 234C 00922 CALL SEND_HEX_BYTES 00923 01F9 2333 00924 CALL LF 01FA 2342 00925 CALL POWER_DOWN 01FB 2829 00926 GOTO MENU_LOOP_10 00927 00928 ;------------------------------------------------------------------------------------------------------- 00929 01FC 00930 LOCK_BITS: 01FC 2348 00931 CALL RED_ON 00932 01FD 2379 00933 CALL PRESS_1OR2 00934 01FE 1207 00935 BCF CTS ; ALLOW BYTES TO BE SENT FROM CONSOLE. 01FF 2355 00936 CALL SERIAL_IN 00937 0200 3031 00938 MOVLW "1" 0201 0620 00939 XORWF SERIAL_BYTE,W 0202 1903 00940 BTFSC _Z 0203 2A08 00941 GOTO LOCK 0204 3032 00942 MOVLW "2" 0205 0620 00943 XORWF SERIAL_BYTE,W 0206 1D03 00944 BTFSS _Z 0207 29FF 00945 GOTO $-8 ; LOOP UNTIL A '1' OR A '2' IS RECEIVED. 0208 00946 LOCK: 0208 1607 00947 BSF CTS ; CONSOLE BYTES NOT NEEDED NOW. 00948 0209 301C 00949 MOVLW LOCK_MODE_1 020A 2277 00950 CALL SET_MODE 00951 020B 1388 00952 BCF _12V_5V 020C 1308 00953 BCF VPP_OFF 020D 22E4 00954 CALL DELAY_1MS 00955 020E 1088 00956 BCF PROG 020F 2A10 00957 GOTO $+1 0210 2A11 00958 GOTO $+1 0211 1488 00959 BSF PROG 0212 2370 00960 CALL WAIT_PROG 0213 3032 00961 MOVLW "2" ; LOCK MODE 2. 0214 0620 00962 XORWF SERIAL_BYTE,W 0215 1D03 00963 BTFSS _Z 0216 2A21 00964 GOTO LOCK_END 00965 0217 300C 00966 MOVLW LOCK_MODE_2 0218 2277 00967 CALL SET_MODE 00968 0219 1388 00969 BCF _12V_5V ; SET VPP TO 12V. 021A 1308 00970 BCF VPP_OFF ; VPP-HIGH. 021B 22E4 00971 CALL DELAY_1MS 00972 021C 1088 00973 BCF PROG 021D 2A1E 00974 GOTO $+1 021E 2A1F 00975 GOTO $+1 021F 1488 00976 BSF PROG 0220 2370 00977 CALL WAIT_PROG ; WAIT PROG IS 2x 1ms DELAYS. 0221 00978 LOCK_END: 0221 3031 00979 MOVLW "1" 0222 0620 00980 XORWF SERIAL_BYTE,W 0223 1903 00981 BTFSC _Z 0224 2A28 00982 GOTO $+4 0225 238F 00983 CALL LOCK_BIT_2 0226 2342 00984 CALL POWER_DOWN 0227 2829 00985 GOTO MENU_LOOP_10 00986 0228 238D 00987 CALL LOCK_BIT_1 0229 2342 00988 CALL POWER_DOWN

MPASM 5.46 AT89C2051_PROGRAMMER.ASM 7-30-2013 8:21:50 PAGE 13 022A 2829 00989 GOTO MENU_LOOP_10

MPASM 5.46 AT89C2051_PROGRAMMER.ASM 7-30-2013 8:21:50 PAGE 14 00990 PAGE 00991 ;------------------------------------------------------------------------------------------------------- 00992 ; 00993 ; / ) _ \ / _ \ \ / 00994 ; \ \ _ \ _) \ _ \ \ 00995 ; ) _ _) _ < _ _ \ ) 00996 ; / \ / / _ \_\\ / \ / _ _ \_ / 00997 ; 00998 ;------------------------------------------------------------------------------------------------------- 00999 022B 01000 CHIP_ERASE: 022B 2348 01001 CALL RED_ON 01002 022C 3004 01003 MOVLW ERASE_MODE 022D 2277 01004 CALL SET_MODE 01005 022E 1388 01006 BCF _12V_5V ; SET VPP TO 12V. 022F 1308 01007 BCF VPP_OFF ; VPP-HIGH. 0230 22E4 01008 CALL DELAY_1MS 01009 0231 1088 01010 BCF PROG ; ERASE TAKES PLACE HERE. 0232 22DA 01011 CALL DELAY_10MS 0233 1488 01012 BSF PROG 0234 1788 01013 BSF _12V_5V ; BRING VPP DOWN TO 5V. 0235 22DA 01014 CALL DELAY_10MS 01015 0236 2342 01016 CALL POWER_DOWN 01017 0237 2375 01018 CALL DEVICE_ERASED 0238 0008 01019 RETURN 01020 01021 ;------------------------------------------------------------------------------------------------------- 01022 01023 ; FETCH BYTE 01024 ; ~~~~~~~~~~ 01025 01026 ; FETCH BYTE CHECKS SERIAL_BUFFER_COUNTER TO SEE IF THERE ARE ANY BYTES AVAILABLE. IF SO, THE OLDEST 01027 ; BYTE IS READ AND PLACED IN BUFFER_BYTE. BUFFER_FLAG IS SET WHEN A BYTE IS READ AND CLEARED IF NO BYTE 01028 ; IS FOUND. 01029 0239 01030 FETCH_BYTE: 0239 08A8 01031 MOVF SERIAL_BUFFER_COUNTER,F ; SEE IF BYTES ARE AVAILABLE IN BUFFER. 023A 1D03 01032 BTFSS _Z 023B 2A42 01033 GOTO $+7 ; BUFFER HAS BYTES. 023C 2254 01034 CALL FILL_BUFFER 023D 08A8 01035 MOVF SERIAL_BUFFER_COUNTER,F 023E 1D03 01036 BTFSS _Z ; BUFFER IS EMPTY. 023F 2A42 01037 GOTO $+3 ; BUFFER HAS BYTES. 0240 103C 01038 BCF BUFFER_FLAG 0241 0008 01039 RETURN 0242 0800 01040 MOVF INDF,W ; READ OLDEST BYTE. 0243 00BD 01041 MOVWF BUFFER_BYTE 0244 143C 01042 BSF BUFFER_FLAG ; INDICATE BYTE FOUND. 0245 0A84 01043 INCF FSR,F ; POINT TO NEXT BUFFER LOCATION. 0246 03A8 01044 DECF SERIAL_BUFFER_COUNTER,F 0247 0008 01045 RETURN 01046 01047 ;------------------------------------------------------------------------------------------------------- 01048 01049 ; FILE INPUT DELAY 01050 ; ~~~~~~~~~~~~~~~~ 01051 01052 ; FILE INPUT DELAY STARTS A 31 SECOND DELAY TO ALLOW THE USER TO START SENDING AN INPUT FILE. AFTER 31 01053 ; SECONDS OR A KEY PRESS A RETURN IS EXECUTED. 01054 0248 01055 FILE_INPUT_DELAY: 0248 301E 01056 MOVLW 30 ; WAIT FOR 30 SECONDS. 0249 00BB 01057 MOVWF THIRTY_SEC_DELAY 024A 22EE 01058 CALL DELAY_1S 024B 3001 01059 MOVLW 1 024C 0687 01060 XORWF PORTC,F 024D 1C05 01061 BTFSS PRESS_SWITCH ; CHECK PRESS SWITCH. 024E 2A51 01062 GOTO $+3 ; PRESS SWITCH DOWN, SHORTEN DELAY TIME. 024F 0BBB 01063 DECFSZ THIRTY_SEC_DELAY,F ; PRESS SWITCH UP, CONTINUE COUNTDOWN. 0250 2A4A 01064 GOTO $-6 0251 22EE 01065 CALL DELAY_1S 0252 22BD 01066 CALL ALL_OFF 0253 0008 01067 RETURN 01068 01069 ;------------------------------------------------------------------------------------------------------- 01070 01071 ; FILL BUFFER 01072 ; ~~~~~~~~~~~ 01073 01074 ; FILL BUFFER RETURNS WITH AS MANY BYTES AS ARE AVAILABLE FROM THE SERIAL PORT. THE BUFFER HAS A 01075 ; CAPACITY OF 16 BYTES TO CORRESPOND WITH THE HOST PC SERIAL BUFFER. BUFFER BYTES ARE COUNTED BY 01076 ; SERIAL_BUFFER_COUNTER. A ZERO INDICATES THAT THE BUFFER IS EMPTY. 01077 0254 01078 FILL_BUFFER: 0254 302B 01079 MOVLW SERIAL_BUFFER ; POINT TO START OF BUFFER. 0255 0084 01080 MOVWF FSR 0256 01A8 01081 CLRF SERIAL_BUFFER_COUNTER ; INITIAL NUMBER OF BYTES. 0257 1A87 01082 BTFSC RTS ; MAKE SURE HOST IS READY. 0258 2A57 01083 GOTO $-1 0259 1207 01084 BCF CTS ; TRIGGER 16 BYTE TRANSMISSION. 025A 22AE 01085 CALL TIMED_SERIAL_IN ; FETCH BYTES IF THEY ARE AVAILABLE.

MPASM 5.46 AT89C2051_PROGRAMMER.ASM 7-30-2013 8:21:50 PAGE 15 025B 1607 01086 BSF CTS 025C 1CBC 01087 BTFSS BYTE_FLAG 025D 2A66 01088 GOTO L2680 025E 0820 01089 MOVF SERIAL_BYTE,W ; STORE NEW BYTE IN BUFFER. 025F 0080 01090 MOVWF INDF 0260 0A84 01091 INCF FSR,F ; POINT TO NEXT BUFFER LOCATION. 0261 0AA8 01092 INCF SERIAL_BUFFER_COUNTER,F ; COUNT BUFFER LOCATIONS. 0262 3010 01093 MOVLW 16 ; FEST TO SEE IF BUFFER IS FULL. 0263 0628 01094 XORWF SERIAL_BUFFER_COUNTER,W 0264 1D03 01095 BTFSS _Z 0265 2A5A 01096 GOTO $-11 0266 01097 L2680: 0266 302B 01098 MOVLW SERIAL_BUFFER ; POINT TO TOP OF BUFFER. 0267 0084 01099 MOVWF FSR 0268 0008 01100 RETURN 01101 01102 ;------------------------------------------------------------------------------------------------------- 01103 01104 ; GET HEX BYTE 01105 ; ~~~~~~~~~~~~ 01106 01107 ; GET HEX BYTE READS TWO BYTES FROM THE SERIAL BUFFER. IT CALLS FETCH BYTE AND, BEFORE CONVERTING THE 01108 ; ASCII CHARACTER TO HEX,IT CHECKS THAT A VALID BYTE WAS RECEIVED. IF THE BYTE WAS NOT VALID, A RETURN 01109 ; IS EXECUTED WITH THE BYTE ERROR BIT SET. IF THE BYTE WAS VALID, FETCH BYTE IS CALLED AGAIN. A VALID 01110 ; HEX BYTE IS RETURNED IN HEX_ WITH BYTE ERROR CLEAR. AS BEFORE, IF THE BYTE WAS INVALID, BYTE 01111 ; ERROR IS SET. 01112 0269 01113 GET_HEX_BYTE: 0269 153C 01114 BSF BYTE_ERROR ; BIT IS SET IN ANTICIPATION OF AN ERROR. 026A 2239 01115 CALL FETCH_BYTE ; READ FIRST FROM SERIAL BUFFER. 026B 1C3C 01116 BTFSS BUFFER_FLAG 026C 0008 01117 RETURN ; ERROR FOUND, INVALID BYTE. 026D 22C0 01118 CALL ASCII_BINARY ; BYTE VALID, CONVERT IT TO BINARY. 026E 00A6 01119 MOVWF HEX_ 026F 0EA6 01120 SWAPF HEX_,F 0270 2239 01121 CALL FETCH_BYTE 0271 1C3C 01122 BTFSS BUFFER_FLAG 0272 0008 01123 RETURN ; INVALID BYTE. 0273 22C0 01124 CALL ASCII_BINARY 0274 04A6 01125 IORWF HEX_,F 0275 113C 01126 BCF BYTE_ERROR ; INDICATE VALID BYTE. 0276 0008 01127 RETURN 01128 01129 ;------------------------------------------------------------------------------------------------------- 01130 01131 ; SET MODE 01132 ; ~~~~~~~~ 01133 0277 01134 SET_MODE: 0277 00CA 01135 MOVWF MODE ; SAVE MODE. 0278 30C0 01136 MOVLW STEP_1 ; VCC ON, RST AND XTAL1=0. 0279 0088 01137 MOVWF PORTD 027A 22DA 01138 CALL DELAY_10MS 01139 027B 3082 01140 MOVLW STEP_2 ; RST/VPP AND P3.2/PROG="H". 027C 0088 01141 MOVWF PORTD 027D 22DA 01142 CALL DELAY_10MS 01143 027E 3000 01144 MOVLW SIGNATURE_MODE 027F 064A 01145 XORWF MODE,W 0280 1D03 01146 BTFSS _Z 0281 2A86 01147 GOTO $+5 0282 2338 01148 CALL PORTB_INPUT 0283 3000 01149 MOVLW SIGNATURE_MODE 0284 0488 01150 IORWF PORTD,F 0285 0008 01151 RETURN 01152 0286 3010 01153 MOVLW READ_MODE 0287 064A 01154 XORWF MODE,W 0288 1D03 01155 BTFSS _Z 0289 2A8E 01156 GOTO $+5 028A 2338 01157 CALL PORTB_INPUT 028B 3010 01158 MOVLW READ_MODE 028C 0488 01159 IORWF PORTD,F 028D 0008 01160 RETURN 01161 028E 3018 01162 MOVLW WRITE_MODE 028F 064A 01163 XORWF MODE,W 0290 1D03 01164 BTFSS _Z 0291 2A9A 01165 GOTO $+9 0292 233D 01166 CALL PORTB_OUTPUT 0293 3018 01167 MOVLW WRITE_MODE 0294 0488 01168 IORWF PORTD,F 0295 22DA 01169 CALL DELAY_10MS 0296 303F 01170 MOVLW 3FH ; RST TO +12V. 0297 0588 01171 ANDWF PORTD,F 0298 22DA 01172 CALL DELAY_10MS 0299 0008 01173 RETURN 01174 029A 3004 01175 MOVLW ERASE_MODE 029B 064A 01176 XORWF MODE,W 029C 1D03 01177 BTFSS _Z 029D 2AA2 01178 GOTO $+5 029E 233D 01179 CALL PORTB_OUTPUT 029F 3004 01180 MOVLW ERASE_MODE 02A0 0488 01181 IORWF PORTD,F

MPASM 5.46 AT89C2051_PROGRAMMER.ASM 7-30-2013 8:21:50 PAGE 16 02A1 0008 01182 RETURN 01183 02A2 300C 01184 MOVLW LOCK_MODE_2 02A3 064A 01185 XORWF MODE,W 02A4 1D03 01186 BTFSS _Z 02A5 2AAA 01187 GOTO $+5 02A6 233D 01188 CALL PORTB_OUTPUT 02A7 300C 01189 MOVLW LOCK_MODE_2 02A8 0488 01190 IORWF PORTD,F 02A9 0008 01191 RETURN 01192 02AA 233D 01193 CALL PORTB_OUTPUT 02AB 301C 01194 MOVLW LOCK_MODE_1 02AC 0488 01195 IORWF PORTD,F 02AD 0008 01196 RETURN 01197 01198 ;------------------------------------------------------------------------------------------------------- 01199 01200 ; TIMED SERIAL IN 01201 ; ~~~~~~~~~~~~~~~ 01202 01203 ; TIMER 1 IS CONFIGURED TO PROVIDE A 142 MILLISECOND DELAY. TIMED SERIAL IN RESTARTS TIMER 1, WAITS FOR 01204 ; TIMEOUT OR FOR A SERIAL INPUT. BYTE FLAG IS SET ACCORDING TO THE RESULTS. 01205 02AE 01206 TIMED_SERIAL_IN: 01207 02AE 1010 01208 BCF T1CON,TMR1ON ; STOP TIMER 1. 02AF 100C 01209 BCF PIR1,TMR1IF ; RESET TIMER 1. 02B0 018F 01210 CLRF TMR1H 02B1 018E 01211 CLRF TMR1L 02B2 1410 01212 BSF T1CON,TMR1ON ; START TIMER 1. 02B3 180C 01213 BTFSC PIR1,TMR1IF ; CHECK FOR TIMEOUT. 02B4 2ABB 01214 GOTO $+7 ; TIMER 1 TIMEOUT. 02B5 1E8C 01215 BTFSS PIR1,RCIF ; CHECK FOR SERIAL INPUT. 02B6 2AB3 01216 GOTO $-3 ; KEEP TESTING FOR TIMEOUT AND SERIAL INPUT. 02B7 081A 01217 MOVF RCREG,W ; SERIAL INPUT FOUND. 02B8 00A0 01218 MOVWF SERIAL_BYTE 02B9 14BC 01219 BSF BYTE_FLAG 02BA 0008 01220 RETURN 02BB 10BC 01221 BCF BYTE_FLAG ; TIMER ONE TIMED OUT BEFORE SERIAL BYTE ARRIVED. 02BC 0008 01222 RETURN 01223 01224 ;------------------------------------------------------------------------------------------------------- 01225 ; MINOR SUBROUTINES 01226 ;------------------------------------------------------------------------------------------------------- 01227 02BD 01228 ALL_OFF: 02BD 30F8 01229 MOVLW 0F8H ; MASK ALL LED OUTPUTS. 02BE 0587 01230 ANDWF PORTC,F ; SWITCH OFF RED, GREEN AND BLUE LEDS. 02BF 0008 01231 RETURN 01232 01233 ;------------------------------------------------------------------------------------------------------- 01234 02C0 01235 ASCII_BINARY: 02C0 083D 01236 MOVF BUFFER_BYTE,W 02C1 3EBF 01237 ADDLW -41H 02C2 1C03 01238 BTFSS _C 02C3 3E07 01239 ADDLW 7 02C4 3E0A 01240 ADDLW 10 02C5 0008 01241 RETURN 01242 01243 ;------------------------------------------------------------------------------------------------------- 01244 02C6 01245 BLANK_SPACE: 02C6 1E0C 01246 BTFSS PIR1,TXIF 02C7 2AC6 01247 GOTO $-1 02C8 3020 01248 MOVLW " " 02C9 0099 01249 MOVWF TXREG 02CA 0008 01250 RETURN 01251 01252 ;------------------------------------------------------------------------------------------------------- 01253 02CB 01254 BLUE_ON: 02CB 1007 01255 BCF RED 02CC 1087 01256 BCF GREEN 02CD 1507 01257 BSF BLUE 02CE 0008 01258 RETURN 01259 01260 ;------------------------------------------------------------------------------------------------------- 01261 01262 ; CONVERT HEX2ASC 01263 ; ~~~~~~~~~~~~~~~ 01264 01265 ; CONVERT HEX2ASC DOES THE ACTUAL CONVERSION FOR HEX_TO_ASCII, RETURNING WITH THE RESULT IN W. 01266 02CF 01267 CONVERT_HEX2ASC: 01268 02CF 390F 01269 ANDLW 0FH ; MASK UPPER NYBBLE. 02D0 3E06 01270 ADDLW 6 02D1 1883 01271 BTFSC _DC 02D2 3E07 01272 ADDLW 'A'-('9'+1) 02D3 3E2A 01273 ADDLW '0'-6 ; RESULT IS IN W. 02D4 0008 01274 RETURN 01275 01276 ;------------------------------------------------------------------------------------------------------- 01277

MPASM 5.46 AT89C2051_PROGRAMMER.ASM 7-30-2013 8:21:50 PAGE 17 02D5 01278 DASH: 02D5 1E0C 01279 BTFSS PIR1,TXIF 02D6 2AD5 01280 GOTO $-1 02D7 302D 01281 MOVLW "-" 02D8 0099 01282 MOVWF TXREG 02D9 0008 01283 RETURN 01284 01285 ;------------------------------------------------------------------------------------------------------- 01286 02DA 01287 DELAY_10MS: 02DA 3032 01288 MOVLW 32H 02DB 00A3 01289 MOVWF D1 02DC 3008 01290 MOVLW 8 02DD 00A4 01291 MOVWF D2 02DE 01292 DELAY_10MS_0: 02DE 0BA3 01293 DECFSZ D1,F 02DF 2AE1 01294 GOTO $+2 02E0 0BA4 01295 DECFSZ D2,F 02E1 2ADE 01296 GOTO DELAY_10MS_0 02E2 2AE3 01297 GOTO $+1 02E3 0008 01298 RETURN 01299 01300 ;------------------------------------------------------------------------------------------------------- 01301 02E4 01302 DELAY_1MS: 02E4 30B7 01303 MOVLW 0B7H 02E5 00A3 01304 MOVWF D1 02E6 3001 01305 MOVLW 1 02E7 00A4 01306 MOVWF D2 02E8 01307 DELAY_1MS_0: 02E8 0BA3 01308 DECFSZ D1,F 02E9 2AEB 01309 GOTO $+2 02EA 0BA4 01310 DECFSZ D2,F 02EB 2AE8 01311 GOTO DELAY_1MS_0 02EC 2AED 01312 GOTO $+1 02ED 0008 01313 RETURN 01314 01315 ;------------------------------------------------------------------------------------------------------- 01316 02EE 01317 DELAY_1S: 02EE 3047 01318 MOVLW 47H ; ONE SECOND DELAY. 02EF 00A3 01319 MOVWF D1 02F0 3003 01320 MOVLW 3 02F1 00A4 01321 MOVWF D2 02F2 3003 01322 MOVLW 3 02F3 00A5 01323 MOVWF D3 02F4 01324 DELAY_1SEC: 02F4 0BA3 01325 DECFSZ D1,F 02F5 2AF7 01326 GOTO $+2 02F6 0BA4 01327 DECFSZ D2,F 02F7 2AF9 01328 GOTO $+2 02F8 0BA5 01329 DECFSZ D3,F 02F9 2AF4 01330 GOTO DELAY_1SEC 02FA 2AFB 01331 GOTO $+1 02FB 2AFC 01332 GOTO $+1 02FC 2AFD 01333 GOTO $+1 02FD 0008 01334 RETURN 01335 01336 ;------------------------------------------------------------------------------------------------------- 01337 02FE 01338 DELAY_30S: 02FE 301E 01339 MOVLW 30 ; WAIT FOR 30 SECONDS. 02FF 00BB 01340 MOVWF THIRTY_SEC_DELAY 0300 22EE 01341 CALL DELAY_1S 0301 3001 01342 MOVLW 1 0302 0687 01343 XORWF PORTC,F 0303 0BBB 01344 DECFSZ THIRTY_SEC_DELAY,F 0304 2B00 01345 GOTO $-4 0305 0008 01346 RETURN 01347 01348 ;------------------------------------------------------------------------------------------------------- 01349 0306 01350 DELAY_500US: 0306 3098 01351 MOVLW 98H 0307 00A3 01352 MOVWF D1 0308 01353 DELAY_500: 0308 0BA3 01354 DECFSZ D1,F 0309 2B08 01355 GOTO DELAY_500 030A 0008 01356 RETURN 01357 01358 ;------------------------------------------------------------------------------------------------------- 01359 030B 01360 DRAW_LINE: 030B 3034 01361 MOVLW 52 030C 00A7 01362 MOVWF BYTE_COUNT 030D 22D5 01363 CALL DASH 030E 0BA7 01364 DECFSZ BYTE_COUNT,F 030F 2B0D 01365 GOTO $-2 0310 0008 01366 RETURN 01367 01368 ;------------------------------------------------------------------------------------------------------- 01369 01370 ; EMPTY BUFFER 01371 ; ~~~~~~~~~~~~ 01372 01373 ; EMPTY BUFFER IS USED TO CLEAR THE BUFFER AFTER AN ERROR.

MPASM 5.46 AT89C2051_PROGRAMMER.ASM 7-30-2013 8:21:50 PAGE 18 01374 0311 01375 EMPTY_BUFFER: 0311 1207 01376 BCF CTS ; READ BYTES FROM BUFFER UNTIL IT IS EMPTY.. 0312 22AE 01377 CALL TIMED_SERIAL_IN 0313 18BC 01378 BTFSC BYTE_FLAG 0314 2B12 01379 GOTO $-2 0315 1607 01380 BSF CTS 0316 302B 01381 MOVLW SERIAL_BUFFER ; RE-INITIALISE BUFFER. 0317 0084 01382 MOVWF FSR 0318 01A8 01383 CLRF SERIAL_BUFFER_COUNTER 0319 0008 01384 RETURN 01385 01386 ;------------------------------------------------------------------------------------------------------- 01387 031A 01388 GREEN_ON: 031A 1007 01389 BCF RED 031B 1487 01390 BSF GREEN 031C 1107 01391 BCF BLUE 031D 0008 01392 RETURN 01393 01394 ;------------------------------------------------------------------------------------------------------- 01395 01396 ; HEX TO ASCII 01397 ; ~~~~~~~~~~~~ 01398 01399 ; HEX TO ASCII CONVERTS THE HEXADECIMAL BYTE IN ASCII_CHAR_HI TO TWO ASCII CHARACTERS, RETURNING THEM IN 01400 ; ASCII_CHAR_HI AND ASCII_CHAR_LO. 01401 031E 01402 HEX_TO_ASCII: 01403 031E 0E46 01404 SWAPF ASCII_CHAR_HI,W 031F 22CF 01405 CALL CONVERT_HEX2ASC 0320 0646 01406 XORWF ASCII_CHAR_HI,W 0321 06C6 01407 XORWF ASCII_CHAR_HI,F 0322 0646 01408 XORWF ASCII_CHAR_HI,W 0323 22CF 01409 CALL CONVERT_HEX2ASC 0324 00C7 01410 MOVWF ASCII_CHAR_LO 0325 0008 01411 RETURN 01412 01413 ;------------------------------------------------------------------------------------------------------- 01414 0326 01415 INCREMENT_ADDRESS: 0326 0AAA 01416 INCF ADDRESS_LO,F ;INCREMENT RECORD ADDRESS. 0327 1903 01417 BTFSC _Z 0328 0AA9 01418 INCF ADDRESS_HI,F 0329 0008 01419 RETURN 01420 01421 ;------------------------------------------------------------------------------------------------------- 01422 032A 01423 INCREMENT_ADDRESS_COUNTER: 032A 1408 01424 BSF XTAL1 032B 2B2C 01425 GOTO $+1 032C 2B2D 01426 GOTO $+1 032D 1008 01427 BCF XTAL1 032E 0008 01428 RETURN 01429 01430 ;------------------------------------------------------------------------------------------------------- 01431 032F 01432 INCREMENT_MASTER_ADDRESS: 032F 0AC8 01433 INCF MASTER_ADDR_LO,F 0330 1903 01434 BTFSC _Z 0331 0AC9 01435 INCF MASTER_ADDR_HI,F 0332 0008 01436 RETURN 01437 01438 ;------------------------------------------------------------------------------------------------------- 01439 0333 01440 LF: 0333 1E0C 01441 BTFSS PIR1,TXIF 0334 2B33 01442 GOTO $-1 0335 300A 01443 MOVLW 0AH 0336 0099 01444 MOVWF TXREG 0337 0008 01445 RETURN 01446 01447 ;------------------------------------------------------------------------------------------------------- 01448 0338 01449 PORTB_INPUT: 01450 0338 1683 01451 BSF _RP0 ; BANK 1. 0339 30FF 01452 MOVLW 0FFH ; PORTB - INPUTS - WEAK PULL-UPS. 033A 0086 01453 MOVWF TRISB 033B 1283 01454 BCF _RP0 ; BANK 0. 033C 0008 01455 RETURN 01456 01457 ;------------------------------------------------------------------------------------------------------- 01458 033D 01459 PORTB_OUTPUT: 033D 0186 01460 CLRF PORTB ; ALL PINS LOW. 033E 1683 01461 BSF _RP0 ; BANK 1. 033F 0186 01462 CLRF TRISB ; ALL PINS OUTPUT. 0340 1283 01463 BCF _RP0 ; BANK 0. 0341 0008 01464 RETURN 01465 01466 ;------------------------------------------------------------------------------------------------------- 01467 01468 ; POWER DOWN 01469 ; ~~~~~~~~~~

MPASM 5.46 AT89C2051_PROGRAMMER.ASM 7-30-2013 8:21:50 PAGE 19 01470 01471 ; POWER DOWN REMOVES POWER FROM THE PROGRAMMING SOCKET IN ACCORDANCE WITH INSTRUCTION 10 OF THE 01472 ; PROGRAMMING ALGORITHM FOR THE AT89C2051. 01473 0342 01474 POWER_DOWN: 0342 1008 01475 BCF XTAL1 0343 1708 01476 BSF VPP_OFF 0344 30E0 01477 MOVLW 0E0H 0345 0088 01478 MOVWF PORTD 0346 233D 01479 CALL PORTB_OUTPUT 0347 0008 01480 RETURN 01481 01482 ;------------------------------------------------------------------------------------------------------- 01483 0348 01484 RED_ON: 0348 1407 01485 BSF RED 0349 1087 01486 BCF GREEN 034A 1107 01487 BCF BLUE 034B 0008 01488 RETURN 01489 01490 ;------------------------------------------------------------------------------------------------------- 01491 01492 ; SEND HEX BYTES 01493 ; ~~~~~~~~~~~~~~ 01494 034C 01495 SEND_HEX_BYTES: 034C 00C6 01496 MOVWF ASCII_CHAR_HI 034D 231E 01497 CALL HEX_TO_ASCII 034E 0846 01498 MOVF ASCII_CHAR_HI,W 034F 00A0 01499 MOVWF SERIAL_BYTE 0350 235A 01500 CALL SERIAL_OUT 0351 0847 01501 MOVF ASCII_CHAR_LO,W 0352 00A0 01502 MOVWF SERIAL_BYTE 0353 235A 01503 CALL SERIAL_OUT 0354 0008 01504 RETURN 01505 01506 ;------------------------------------------------------------------------------------------------------- 01507 0355 01508 SERIAL_IN: 0355 1E8C 01509 BTFSS PIR1,RCIF ; WAIT FOR SERIAL INPUT. 0356 2B55 01510 GOTO $-1 0357 081A 01511 MOVF RCREG,W ; FETCH AND STORE SERIAL BYTE. 0358 00A0 01512 MOVWF SERIAL_BYTE 0359 0008 01513 RETURN 01514 01515 ;------------------------------------------------------------------------------------------------------- 01516 035A 01517 SERIAL_OUT: 035A 1E0C 01518 BTFSS PIR1,TXIF ; WAIT FOR TX BUFFER TO EMPTY. 035B 2B5A 01519 GOTO $-1 035C 0820 01520 MOVF SERIAL_BYTE,W 035D 0099 01521 MOVWF TXREG 035E 0008 01522 RETURN 01523 01524 ;------------------------------------------------------------------------------------------------------- 01525 035F 01526 START_TIMER_2: 035F 108C 01527 BCF PIR1,TMR2IF ; CLEAR INTERRUPT FLAG. 0360 0191 01528 CLRF TMR2 0361 307F 01529 MOVLW 7FH ; TIMER 2, POSTSCALER 1:16, PRESCALER 1:16. 0362 0092 01530 MOVWF T2CON 0363 0008 01531 RETURN 01532 01533 ;------------------------------------------------------------------------------------------------------- 01534 0364 01535 TOGGLE_BLUE: 0364 1C8C 01536 BTFSS PIR1,TMR2IF ; TIMEOUT? 0365 2B69 01537 GOTO $+4 ; NOT YET. 0366 108C 01538 BCF PIR1,TMR2IF ; CLEAR INTERRUPT FLAG. 0367 3004 01539 MOVLW 4 ; TOGGLE BLUE LED. 0368 0687 01540 XORWF PORTC,F 0369 0008 01541 RETURN 01542 01543 ;------------------------------------------------------------------------------------------------------- 01544 036A 01545 TOGGLE_RED: 036A 1C8C 01546 BTFSS PIR1,TMR2IF ; TIMEOUT? 036B 2B6F 01547 GOTO $+4 ; NOT YET. 036C 108C 01548 BCF PIR1,TMR2IF ; CLEAR INTERRUPT FLAG. 036D 3001 01549 MOVLW 1 ; TOGGLE RED LED. 036E 0687 01550 XORWF PORTC,F 036F 0008 01551 RETURN 01552 01553 ;------------------------------------------------------------------------------------------------------- 01554 0370 01555 WAIT_PROG: 0370 22E4 01556 CALL DELAY_1MS 0371 22E4 01557 CALL DELAY_1MS 0372 0008 01558 RETURN 01559 01560 ;------------------------------------------------------------------------------------------------------- 01561 ; 01562 ; \/ / / / \ / / 01563 ; \/ _ \ \ \ / _ \ _ _ \ \ 01564 ; ) ) / \ _ ) 01565 ; _ _ / /_/ \_\ /