Virginia Commonwealth University



[pic]

[pic]

[pic]

8051 Examples

;****************************************************************

;FUNCTION: HEX2ASC_TBL - CONVERT LEAST SIG NIBBLE OF A TO ASCII

; USING LOOK UP TABLE

; INPUTS: A(3_0) - HEX DIGIT

; OUTPUTS: A - ASCII CHAR CORESPONDING TO HEX DIGIT IN A(3_0)

; CALLS: NONE

;DESTROYS: A, DPTR

;****************************************************************

;ASCII LOOK UP TABLE

ASC_TBL:

DB '0'

DB '1'

DB '2'

DB '3'

DB '4'

DB '5'

DB '6'

DB '7'

DB '8'

DB '9'

DB 'A'

DB 'B'

DB 'C'

DB 'D'

DB 'E'

DB 'F'

HEX2ASC_TBL:

MOV DPTR,#ASC_TBL ;POINT TO LOOK UP TABLE

ANL A,#0FH ;USE ONLY LEAST SIG NIBBLE TO LOOK UP

MOVC A,@A+DPTR ;ASCII VALUE

RET

;****************************************************************

;FUNCTION: HEX2ASC - CONVERT LEAST SIG NIBBLE OF AL TO ASCII

; INPUTS: A(3_0) - HEX DIGIT

; OUTPUTS: A - ASCII CHAR CORESPONDING TO HEX DIGIT IN AL(3_0)

; CALLS: NONE

;DESTROYS: A, PSW

;****************************************************************

HEX2ASC:

ANL A,#0FH ;GET LEAST SIG NIBBLE

CLR C ;CLEAR CARRY

SUBB A,#0AH ;SET CARRY IF ACC IS LESS THAN 0AH

JC LTA ;JUMP IF ACC 9 i.e. A --> 00 AND SET CY

ADDC A,#40H ;IF >9 CARRY WAS SET ie. A --> 41H ELSE

DA A ;LSN IS INCREASED BY 30H

RET

;****************************************************************

;FUNCTION: ASC2HEX - CONVERT ASCII CHAR IN A TO HEX DIGIT. A IS

; ASSUMED TO CONTAIN THE UPPER CASE ASCII FOR A VALID HEX DIGIT

; THE TRANSLATION IS AS SHOWN BELOW

; INPUT AL OUTPUT AL

; '0'=30H 00000000B

; '1'=31H 00000001B

; ... ...

; 'A'=41H 00001010B

; ... ...

; 'F'=46H 00001111B

;

; INPUTS: AL - THE ASCII CHAR '0'..'9', 'A'..'F'

; OUTPUTS: AL - HEX NIBBLE 00 ..09 , 0A ..0F

; CALLS: NONE

;DESTROYS: AL, PSW

;****************************************************************

ASC2HEX:

CLR C ;CLEAR CARRY

SUBB A,#'A' ;SET CARRY IF A < 'A'

JNC HEXFIX ;JUMP IF A WAS 'A' - 'F'

ADD A,#'A'-'0'-0AH ;DO THIS IF A WAS '0' - '9'

HEXFIX: ADD A,#0AH ;A NOW CONTAINS HEX VALUE

RET

;****************************************************************

;FUNCTION: UPPER - CONVERT ASCII CHAR IN A TO UPPER CASE

; INPUTS: A - ASCII CHAR

; OUTPUTS: A - UPPER CASE ASCII CHAR

; CALLS: NONE

;DESTROYS: A, PSW

;****************************************************************

UPPER:

CJNE A,#'a',LOWIFC ;SET CY IF CHAR < 'a'

CHKHI: CJNE A,#'z'+1,UCONV ;SET CY IF CHAR

DB 00110010B ;?

ASC40: DB 10000000B ;@

DB 01100000B ;A

DB 10001000B ;B

DB 10101000B ;C

DB 10010000B ;D

DB 01000000B ;E

DB 00101000B ;F

DB 11010000B ;G

DB 00001000B ;H

DB 00100000B ;I

DB 01111000B ;J

DB 10110000B ;K

DB 01001000B ;L

DB 11100000B ;M

DB 10100000B ;N

DB 11110000B ;O

ASC50: DB 01101000B ;P

DB 11011000B ;Q

DB 01010000B ;R

DB 00010000B ;S

DB 11000000B ;T

DB 00110000B ;U

DB 00011000B ;V

DB 01110000B ;W

DB 10011000B ;X

DB 10111000B ;Y

DB 11001000B ;Z

DB 10000000B ;

DB 10000000B ;

DB 10000000B ;]

DB 10000000B ;^

ASC5F: DB 00000000B ;DEL SEND ERROR

$EJECT

;*****************************************************************************

; FUNCTION: SEND - SENDS THE MORSE CODE FOR THE ASCII CHARACTER IN A.

; The tone is on for 1 delay time for a DIT.

; The tone is off for 3 delay times for a DAH.

; The tone is off for 1 delay time between dits and dahs.

; The tone is off for 3 delay times between letters.

; The tone is off for 5 delay times between words.

; EXAMPLES: IF A = 00110000B The output should be:

