Nhận xét và đánh giá

Một phần của tài liệu thiết kế hệ thống phần mềm cho C AT90S8535 (Trang 123 - 146)

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

Một phần của tài liệu thiết kế hệ thống phần mềm cho C AT90S8535 (Trang 123 - 146)

Tải bản đầy đủ (DOC)

(146 trang)
w