Nhìn chung, phần mềm trên máy tính và chơng trình điều khiển àC chạy thử nghiệp cho kết quả tốt. Hai chơng trình này hoạt động một cách đồng bộ trong việc truyền nhận dữ liệu, do đó kết nối thành một hệ thống hoàn chỉnh. Phần mềm trên PC không chỉ biểu diễn đợc các giá trị nhiệt độ dạng đồ thị theo
thời gian mà còn có thể lu trữ các thông tin cần thiết trong quá trình thu thập dữ liệu và các thông tin lu trữ này có thể đợc xem lại khi cần thiết. Kết quả ADC đ- ợc truyền sang máy tính để máy tính thực hiện các thao tác phức tạp nh dựng đồ thị và lu trữ, điều này giúp cho công việc lập trình trở nên đơn giản và đỡ tốn thời gian cũng nh chi phí so với việc thực hiện công việc này trên àC.
Về cơ bản mạch phần cứng đã đợc lắp rắp hoàn chỉnh và chạy thử cho kết quả tốt đáp ứng đợc yêu cầu đề ra của đồ án. Song do điều kiện về thời gian nên không kịp thiết kế mạch in theo kỹ thuật có nên cũng phần nào ảnh hởng đến chất lợng kỹ thuật cũng nh chất lợng về mặt cảm quan của sản phẩm. Ngoài ra, do kinh nghiệm trong việc thiết kế phần cứng còn nhiều hạn chế nên việc ghép nối giữa àC với các modul khác qua các cổng I/O của àC AT90S8535 cha thực sự tối u.
Hoạt động trao đổi dữ liệu dữ máy tính và RTU đợc thực hiện dựa trên ph- ơng pháp truyền thông nối tiếp theo chuẩn RS232, do đó tốc độ truyền dữ liệu bị hạn chế. Mặt khác, do dữ liệu đợc truyền trực tiếp từ àC tới máy tính mà không qua Modem nên khoảng cách giữa máy tính vào RTU cũng bị giới hạn.
Mặc dù hệ thống cần thiết kế đã hoàn thành, tuy nhiên có thể thấy nó có một số hạn chế trong đó hạn chế lớn nhất là khả ứng dụng trong thực tế của sản phẩm không cao. Nên mặc dù việc thay đổi đại lợng biến đổi ở đầu vào của bộ chuyển đổi A/D trong hệ thống để phù hợp với các ứng dụng thực tế không đòi hỏi nhiều chi phí và thời gian thiết kế lại mạch, nhng chơng trình điều khiển àC và chơng trình trên PC cần có những thay đổi thích hợp.
Kết luận
Trong bản báo có đồ án tốt nghiệp này, em đã nêu ra một số lý thuyết sử dụng để thiết kế và quy trình công việc phải thực hiện trong thực tế. Nói chung công việc đã hoàn thành theo đúng tiến độ đề ra, tuy nhiên do năng lực cũng nh kinh nghiệm về lĩnh vực công nghệ phần cứng còn nhiều yếu kém nên đồ án không thể tránh đợc những thiếu sót. Tuy nhiên, trong thời gian thực hiện đồ án, em cũng đã rút ra đợc một số kinh nghiệm quý báu, điều này rất cần thiết cho em khi ra làm việc thực tế.
Nói chung, hệ thống cần thiết kế đã hoàn thành và chạy thử nghiệp cho kết quả tốt. Do mục đích của đồ án là tìm hiểu nguyên lý hoạt động và thực hiện điều khiển một bộ vi xử lý AT90S8535, đây là một àC còn rất mới của hãng ATMEL nên sản phẩm đợc thiết kế hầu nh không đợc ứng dụng trong thực tế mà chỉ mang tính thử nghiệm. Tuy nhiên, thông qua quá trình tìm hiệu và sử àC AT90S8535 để thiết kế, có thể giúp em hiểu phần nào về công nghệ phần cứng ứng dụng trong các lĩnh vực khác nhau trong cuộc sống. Sau khi hoàn thành đồ án, em sẽ tìm hiểu thêm các kiến thức về kỹ thuật phối ghép để có thể thực hiện thiết kế những mạch điện tử có khả năng ứng dụng cao trong thực tế.
Một lần nữa em xin chân thành cảm ơn thầy giáo hớng dẫn Bùi Quốc
Anh đã tận tình hớng dẫn và giúp đỡ em rất nhiều trong suốt thời gian thực
hiện đồ án này. Em cũng xin chân thành sự giúp đỡ của các anh làm việc ở trung tâm NET.JSC đã giúp đỡ em hoàn thành bản đồ án này.
Phụ lục
Chơng trình điều khiển àC AT90S8535
.nolist .include "\AVR\AvrAssembler\Appnotes\8535def.inc" .list ;Defined register .def Save = r1 .def HPtrTx = r2 .def LPtrTx = r3 .def HPtrRxL = r4 .def HPtrRxH = r5 .def ShowRxL = r6 .def ShowRxH = r7 .def ResultADCL = r8 .def ResultADCH = r9 .def Implement = r10 .def StatementReg = r13 .def TimeOut = r16 .def Temp = r17 .def Instr = r18 .def Data = r19 .def AddrShow = r20 .def KeyPress = r21 .def CtrlReg = r22 .def OldKey = r23 .def Position = r24 .def PositionH = r25 ;Defined control constant
.equ RS = 6 ;RS signal
.equ RW = 5 ;RW signal
.equ E = 4 ;Enable signal
;Control KeyPad .equ Row1 = 7 .equ Row2 = 6 .equ Row3 = 5 .equ Row4 = 4 .equ Col1 = 0 .equ Col2 = 1 .equ Col3 = 2 .equ Col4 = 3
.equ INTRATE = 4 ;INT rate keypress
.equ EnImpKey = 1 .equ ImpKey = 0 .equ EnSelectTxRx = 4 .equ SelectTxRx = 2 .equ EnShowRxBuff = 8 .equ ShowRxBuff = 3 .equ EnInstroduc = 2 .equ Instroduc = 1 .equ EnOnKeyPress = $80 Trang 126
.equ OnKeyPress = 7 .equ PressOne = 0 .equ PressTwo = $10 .equ PressThree = $20 .equ PressFour = $30 .equ CR = $0D
.equ Statement = $23 ;Ascii '#'
.equ EnShow_CK = $01 ;Show cencius
.equ Show_CK = 0
.equ EnShowSymbolTempr = $02 ;Show symbol Tempr .equ ShowSymbolTempr = 1
.equ EnCencius = $01 ;Display temprature for cencius
;Macro get address of last char in string
.macro Get_Addr_Char
ldi Position,@0 ;Last position show @0
ldi Instr,@1 ;Display on line @1
ldi Temp,@2 ;Total char of string @2
ldi ZL,LOW(@3<<1) ;Name of string @3 ldi ZH,HIGH(@3<<1)
adiw ZL,@2-1 ;Get address of last char in string .endmacro
;Macro get address of string .macro Get_Addr_String
ldi Instr,@0 ;Position show @0
ldi @1,LOW(@3<<1) ;Low pointer @1, name's string @3 ldi @2,HIGH(@3<<1) ;High pointer @2
ldi Temp,@4 ;Total char @4
.endmacro
;Macro set first ascii code for keypress .macro Set_First_Ascii
ldi Data,@0 ;Ascii of number @0
ldi Position,@1 ;Ascii of prechar @1 .endmacro
;Macro get position to display for char .macro Get_Position
cpi @0,@1 ;Position to show @0,
breq GetPos ;Position last @1
inc @0 GetPos: mov Instr,@0 .endmacro
;Create buffer for RxD and TxD .dseg
.org $0060
TxBuff : .byte 128 ;Buffer send RxBuff : .byte 128 ;Buffer receive ;Defined constant of buffer
.equ EndTxBuff = LOW(TxBuff)+127 .equ StartTxBuff = LOW(TxBuff)-1 .equ EndRxBuffL = $62
rjmp RESET
rjmp SCAN_CODE .org $006
rjmp ENABLE_ADC ;Enable ADC
.org $008
rjmp KEY_RATE ;INT KEYRATE
.org $00B
rjmp Rx_COMPELET .org $00E
rjmp END_CONVERT ;End convert ADC
.org $011
PrefA1 : .db "TRUONG DHBK HA NOI" PrefA2 : .db "KHOA CNTT"
PrefA3 : .db "DO AN TOT NGHIEP" PrefA4 : .db "NG.CUU IC AT90S8535" PrefB1 : .db "SINH VIEN THUC HIEN" PrefB2 : .db "VU TAN MANH"
PrefB3 : .db "GIAO VIEN HUONG DAN" PrefB4 : .db "BUI QUOC ANH"
Tile : .db " MEASURE TEMPERATURE" Info : .db "CURRTEMP ="
Symbol : .db "Tx:" ADCon : .db "Waiting"
OverTx : .db "OverB! you send?" SendTo : .db "Sending... " RESET:
ldi Temp,LOW(RAMEND) ;Init Stack out SPL,Temp
ldi Temp,HIGH(RAMEND) out SPH,Temp
cli
;Init register Control clr CtrlReg
clr StatementReg clr Implement ;Init port I/O of LCD
ldi Temp,$0F ;Data lines
out DDRC,Temp
ldi Temp,$70 ;Control Lines (bits 4,5,6)
out DDRD,Temp ;Init INT0 and LCD busy
ldi Temp,$02
out PORTD,Temp ;set pullup on pin 2
rcall LCD_INIT
rcall SHOW_PREFACEA rcall SHOW_PREFACEB rcall DISPLAY_INTERFACE
Get_Addr_String $8B,ZL,ZH,ADCon,7
rcall SHOW_STRING ;Show string wait
rcall SHOW_SELECT_TxRx
;Create port for KeyPad and int register
ldi Temp,$F0 ;lower nibble input
out DDRB,Temp
ldi Temp,$0F ;Set pullup on lower nibble
out PORTB,Temp ldi OldKey,-1
ldi AddrShow,$97 ;Preaddress to show clr KeyPress
;Init address pointer to buffer Tx clr XH
ldi Temp,StartTxBuff mov LPtrTx,Temp ldi Temp,LOW(TxBuff) mov HPtrTx,Temp ;Init pointer to buffer Rx clr YH
ldi YL,StartRxBuff mov HPtrRxH,YH mov HPtrRxL,YL ;Init INT of KeyPad ldi Temp,$40 out GIMSK,Temp
ldi Temp,$00 ;Soure trigger INT0 at lower
out MCUCR,Temp ;Init UART
ldi Temp,$98 ;Enable INT Rx compelet
out UCR,Temp ;8 bit data 1 stop, 1 start
ldi Temp,$33 ;baud = 9600bps
out UBRR,Temp
clr Implement ;Init register statement
;Init Interrup comperaA match of TC1 ldi Temp,$10
out TIMSK,Temp
ldi Temp,$0C ;Set value $0000 to counter
out TCCR1B,Temp ;CK/256 = 31.250Hz
ldi Temp,$01 ;Value for comperaA match 312
out OCR1AH,Temp ;312*(256*0,125)us = 10ms
ldi Temp,$38 out OCR1AL,Temp ;Init ADC
ldi Temp,$00 ;Input ADC is PA0
out ADMUX,Temp
ldi Temp,$8F ;Enable single mode
out ADCSR,Temp ldi Temp,-1
mov ResultADCH,Temp ;Condition show symbol Tempr clr ResultADCL
sei MAIN:
sbrs KeyPress,OnKeyPress ;Have a key press rjmp NoKeyPress
cbr KeyPress,EnOnKeyPress ;Get real KeyPress sbrs CtrlReg,ImpKey
rjmp NormalKey rcall CONTROL_KEY rjmp EndKeyPress NormalKey:rcall DISPLAY_KEY
sbr Temp,TOIE1 out TIMSK,Temp
ldi Temp,$E7 ;Init counter for int overflow TC1
out TCNT1H,Temp ;65.536 - 6.250 = $E796
ldi Temp,$96 ;6.250*(256*0.125) = 200mS
out TCNT1L,Temp
EndKeyPress:in Temp,GIFR ;Clear flag INT SCAN_CODE
out GIFR,Temp
ldi Temp,$40 ;Enable INT SCAN_CODE
out GIMSK,Temp NoKeyPress:ldi Temp,-1 cp ResultADCH,Temp brne SetShowSymbol mov Temp,StatementReg sbr Temp,EnShowSymbolTempr mov StatementReg,Temp SetShowSymbol:sbrc StatementReg,ShowSymbolTempr rcall SHOW_SYMBOL_CK tst Implement brmi SkipToBack rcall EXCUTER_FROM_PC SkipToBack:rjmp MAIN ;Program control LCD ;(RS = 0,RW = 1) LCD_BUSY:
sbi PORTD,RW ;Select DR
Busy: sbi PORTD,E ;Read 4 MSBs bit
nop
cbi PORTD,E
sbis PIND,7 ;LCD Busy
rjmp NoBusy
sbi PORTD,E ;Ignore 4 LSBs bit
nop
cbi PORTD,E rjmp Busy NoBusy: sbi PORTD,E
cbi PORTD,RW cbi PORTD,E ret
;Instroduction in register Intr ;(RS = 0, RW = 0)
LCD_INSTR:
swap Instr ;Send 4 MSB bits
out PORTC,Instr nop
sbi PORTD,E nop
cbi PORTD,E
swap Instr ;Send 4 LSB bits
out PORTC,Instr nop sbi PORTD,E nop cbi PORTD,E ret
;Data in register Data
;(RS = 1, RW = 0) LCD_DATA:
sbi PORTD,RS
swap Data ;Send 4 MSB bits
out PORTC,Data nop
sbi PORTD,E nop
cbi PORTD,E
swap Data ;Send 4 LSB bits
out PORTC,Data nop sbi PORTD,E nop cbi PORTD,E cbi PORTD,RS ret ;Init LCD LCD_INIT:
ldi TimeOut,$96 ;Wait 15ms after LCD on
rcall DELAY
ldi Instr,$3F ;Function set
rcall LCD_INSTR
ldi TimeOut,$29 ;Wait 4.1ms
rcall DELAY rcall LCD_INSTR
ldi TimeOut,$01 ;Wait 100us
rcall DELAY rcall LCD_INSTR
ldi Instr,$28 ;Set 4 bits interface
rcall LCD_BUSY ;on 2 line, font 5x7 dots
rcall LCD_INSTR
ldi Instr,$08 ;LCD off
rcall LCD_BUSY rcall LCD_INSTR
ldi Instr,$01 ;Reset DDRAM
rcall LCD_BUSY rcall LCD_INSTR
ldi Instr,$0C ;LCD on
rcall LCD_BUSY rcall LCD_INSTR
ldi Instr,$06 ;Set address of
rcall LCD_BUSY ;DDRAM increment
rcall LCD_INSTR ret
;Run char to fixed Position, char in Data ;first address in Instr
RUN_TO_POS:
cpi Data,$20 breq NoRun push Temp push Instr RunChar: rcall LCD_BUSY
ldi Temp,$0A ;Wait 250ms rcall TIMEWAIT
push Data ;Clear char
ldi Data,$20
rcall LCD_INSTR ;Get position to clear
rcall LCD_BUSY rcall LCD_DATA pop Data
inc Instr ;Next position show
rjmp RunChar HaltRun: pop Instr
pop Temp
NoRun: ret
;Run char of string, Z pointer to last char of string
;coordine in Position, line address in Instr, total char in Temp RUN_STRING:
lpm ;Load char to Data
mov Data,r0 rcall RUN_TO_POS
sbiw ZL,1 ;Next char in string
dec Position ;Next position show
dec Temp ;Remain char count
brne RUN_STRING ret
;Clear char of display string to end of line, char in Data ;end of line in Position, address of char to clear in Instr CLEAR_TO_POS:
cpi Data,$20 breq NoClear push Instr push Temp
CLRChar: push Data ;Clear char
ldi Data,$20 rcall LCD_INSTR rcall LCD_BUSY rcall LCD_DATA pop Data
cp Instr,Position ;End of line?
breq HaltCLR
inc Instr ;Next position show
rcall LCD_BUSY rcall LCD_INSTR rcall LCD_BUSY
rcall LCD_DATA ;Reshow char at new position
ldi TimeOut,10 ;Wait 250ms
rcall TIMEWAIT rjmp CLRChar
HaltCLR: pop Temp
pop Instr NoClear: ret
;Clear display string, Z pointer to last char of string, End of line ;in Position, address of char to clear in Instr, Totla char in Temp CLEAR_STRING:
lpm ;Load char to Data
mov Data,r0
rcall CLEAR_TO_POS
sbiw ZL,1 ;Next char to clear
dec Instr ;Next address of char to clear
dec Temp ;Remain char count
brne CLEAR_STRING
ret
;Display notify PrefaceA SHOW_PREFACEA:
Get_Addr_Char $92,$80,18,PrefA1
rcall RUN_STRING ;Display on line 1
Get_Addr_Char $CD,$C0,9,PrefA2
rcall RUN_STRING ;Display on line 2
Get_Addr_Char $A5,$94,16,PrefA3
rcall RUN_STRING ;Display on line 3
Get_Addr_Char $E7,$D4,19,PrefA4
rcall RUN_STRING ;Display on line 4
ret
;Display notify PrefaceB SHOW_PREFACEB:
Get_Addr_Char $93,$92,18,PrefA1
rcall CLEAR_STRING ;Clear string on line 1
Get_Addr_Char $93,$80,19,PrefB1
rcall RUN_STRING ;Display new string on line 1
Get_Addr_Char $D3,$CD,9,PrefA2 rcall CLEAR_STRING Get_Addr_Char $CE,$C0,11,PrefB2 rcall RUN_STRING Get_Addr_Char $A7,$A5,16,PrefA3 rcall CLEAR_STRING Get_Addr_Char $A7,$94,19,PrefB3 rcall RUN_STRING Get_Addr_Char $E7,$E7,19,PrefA4 rcall CLEAR_STRING Get_Addr_Char $E3,$D4,12,PrefB4 rcall RUN_STRING ret
;Display string, position in Instr, Z pointer ;to first char of string, total char in Temp SHOW_STRING: rcall LCD_INSTR ShowNext: lpm mov Data,r0 rcall LCD_BUSY rcall LCD_DATA adiw ZL,1 dec Temp brne ShowNext ret ;Show symbol RxTx SHOW_RxTx: cpi Position,9 breq TwoChar cpi Position,10 breq ThrChar ldi Temp,1 rjmp ShowSym TwoChar: ldi Temp,2
rcall SHOW_STRING pop Temp ldi Instr,$D4 mov ZL,XL mov ZH,XH push Temp rcall LCD_BUSY rcall SHOW_STRING pop Temp cpi Temp,3 brlo EndRxTx
ldi Data,$52 ;ASCII code of R
rcall LCD_BUSY rcall LCD_INSTR rcall LCD_BUSY rcall LCD_DATA EndRxTx: ret
;Show interface to LCD, total char in Temp DISPLAY_INTERFACE:
ldi Instr,$01 ;Clear screen
rcall LCD_INSTR
ldi TimeOut,49 ;Wait 4.1ms
rcall DELAY
ldi ZL,LOW(Tile<<1) ;String on line 1 ldi ZH,HIGH(Tile<<1)
adiw ZL,19
ldi YL,LOW(Info<<1) ;String on line 2 ldi YH,HIGH(Info<<1)
adiw YL,9
ldi XL,LOW(Symbol<<1) ;String on line 3,4 ldi XH,HIGH(Symbol<<1)
adiw XL,2 ldi Instr,$80
ldi Temp,1 ;Total char show on line 1
ldi Position,1 ;Total char show on line 2
ReShow: push Instr push ZL push ZH push Temp
rcall SHOW_STRING ;Show line 1
pop Temp
cpi Temp,11 ;Show line 2
brlo ShowOne ldi Instr,$C0 push Temp mov Temp,Position mov ZL,YL mov ZH,YH
rcall SHOW_STRING ;Show line 2
sbiw YL,1 ;Part of string shown on line 2
cpi Position,8 brlo ShowTwo mov ZL,XL mov ZH,XH
rcall SHOW_RxTx ;Show all screen
sbiw XL,1 ShowTwo: pop Temp
inc Position ShowOne: pop ZH
pop ZL pop Instr
sbiw ZL,1 ;Part of string will show
ldi TimeOut,4 ;Wait 100ms
rcall TIMEWAIT inc Temp cpi Temp,21 brlo ReShow ret
;Get ascii code of keypress GET_ASCII_CODE: cpi Temp,0 breq EndGetAscii add Position,Temp mov Data,Position EndGetAscii:ret
;Find ascii code of keypress, ;ascii code contain Data FIND_ASCII_CODE:
cp KeyPress,OldKey ;First time key press brne FirstPress
subi CtrlReg,-$10 ;increment total time keypress
cbr CtrlReg,$40 ;Get real time keypress
dec AddrShow ;reshow new char
dec LPtrTx ;restore new char
rjmp GetTimeKey FirstPress: mov OldKey,KeyPress
cbr CtrlReg,$F0 ;Reset time keypress
GetTimeKey:mov Temp,CtrlReg ;Get time keypress
swap Temp andi Temp,$0F
cpi KeyPress,5 ;Scan code < 5
brge Key5To9 cpi KeyPress,3 brge Key3Or4 cpi KeyPress,1 brne Key0Or2
Set_First_Ascii $31,$43 ;Ascii of 1 and D rcall GET_ASCII_CODE
rjmp EndFindAscii Key0Or2: cpi KeyPress,2
breq Key2 Set_First_Ascii $30,$40 rcall GET_ASCII_CODE rjmp EndFindAscii Key2: Set_First_Ascii $32,$46 rcall GET_ASCII_CODE rjmp EndFindAscii Key3Or4: cpi KeyPress,3
breq Key3
Set_First_Ascii $34,$4C rcall GET_ASCII_CODE rjmp EndFindAscii
Key5To9: cpi KeyPress,7 brge Key7To9 cpi KeyPress,6 brne Key5 Set_First_Ascii $36,$52 rcall GET_ASCII_CODE rjmp EndFindAscii Key5: Set_First_Ascii $35,$4F rcall GET_ASCII_CODE rjmp EndFindAscii Key7To9: cpi KeyPress,8
brne Key7Or9
Set_First_Ascii $38,$58 cpi Temp,3
brne SkipFour
cbr CtrlReg,$F0 ;Loopback times keypress
ldi Temp,0 ;to skip keypress four
SkipFour: rcall GET_ASCII_CODE rjmp EndFindAscii Key7Or9: cpi KeyPress,9
brne Key7 Set_First_Ascii $39,$19 cpi Temp,2 brne SkipThree cbr CtrlReg,$F0 ldi Temp,0
SkipThree: rcall GET_ASCII_CODE rjmp EndFindAscii Key7: Set_First_Ascii $37,$55
rcall GET_ASCII_CODE EndFindAscii:ret
;Display char in Tx buffer, use pointer Z
;total char to show in Temp, position show in Instr DISPLAY_CHAR_IN_TxBUFF: rcall LCD_INSTR NextShow: ld Data,Z+ rcall LCD_BUSY rcall LCD_DATA dec Temp brne NextShow ret
;Get pointer to first char show in Tx buff on LCD GET_POINTER:
push Temp
mov Temp,AddrShow
subi Temp,$97 ;Total current char display
mov Position,LPtrTx sub Position,HPtrTx cp Position,Temp breq NoGetPoint mov Position,LPtrTx sub Position,Temp
mov HPtrTx,Position ;Set pointer
pop Temp NoGetPoint:ret
;Display char in TxBuff to LCD ;Total char to show in Temp SHOW_CHAR_IN_TxBuff:
rcall GET_POINTER cpi AddrShow,$A7 brne NoReShow
cpi Temp,15 ;Number char Need to show?
brne Show16Char
inc HPtrTx ;Show 15 last char
Show16Char:ldi Instr,$98 ;Show 16 last char
clr ZL
mov ZL,HPtrTx ;Get pointer to char
push Data
rcall DISPLAY_CHAR_IN_TxBUFF pop Data
NoReShow:ret
;Show char corresponding keypress, and store char ;into TxBuff to send to PC
DISPLAY_KEY:
rcall FIND_ASCII_CODE
inc LPtrTx ;Increment pointer buffer
ldi Temp,EndTxBuff+1
cp LPtrTx,Temp ;Over TxBuff
breq OverBuff ldi Temp,15
rcall SHOW_CHAR_IN_TxBuff ;Reshow 15 lastchar in buff Get_Position AddrShow,$A7
rcall LCD_INSTR ;Show char to LCD
rcall LCD_BUSY rcall LCD_DATA mov XL,LPtrTx
st X,Data ;Store char
rjmp EndDisplay
OverBuff: Get_Addr_String $98,ZL,ZH,OverTx,16 rcall SHOW_STRING
dec LPtrTx ;Get back LPtrTx
EndDisplay:ret
;Show symbol select on Tx or Rx SHOW_SELECT_TxRx: ldi Temp,1 sbrs CtrlReg,SelectTxRx rjmp SelectTx ldi Instr,$97 rcall CLEAR_LINE ldi Instr,$D7 rjmp ShowSymbol SelectTx: ldi Instr,$D7
rcall CLEAR_LINE ldi Instr,$97 ShowSymbol:rcall LCD_BUSY
rcall LCD_INSTR
;Perform function select display on Tx or Rx SELECT_TxRx: sbrs CtrlReg,SelectTxRx rjmp EnableRx cbr CtrlReg,EnSelectTxRx ;Select Tx rjmp ShowSelect
EnableRx: sbr CtrlReg,EnSelectTxRx ;Select Rx ShowSelect:rcall SHOW_SELECT_TxRx
ret
;Clear char at Addrshow CLEAR_CHAR_IN_LCD: ldi Temp,16 rcall SHOW_CHAR_IN_TxBuff mov Instr,AddrShow rcall LCD_INSTR ldi Data,$20 rcall LCD_BUSY rcall LCD_DATA dec AddrShow cpi AddrShow,$97 brne EndClear ldi Temp,LOW(TxBuff) cp HPtrTx,Temp breq EndClear
inc AddrShow ;Yet char
mov Instr,AddrShow rcall LCD_BUSY rcall LCD_INSTR dec HPtrTx mov XL,HPtrTx
ld Data,X ;Get next char to show
rcall LCD_BUSY rcall LCD_DATA EndClear:ret
;Perform function backspace BACK_SPACE:
sbrc CtrlReg,SelectTxRx ;Selecting Rx rjmp NoPerform
cpi AddrShow,$97
breq NoPerform ;No char
dec LPtrTx
rcall CLEAR_CHAR_IN_LCD NoPerform:ret
;Clear char in line, address start in Instr ;Total char to clear in Temp
CLEAR_LINE:
rcall LCD_INSTR ldi Data,$20 NextClear: rcall LCD_BUSY
rcall LCD_DATA dec Temp brne NextClear ret
;Perform function clear TxRx CLEAR_Tx_OR_Rx:
sbrc CtrlReg,SelectTxRx rjmp SelectRx