; ON OFF ON OFF ON ON ON OFF OFF OFF.

; IF A = 11110000B. The output should be:

; ON ON ON OFF ON ON ON OFF ON ON ON OFF OFF OFF.

; IF A = 11111111B (space). Make the output:

; OFF OFF. This really causes a tone off for 5 delay times

; since the preceding letter ended with tone off for 3 delay times.

; IF A = 00000000B (error). The output should be

; ON OFF ON OFF ON OFF ON OFF ON OFF ON OFF ON OFF ON OFF OFF OFF.

; INPUTS: A - ASCII CHAR.

; TABLE- TABLE TO CONVERT COMPRESSED

; ASCII TO MORSE CODE.

; OUTPUTS: DITS, DAHS, AND . ON THE SCREEN

; CALLS: DIT, DAH, DELAY

; DESTROYS: A, DPTR, PSW,...

;*****************************************************************************

SEND:

MOV DPTR,#TABLE ;POINT DPTR TO MC TABLE

MOVC A,@A+DPTR ;LOOK UP MORES CODE

CJNE A,#0FFH,DECODE ;jUMP IF NOT A SPACE?

FINISH: CALL DELAY ;TIME OUT AT END OF

CALL DELAY ;CHARACTER.

RET

DECODE: CLR C ;CLEAR CY

JNZ SHIFT ;IF ZERO SEND 8 DITS

SETB C ;SET STOP BIT

SHIFT: RLC A ;SHIFT

JZ FINISH ;IF ZERO AFTER SHIFT IT'S DONE

JNC DITBIT ;SEND DIT ON 0.

CALL DAH ;SEND DAH ON 1.

JMP DECODE ;CONTINUE

DITBIT: CALL DIT ;SEND DIT

JMP DECODE ;CONTINUE

;*****************************************************************************

; DESCRIPTION: FIXCHR-MAKES UPPER CASE AND LOWER

; CASE LETTERS THE SAME, THUS COMPRESSING

; THE ASCII TABLE TO 6 BITS.

; THE ALGORITHM USED IS AS FOLLOWS.

; BITS 4-0 REMAIN UNCHANGED.

; BIT 5 IS REPLACED BY BIT 6.

; BIT 6 AND 7 ARE RESET TO 0.

; INPUTS: A-ASCII TABLE.

; OUTPUTS: A-COMPRESSED ASCII TABLE.

; CALLS: NONE

; DESTROYS: A,PSW.

;*****************************************************************************

FIXCHR:

ANL A,#01011111B ;ZERO BITS 5 AND 7

JNB ACC.6,FEXIT ;IF BIT 6 = 0 THRN EXIT

XRL A,#01100000B ;CLEAR BIT 6 SET BIT 5

FEXIT: RET ;AND RETURN

;*****************************************************************************

; FUNCTION: DELAY- OUTPUT SPACE TO INDICATE TIME WITHOUT TONE

; INPUTS: NONE

; OUTPUTS: NONE

; CALLS: CHAROUT

; DESTROYS: R6, R7

;*****************************************************************************

DELAY:

MOV R6,80H ;Set delay time

WAIT: DJNZ R7,WAIT ;Loop for

DJNZ R6,WAIT ;Delay

RET

;*****************************************************************************

; FUNCTION: DIT - OUTPUT A DIT

; INPUTS: NONE

; OUTPUTS: NONE

; CALLS: TONEON, DELAY, TONEOFF

; DESTROYS: NONE

;*****************************************************************************

DIT:

CALL TONEON ;TURN TONE ON

CALL DELAY ;DELAY FOR ONE DIT TIME

CALL TONEOFF ;TURN TONE OFF

CALL DELAY ;DELAY FOR ONE DIT TIME

RET

$EJECT

;*****************************************************************************

;

; FUNCTION: DAH - OUTPUT A DAH

; INPUTS: NONE

; OUTPUTS: NONE

; CALLS: TONEON, DELAY, TONEOFF

; DESTROYS: NONE

;*****************************************************************************

DAH:

CALL TONEON ;TURN TONE ON

CALL DELAY ;DELAY FOR ONE DIT TIME

CALL DELAY ;DELAY FOR ONE DIT TIME

CALL DELAY ;DELAY FOR ONE DIT TIME

CALL TONEOFF ;TURN TONE OFF

CALL DELAY ;DELAY FOR ONE DIT TIME

RET

;*****************************************************************************

; FUNCTION: TONEON - TURNS TONE ON

; INPUTS: NONE

; OUTPUTS: P3.4

; CALLS: NONE

; DESTROYS: P3.4

;*****************************************************************************

TONEON:

CLR P3.4 ;OUTPUT 0 TO TURN TONE ON

RET

;*****************************************************************************

; FUNCTION: TONEOFF - TURNS TONE OFF

; INPUTS: NONE

; OUTPUTS: P3.4

; CALLS: NONE

; DESTROYS: P3.4

;*****************************************************************************

TONEOFF:

SETB P3.4 ;OUTPUT 1 TO TURN TONE OFF.

RET

;*****************************************************************************

MSG: DB 'This is a test program.'

MSGEND: DB ' '

END

................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download