??? 07/07/08 13:04 Read: times |
#156470 - You have to enrich your library of Assembly Code Responding to: ???'s previous message |
Dear Alan,
You have to enrich your library of Assembly Code for 8051. Here you will find most common code to a. Init_Serial: Intitialise the Serial Port (polling method) b. getchar: Receive a character from UART c. putchar: Send a character from UART d. prints: Print a string (text message) from Code memory e. print_byte: Print a byte in Accumulator as a Hex Number print_hex: -same as above- f. print_bin99 Print a byte in Accumulator as a decimal 00-99d also: a simple call from your MAIN Program and: some definitions for CR/LF, FF, string, prompt This code is already running in a AT89S4051 at 11.0592 MHz maintained by IAR Assembler. may this is helpful to you K.L.Angelis ;====================================== Init Serial Port at 9600,8,n,1,noHandShake Init_Serial: ; (Assuming XTAL 11.0592MHz, 12cycles) clr TCON_TR1 ; Stop Timer1 mov A, TMOD ; TMOD = (TMOD & 0x0F)|0x20 anl A, #0x0F ; TMOD = 0000dddd (clear Timer1 bits) orl A, #0x20 ; TMOD = 0010dddd (set M1=1 M0=0) mov TMOD, A ; Timer1 at mode2 8bit autoreload mov A, PCON ; PCON &= 0x7F anl A, #0x7F ; clear PCON.7 = SMOD double rate mov PCON, A ; 0=x1 baud rate, 1=x2 baud rate mov SCON, #0x52 ; REN=1 (ready to receive) ; TI=1 (ready to transmit next char) mov TH1, #0xFD ; Reload value TH1 mov TL1, #0xFD ; Reload value TL1 setb TCON_TR1 ; Start Timer1 as Baud Rate Generator ret ;====================================== getchar Returns received character in A getchar: ; gtchr1: jbc SCON_RI, gtchr2 ; if RI=1 (char received) clear RI sjmp gtchr1 ; polled wait for RI=1 gtchr2: mov A, SBUF ; then return the char in A ret ;====================================== putchar Transmit a character in A ===== putchar: ptchr1: jbc SCON_TI, ptchr2 ; if TI=1 (ready for next) clear TI sjmp ptchr1 ; polled wait for TI=1 ptchr2: mov SBUF, A ; then send the next char to TX ret ;====================================== prints DPTR points to a string ======== prints: ; in Code memory prnts1: clr A ; print string Null terminated movc A, @A+DPTR ; jz prnts2 ; Check for NULL #0x00 acall putchar ; print character inc DPTR ; get next sjmp prnts1 ; prnts2: ret ;====================================== print_hex or print_byte =============== print_byte: ; print_hex: ; Print a hex value in A to stdio (ANSI) ; eg. A has 11010111 ==> D7 prh_a: ; uses A, B push B ; save B mov B, A ; save A in B anl A, #0xF0 ; mask upper nibble swap A ; now A has 0000xxxx cjne A, #0x0A, prh_c ; check A <> 10 prh_b: add A, #0x37 ; if A = 0x0A then add 0x37 ('A'-10) sjmp prh_d ; goto print prh_c: jnc prh_b ; if A > 0x0A same a s A=0x0A add A, #0x30 ; if A < 0x0A then add 0x30 ('0') prh_d: acall putchar ; print high nibble mov A, B ; get the value from B anl A, #0x0F ; mask the low nibble cjne A, #0x0A, prh_f ; check A <> 10 prh_e: add A, #0x37 ; if A = 0x0A then add 0x37 ('A'-10) sjmp prh_g ; goto print prh_f: jnc prh_e ; if A > 0x0A add A, #0x30 ; if A < 0x0A then add 0x30 ('0') prh_g: acall putchar ; print high nibble pop B ; restore B mov A, B ; restore A ret ;====================================== print_bin99 prints a byte 00h-63h ASCII print_bin99: push A ; A holds the byte to be printed push B ; push PSW ; prb99_a: ; while (A>=100) A-=100 cjne A, #100, prb99_b ; sjmp prb99_c ; A=100 prb99_b: jc prb99_d ; if A<100 then exit prb99_c: clr C ; A>=100 subb A, #100 ; A-=100 sjmp prb99_a ; prb99_d: mov B, #10 ; divider by decimal 10 div AB ; quotiend=piliko in A (dekades) ; remainder-ypoloipo in B (monades) add A,#'0' ; make quotiend 0h-9h ASCII 30h-39h acall putchar ; dekades first mov A, B ; add A, #'0' ; make remainder ASCII 30h-39h acall putchar pop PSW pop B pop A ret ;====================================== PART of MAIN ======================= ... acall Init_Serial ... mov DPTR, #string1 ; Send String1 acall prints ; mov DPTR, #CRLF ; Send CRLF acall prints ; mov DPTR, #prompt ; Prompt "0>" acall prints ; ... sjmp $ ;=========================================================================== CRLF: DB 0x0D, 0x0A, 0x00 ; Carriage Return, Line Feed, Null term. FF: DB 0x0C ; FormFeed string1: DB "String 1 to print" ; Double quotes = NULL terminated string prompt: DB "0>" ; Prompt |