0% found this document useful (0 votes)
79 views

An Example 8051 Microprocessor Program

This program uses an 8051 microprocessor to display characters on an electronic sign board based on keyboard input. When a character is typed, it causes a serial port interrupt which branches program execution to an interrupt service routine. This routine reads the character from the serial port and calls a subroutine to output the corresponding 8 columns of font data to the sign board. The subroutine uses registers to point to the font data and loop 8 times to display each character.

Uploaded by

Emin Kültürel
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
79 views

An Example 8051 Microprocessor Program

This program uses an 8051 microprocessor to display characters on an electronic sign board based on keyboard input. When a character is typed, it causes a serial port interrupt which branches program execution to an interrupt service routine. This routine reads the character from the serial port and calls a subroutine to output the corresponding 8 columns of font data to the sign board. The subroutine uses registers to point to the font data and loop 8 times to display each character.

Uploaded by

Emin Kültürel
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 4

An Example 8051 Microprocessor Program

Here is an example of what a program for the 8051 microprocessor looks like. This particular program employs the serial port on the 8051 microprocessor which is an input/output device exactly like the serial port on a PC. Every time the human operator types a character on the PC's keyboard, the 8051 simulator places the corresponding ASCII byte in the 8051 microprocessor's serial port register SBUF. And each time a byte is received over the serial port, an 8051 hardware interrupt occurs, causing execution to branch to a predefined interrupt service vector. In this example program, we have chosen to place assembly code at this interrupt service vector that causes the keyboard letter to be displayed (scrolled) onto 8 consecutive columns of the electronic sign board. This particular program consists of only 42 statements and its operation is fully explained in the on-line Help documentation. ; This program paints on the signboard whatever characters the operator ; types on the computer's keyboard. The 8051 simulator creates a ; "serial port interrupt" each time the operator types an alphabetic ; character. Serial port interrupts are 1 of the 5 types of interrupts ; that an 8051 microprocessor can respond to. Once you have written ; to the IE ("interrupt enable") register, the response to an interrupt ; is automatic and occurs asynchronously to whatever other activity ; the 8051 program is involved in. The response to an interrupt is ; exactly as if the program had performed an LCALL instruction. That ; is, program execution jumps off to an interrupt service routine that ; you have placed at a predefined location in program memory. When ; Intel designed the 8051 the locations for these 5 interrupt service ; routines was permanently fixed. The serial port interrupt that ; this program employs begins at program memory address 0x23. When ; we reach the RETI instruction at the end of the interrupt service ; routine, the 8051 goes back to doing whatever it had been doing ; before it was interrupted.

ORG 0x00 ; LJMP Start ; ; ;

; this statement is not really necessary as it is the default behavior of the assembler ; jump over the prog mem locations reserved for ISVs (interrupt service vectors) and jump over the non-executable DB statements brought in by the inclusion of the FontData.txt file.

ORG 0x03 ; the ISV for the EXT 0 interrupt is 0x0003 EXT0INT: LJMP Int0Isr ORG 0x0B ; the ISV for the TMR 0 interrupt is 0x000B TMR0INT: LJMP Tmr0Isr ORG 0x13 ; the ISV for the EXT 1 interrupt is 0x0013 EXT1INT: LJMP Int1Isr ORG 0x1B ; the ISV for the TMR 1 interrupt is 0x001B TMR1INT: LJMP Tmr1Isr ORG 0x23 ; the ISV for the Serial Port interrupt is 0x0023

SERINT: LJMP SerIsr INCLUDE "FontData.txt" ORG 0x100 ; the interrupt service vectors consume program memory ; locations 0x03 thru 0x25 = 37 and the DB statements ; in FontData.txt consume another 27*8 = 216 bytes ; (remember there is a space character after Z). ; Hence this program memory address of 0x100 = 256 is ; safely past these items. Start: MOV DPTR,#StartOfImageData ; We initialize the DPTR ("data pointer"), a 16 bit ; SFR ("special function register"), to point to ; the first column of font data (the first column ; of the letter 'A') in program memory. The DPTR ; register continues to hold this same value ; throughout this program. MOV SCON,#0x10 ; assert REN so the serial port is enabled to receive MOV IE,#0x90 ; 10010000B, MSBit is the global intr enable, ; the other bit we raise is ES, the serial ; port interrupt enable MOV A, #0x01 ; we walk this 1 bit across the signboard while ; waiting for an interrupt Loop: RL A MOV P0,A SJMP Loop ; loop while waiting for an interrupt

; If we somehow land in any of the interrupt service routines that this ; program is not prepared to handle we just initiate an infinite loop ; so we can detect the mistake. Int0Isr: ; interrupt service routine for EXT 0 interrupt SJMP Int0Isr Int1Isr: ; interrupt service routine for EXT 1 interrupt SJMP Int1Isr Tmr0Isr: ; interrupt service routine for TMR 0 interrupt SJMP Tmr0Isr Tmr1Isr: ; interrupt service routine for TMR 1 interrupt SJMP Tmr1Isr SerIsr: ; interrupt service routine for the serial port ; interrupt PUSH ACC ; protect the prior value in the ACC since the ; interrupt service routine needs to use it MOV A,SBUF ; read alphabet index from serial buffer SFR LCALL Draw1Char

POP ACC ; restore the prior value of the ACC MOV SCON,#0x10 ; clear the RI bit in SCON (leave REN asserted) RETI Draw1Char: ; This is a subroutine which is responsible for outputting exactly 8 ; columns (hence 1 character) of font data to the electric sign board. ; Before you call this subroutine initialize the ACC with the index ; of the desired character. That is, if you want the letter 'C' ; output to the sign board then call this subroutine with ACC = 2. ; We first need to convert the letter index (ranging from 0 to 26) ; to a column index (ranging from 0 to 208). This column index ; will describe the byte offset to that letter's column data. ; the ACC presently holds an alphabet index MOV B,#8 ; each letter has 8 columns MUL AB ; This computes the byte offset beyond ; StartOfImageData where the letter starts. This ; product is guaranteed to be < 256 since the ; entire alphabet only has 216 (27*8) columns ; (remember there is a space char after Z), ; hence we only need to keep (deal with) the ; LSByte of the product. The LSByte is found ; in the ACC following the "MUL AB" instr. ; Within this subroutine we use R0 as a temporary storage location ; for the accumulator's value (we need this because the "MOVC A,@A+DPTR" ; instruction keeps perturbing the accumulator). And we use the ; R1 register to control the loop (that is, decide how many times ; we iterate). Note that R0 is synonymous with data memory location 0 ; and R1 is synonymous with data memory location 1 (at least while the ; 8051 is in its default configuration). MOV R0,A ; preserve this starting column # since the ; upcoming "MOVC A,@A+DPTR" instruction ; replaces the value in the ACC MOV R1,#0 ; we use R1 to control the looping CharLoop: MOV A,R0 ; prepare for upcoming "MOVC A,@A+DPTR" instruction MOVC A,@A+DPTR ; the ACC now holds one column of font data MOV P0,A ; write that column to the sign board INC R0 ; advance to the next column INC R1 ; increment the loop counter CJNE R1,#8,CharLoop ; we loop 8 times in order to output 8 columns RET

You might also like