??? 02/15/06 19:03 Read: times |
#110093 - here we are Responding to: ???'s previous message |
this is exactly doing what you want. This routine receives characters by using an ISR routine, send a local echo and display the received char. at the display.
If you need a polling example let me know. Bernd ; - Zero waitstates @ 38400 BAUD - (Transmit Delay 0 mSec). $NOMOD51 ;ignore standard SFR $INCLUDE(89S8252.MCU) ;recognize AT89S8252 SFR CODE_MEM_MAIN EQU 0100H ;main starts @ 0100H LF EQU 0AH ;line feed CR EQU 0DH ;carriage return CLK EQU P2.4 ;display clock signal EN EQU P2.2 ;display enable signal DD_BUS EQU P2.0 ;display databus DPL EQU DP0L ;DPL = DP0L @ AT89S8252 DPH EQU DP0H ;DPH = DP0H @ AT89S8252 BUFFER EQU 30H ;byte buffer @ 30H int. RAM CHAR_RCV_FLAG BIT 0 ;character received Flag CSEG AT RESET ; ljmp START ;jump above interrupts CSEG AT RESET+23H ;serial interrupt @ address 0023H ljmp SER_INT ;UART ISR CSEG AT CODE_MEM_MAIN ; START: call INIT_DISPLAY ;initialize display call INIT_UART ;initialize UART MAIN: jnb char_rcv_flag,$ ;do nothing till byte received Flag is set mov a,buffer ;read buffer cjne a,#24H,M1 ;If a="$" then call cursor_home ;move cursor to the home position ljmp main ;loop M1: cjne a,#25H,M2 ;else If a="%" then call clear_display ;clear display ljmp main ;loop M2: cjne a,#26H,M3 ;else If a="&" then mov a,#0A8H ;move cursor to the call enable ;2nd line ljmp main ;loop M3: call enable_data ;else write data to the display ljmp MAIN ;loop ;/// - UART ISR - SER_INT: push psw ;save psw push acc ;save acc push dpl ;save dpl push dph ;save dph jb ri,receive ;receiver interrupt ? jnb char_rcv_flag,ser_exit ;transmitter ready & no new char. mov sbuf,buffer ;send byte clr ti ;clear transmitter interrupt clr char_rcv_flag ;clr character received Flag sjmp ser_exit ;exit ISR RECEIVE: mov buffer,sbuf ;received byte into buffer clr ri ;clear receiver interrupt setb char_rcv_flag ;set Flag SER_EXIT: pop dph ;get dph pop dpl ;get dpl pop acc ;get acc pop psw ;get psw reti ;return from interrupt ;/// - initialize UART @ 38400 BAUD - INIT_UART: mov tmod,#20H ;timer MODE 1, 8 BIT auto reload mov th1,#0FDH ;timer preset for 38400 BAUD mov scon,#01011010B ;SM0=0 SM1=1 REN=1 TB8=1 RB8=1 TI=1 mov pcon,#10000000B ;double BR_BIT=1 => @ 38400 BAUD setb tr1 ;set timer RUN BIT setb es ;enable serial interrupt setb ea ;enable global interrupt clr char_rcv_flag ;clear character received Flag ret ; ;/// - initialize display INIT_DISPLAY: call wait_2 ;wait 15 mSec. after Power ON mov r1,#03H ;3x38h INITIALIZE: mov a,#38H ;set databus to 8 Bit call enable ;entry mode inc. + shift call wait_0 ;wait 4.1 mSec. djnz r1,initialize ;loop initialize 3x times mov a,#0DH ;cursor set to: call enable ;off/on/blink = 0Ch/0Eh/0Dh call clear_display ;clear display ret ; ;/// - display data transfer of control command - ENABLE: clr c ;serial instruction clr en ;enable = 0 mov r7,#08h ;send 8 Bits SERIOUT: rlc a ; mov dd_bus,c ;data @ P2.0 setb clk ;clock @ P2.4 clr clk ; djnz r7,seriout ; clr dd_bus ;RS Bit = 0 setb en ;enable @ P2.2 clr en ; call wait_1 ; ret ; ;/// - display data transfer of write data command - ENABLE_DATA: clr c ;serial data clr en ;enable = 0 mov r7,#08h ;send 8 Bits SERDOUT: rlc a ; mov dd_bus,c ;data @ P2.0 setb clk ;clock @ P2.4 clr clk ; djnz r7,serdout ; setb dd_bus ;RS Bit = 1 setb en ;enable clr en ; call wait_1 ; ret ; ;/// - waitstates for display data & control commands - WAIT_0: mov r2,#0Fh ;base clock 89S8252 22.118 MHz mov r0,#9Bh ;init timing 3 cycles WAIT__0: djnz r0,wait__0 ;interval 4.1 mS djnz r2,wait__0 ; ret ; WAIT_1: mov r0,#24h ;time for next display instruction djnz r0,$ ;42uSec. ret ; WAIT_2: mov r2,#36h ;delay 15 mSec. mov r0,#7Bh ;after Power on WAIT__2: djnz r0,wait__2 ; djnz r2,wait__2 ; ret ; ;/// - display commands - CURSOR_HOME: mov a,#02h ;cursor home call enable ; call wait_0 ; ret ; CLEAR_DISPLAY: mov a,#01h ;clear display call enable ; call wait_0 ; ret ; end |