Luận văn Điều khiển máy vẽ bằng vi xử lý

MỤC LỤC Trang PHẦN I : GIỚI THIỆU 1 1/LỜI GIỚI THIỆU 1 2/SƠ LƯỢC VỀ LUẬN VĂN 2 PHẦN II : CÁC THIẾT BỊ ĐỒ HỌA 3 1/MỘT SỐ THIẾT BỊ ĐỒ HỌA THÔNG DỤNG 3 2/GIỚI THIỆU BÀN VẼ TRONG LUẬN VĂN 6 PHẦN III : ĐỘC LẬP THIẾR BỊ 8 1/ĐỘC LẬP THIẾT BỊ 8 2/ỨNG DỤNG VÀO ĐỀ TÀI 10 PHẦN IV : GIỚI THIỆU TẬP TIN .DXF 11 1/GIỚI THIỆU 11 2/CẤU TRÚC FILE .DXF 11 PHẦN V : GIẢI THUẬT VẼ 19 1/GIẢI THUẬT SINH ĐƯỜNG THẲNG 19 2/GIẢI THUẬT SINH ĐƯỜNG TRÒN 21 3/GIẢI THUẬT SINH ĐƯỜNG SPLINE 25 PHẦN VI : GIỚI THIỆU VI XỬ LÝ 8951 28 1/GIỚI THIỆU AT89C51 28 2/TẬP LỆNH CỦA AT89C51 32 3/MỘT SỐ CHỨC NĂNG TRONG AT89C51 33 PHẦN VII : CỔNG COM VÀ CÁC CHUẨN GIAO TIẾP 39 1/GIAO TIẾP VỚI MÁY TÍNH 39 2/CÁC CHUẨN TRUYỀN THÔNG NỐI TIẾP 40 3/CHUẨN RS-232 41 PHẦN VIII :ĐỘNG CƠ BƯỚC 44 1/GIỚI THIỆU ĐỘNG CƠ BƯỚC 44 2/MỘT SỐ MẠCH ĐIỀU KHIỂN ĐỘNG CƠ BƯỚC 49 3/DÒNG GIỚI HẠN CỦA ĐỘNG CƠ BƯỚC 51 PHẦN IX : TỔNG KẾT 53 PHẦN X : PHỤ LỤC 54 PHẦN I GIỚI THIỆU 1/LỜI GIỚI THIỆU Trước đây, ở các máy cắt kim loại thông thường, việc điều khiển các chuyển động cũng như thay đổi vận tốc của các bộ phận, máy đều thực hiện bằng tay. Với cách điều khiển này thời gian phụ khá lớn, nên không thể tăng năng suất lao động cũng như đảm bảo độ chính xác của vật gia công. Do đó để giảm thời gian phụ, ta cần thiết tiến hành tự động hoá quá trình điều khiển. Và phương pháp gia công tự động ra đời với các dấu tì, cam trên trục phân phối v.v nhưng vẫn chưa đáp ứng được nhu cầu sản suất, vì nó rút ngắn được thời gian phụ nhưng thời gian chuẩn bị sản suất sẽ dài. Nhược điểm này không đáng kể nếu như sản suất được số lượng lớn, nhưng với sản suất nhỏ, mặt hàng phải thay đổi thường xuyên, loại máy này trở nên bất tiện và không kinh tế. Điều này hình thành nhu cầu tìm một phương pháp điều khiển mới, đảm bảo được thời gian hiệu chỉnh máy để gia công từ loại chi tiết này sang loại chi tiết khác nhanh hơn. Và phương pháp điều khiển theo chươnh trình ra đời để đáp ứng yêu cầu đó Điều khiển theo chương trình là một dạng điều khiển tự động mà tín hiệu điều khiển (tín hiệu ra) được thay đổi theo một qui luật đã được định trước. Nói cách khác, trên máy điều khiển theo chương trình, thứ tự giá trị của chuyển động, cũng như thứ tự của các bộ phận máy, đóng mở các hệ thống làm nguội, bôi trơn, thay dao đều được thực hiện đúng theo một trình tự đã được lập trình sẵn. Các cơ cấu mang chương trình này được đặt vào thiết bị điều khiển và máy sẽ làm việc tự động theo chương trình đã cho. Nếu các chương trình trên được ghi lại bằng các dấu tì, bằng hệ thống cam, bằng mẫu chép hình ta gọi hệ thống điều khiển đó là hệ thống điều khiển phi số. Nếu các chương trình được biểu thị bằng các chữ số dưới dạng mã hiệu, ta gọi đó là hệ thống điều khiển theo chương trình số. Như vậy điều khiển theo chương trình số là một quá trình tự động cho phép đưa một cơ cấu di động từ vị trí này đến vị trí khác bằng một lệnh. Sự dịch chuyển này có thể là lượng di động thẳng hay góc quay theo các bậc tự do. Trong nhiều trường hợp, phương pháp điều khiển theo chương trình số được thiết kế tự động hoá việc di động một cơ cấu từ vị trí này đến vị trí khác, ta gọi là “điều khiển theo điểm”. Nhưng ta cũng thực hiện dễ dàng khi rút ngắn vô hạn khoảng cách giữa hai điểm di động kế tiếp nhau và sẽ đạt được một quá trình điều khiển quĩ đạo gọi là “điều khiển theo đường”. Phương pháp điều khiển chương trình số có thể dùng để di động bất kì một cơ cấu nào được truyền động bằng cơ. Phạm vi sử dụng của nó rất rộng, nhưng chủ yếu là tự động hoá máy công cụ, vì lĩnh vực này bao gồm việc điều khiển dao cắt bằng các chữ số. Chương trình ghi bằng các chữ số được thực hiện ở ngoài máy, dưới dạng băng xuyên lỗ, băng từ, đĩa từ, film Các chương trình này có thể cất giữ vào kho, ngăn tủ. Khi cần sử dụng ta chỉ cần nạp nó vào máy, để máy có thể thực hiện chương trình và điều khiển các chuyển động tương đối giữa dao và phôi. Vì làm các chương trình số có thể tiến hành xa máy và máy có hệ thống đo lường riêng, nên hệ thống này có thể thay đổi dễ dàng và nhanh chóng. Dựa trên phương pháp điều khiển vị trí theo chương trình số đã nêu, đề tài của luận văn này là: ”Điều khiển máy vẽ bằng vi xử lý”. Máy vẽ được đề cập ở đây là một máy vẽ có khả năng vẽ liên tục các đường nét của một hình cho trước (của AutoCad). 2/ SƠ LƯỢC VỀ LUẬN VĂN * Luận văn có nhiệm vụ thiết kế một máy vẽ có khả năng đọc được các tập tin (file) .DXF của AutoCad , sau đó định dạng lại file.DXF này (có nghĩa là tạo ra một file.TXT chứa các thông tin về điểm, đường cần vẽ ). Việc định dạng được thực hiện trên máy tính (PC) , cuối cùng PC sẽ truyền lần lượt những thông tin trong file.TXT xuống vixử lý 8952 đề thực hiện thao tác vẽ. * Những công việc cần thực hiện: - Phần cứng : thiết kế mạch giao tiếp giữa PC và 8952 theo chuẩn RS-232. - Phần mềm: >Lập trình cho việc đọc và định dạng file.DXF trên PC (dùng DELPHI). >Lập trình cho vi xử lý 8952 thực hiện thao tác vẽ. 3/ỨNG DỤNG CỦA ĐỀ TÀI Với cách điều khiển cùng một lúc sự dịch chuyền theo 2 trục X,Y của bút vẽ để di chuyển nó đi theo một đường xác định , đề tài khẳng định được sự tối ưu và khả thi của việc điều khiển vị trí liên tục đối với các máy công cụ , và là nền tảng cho việc thiết kế máy khoan , máy cắt Để có thể ứng dụng vào trong sản suất , cụ thể là trong cắt may, đòi hỏi chúng ta phải có những mạch hồi tiếp về từ các cơ cấu chấp hành , những động cơ có công suất lớn hơn với độ tin cậy cao hơn.

doc186 trang | Chia sẻ: lvcdongnoi | Ngày: 05/06/2013 | Lượt xem: 1644 | Lượt tải: 1download
Bạn đang xem nội dung tài liệu Luận văn Điều khiển máy vẽ bằng vi xử lý, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
ln(f,str); Drawing.Edit7.Text:=Str; p1.x:=round(StrToFloat(Drawing.Edit3.Text)); p1.y:=round(StrToFloat(Drawing.Edit4.Text)); p2.x:=round(StrToFloat(Drawing.Edit6.Text)); p2.y:=round(StrToFloat(Drawing.Edit7.Text)); Transfer_Flag:=false; {Drawing.Send.Enabled:=false;} Drawing.Send_Command; Drawing.image1.canvas.pen.color:=clred; Drawing.DrawLine(p1,p2); if drawing.SingleStep1.Checked then begin AutoRun_Flag:=False; Drawing.Update.Enabled:=True; end; End Else if Str='G2' then Begin Drawing.Edit2.Text:='2'; Readln(f,str); Drawing.Edit3.Text:=Str; Readln(f,str); Drawing.Edit4.Text:=Str; Readln(f,str); Drawing.Edit5.Text:=Str; Readln(f,str); Drawing.Edit6.Text:=Str; Readln(f,str); Drawing.Edit7.Text:=Str; p2.x:=round(StrToFloat(Drawing.Edit6.Text)); p2.y:=round(StrToFloat(Drawing.Edit7.Text)); r:=Round(StrToFloat(Drawing.Edit5.Text)); pc.x:=Round(StrToFloat(Drawing.Edit3.Text)); pc.y:=Round(StrToFloat(Drawing.Edit4.Text)); p2.x:=p2.x-pc.x; p2.y:=p2.y-pc.y; if (p2.x>0)and(p2.y>=0) then m:=1 else if (p2.x0) then m:=2 else if (p2.x<0)and(p2.y<=0) then m:=3 else if (p2.x>=0)and(p2.y<0) then m:=4; Transfer_Flag:=false; {Drawing.Send.Enabled:=false;} Drawing.image1.canvas.pen.color:=clred; Drawing.Send_Command; Drawing.Arc_QN(pc.x,pc.y,r,p2.x,p2.y,m); if drawing.SingleStep1.Checked then begin AutoRun_Flag:=False; Drawing.Update.Enabled:=True; end; End Else If Str='G3' then Begin Drawing.Edit2.Text:='3'; Readln(f,str); Drawing.Edit3.Text:=Str; Readln(f,str); Drawing.Edit4.Text:=Str; Readln(f,str); Drawing.Edit5.Text:=Str; Readln(f,str); Drawing.Edit6.Text:=Str; Readln(f,str); Drawing.Edit7.Text:=Str; p2.x:=round(StrToFloat(Drawing.Edit6.Text)); p2.y:=round(StrToFloat(Drawing.Edit7.Text)); r:=Round(StrToFloat(Drawing.Edit5.Text)); pc.x:=Round(StrToFloat(Drawing.Edit3.Text)); pc.y:=Round(StrToFloat(Drawing.Edit4.Text)); p2.x:=p2.x-pc.x; p2.y:=p2.y-pc.y; if (p2.x>=0)and(p2.y>0) then m:=1 else if (p2.x=0) then m:=2 else if (p2.x<=0)and(p2.y<0) then m:=3 else if (p2.x>0)and(p2.y<=0) then m:=4; Transfer_Flag:=false; {Drawing.Send.Enabled:=false;} Drawing.image1.canvas.pen.color:=clred; Drawing.Send_Command; Drawing.Arc(pc.x,pc.y,r,p2.x,p2.y,m); if drawing.SingleStep1.Checked then begin AutoRun_Flag:=False; Drawing.Update.Enabled:=True; end; End Else if str='G6' then Begin Drawing.Edit2.Text:='6'; Readln(f,str); Drawing.Edit3.Text:=Str; Readln(f,str); Drawing.Edit4.Text:=Str; Readln(f,str); Drawing.Edit5.Text:=Str; Readln(f,str); Drawing.Edit6.Text:=Str; Readln(f,str); Drawing.Edit7.Text:=Str; Transfer_Flag:=false; Drawing.Send_Command; if drawing.SingleStep1.Checked then begin AutoRun_Flag:=False; Drawing.Update.Enabled:=True; end; End{G6} Else if str='End Spline' then Begin Drawing.Edit2.Text:='7'; Drawing.Edit3.Text:='0'; Drawing.Edit4.Text:='0'; Drawing.Edit5.Text:='0'; Drawing.Edit6.Text:='0'; Drawing.Edit7.Text:='0'; Transfer_Flag:=false; Drawing.Send_Command; Drawing.image1.canvas.pen.color:=clred; Drawing.Spline; if drawing.SingleStep1.Checked then begin AutoRun_Flag:=False; Drawing.Update.Enabled:=True; end; End; End; {while} CloseFile(f); ShowMessage('End of file!'); Drawing.Update.enabled:=True; Drawing.Send.Enabled:=false; Drawing.Command1.Enabled:=True; end; end. CHÖÔNG TRÌNH CHO VI XÖÛ LYÙ MAIN PROGRAM $Title(---MAIN PROGRAM---) $Debug $PageWidth(98) $NoPaging $Include (macros.inc) X1H equ 32H ;XCH X1L equ 33H ;XCL Y1H equ 34H ;YCH Y1L equ 35H ;YCL BKH equ 36H BKL equ 37H X2H equ 38H X2L equ 39H Y2H equ 3AH Y2L equ 3BH DeltaXH equ 3CH ;D1H DeltaXL equ 3DH ;D1L DeltaYH equ 3EH ;D2H DeltaYL equ 3FH ;D2L Dinc1H equ 40H Dinc1L equ 41H Dinc2H equ 42H Dinc2L equ 43H XH equ 44H XL equ 45H YH equ 46H YL equ 47H Cur_XH equ 48H Cur_XL equ 49H Cur_YH equ 4AH Cur_YL equ 4BH CH equ 4CH CL equ 4DH PointerX equ 4EH PointerY equ 4FH Key equ 50H ;Phím hieän ñang ñöôïc nhaán Key_Counter equ 51H ;Soá laàn phím ñöôïc nhaán Key_Pressed equ 52H ;Phím thöïc söï ñöôïc nhaán TimerCount equ 53H TimerCount1 equ 54H DataIn_Counter equ 55H Circle14 equ 56H Out_Led equ 57H DataOut_Counter equ 58H Speed equ 59H Press_Counter equ 5AH K equ 5BH TH equ 5CH TL equ 5DH Ext_Data equ 5EH LCD_Pointer equ 5FH NBaseAddr equ 7BH TMP_3 equ 7CH TMP_2 equ 7DH TMP_1 equ 7EH TMP_0 equ 7FH KeyOut equ 20H MotorX_Bit bit P1.1 MotorY_Bit bit P1.2 B1 bit 10H C1 bit 11H D1 bit 12H KeyPressed bit 13H Timer_F1 bit 14H ;Côø baùo ñaõ chaïy ñöôïc 16 laàn TimeBase Timer_F2 bit 15H Draw_Flag bit 16H Transmit_Flag bit 17H Motor_Flag bit 18H Line_Draw bit 19H Circle_Rev_Draw bit 1AH Circle_For_Draw bit 1BH Spline_Draw bit 1CH GR_Flag bit 1DH EQ_Flag bit 1EH LE_Flag bit 1FH Data_Out bit 20H X_Del bit 21H Y_Del bit 22H LCD_Busy bit 23H Run bit 24H LCD_Display_Flag bit 25H F1 bit KeyOut.0 ;Nuùt thöù 1 F2 bit KeyOut.1 ;Nuùt thöù 2 F3 bit KeyOut.2 ;Nuùt thöù 3 F4 bit KeyOut.3 ;Nuùt thöù 4 KeyIn bit P1.7 Start bit P2.4 Press bit P2.5 Led_EN bit P1.3 Start_X bit P3.4 End_X bit P3.5 Start_Y bit P3.2 End_Y bit P3.3 Pen_Lift bit P3.6 RS bit P1.4 RW bit P1.5 E bit P1.6 MotorStep equ 4 Step_Unit equ 1 KeyCount equ 5 ;Soá laàn queùt ñeå xaùc ñònh moät phím ñöôïc nhaán thöïc söï TimeBase equ -250 ;Thôøi gian neàn TimeCount equ 16 ;Soá laàn laëp TimeBase V equ 150 ;Van toc dong co KeyNumber equ 4 ;Soá phím nhaán DataInByte equ 12 DataBaseAddr equ 30H PC_Addr equ 1 DataOutByte equ 4 PressCount equ 100 NumKnots equ 80H NumPoints equ 81H KnotBaseAddr equ 82H ORG 0000H LJMP Main ORG 000BH LJMP ISR_Timer0 Main: ;Khoi dong Serial Port va Timer ISR : CALL Serial_Port_Timer_Init ;Gan cac bit : CALL Bit_Init ;Nap cac gia tri hang so : CALL Variable_Init CALL Pen_Up CALL LCD_Init ;Chuong trinh : Operation: JNB Timer_F1,Next_Operation CLR Timer_F1 JB Press,Pen_Not_Press DJNZ Press_Counter,Pen_Not_Press MOV Press_Counter,#PressCount SETB Press Pen_Not_Press: CALL Limit_Control CALL Out_Led_Control CALL Transfer JB Start,Auto_Control Manual_Control: CALL Delete_Direction_LED CALL KeyDecoder CALL Manual JMP End_Operation End_Manual_Control: Auto_Control: SETB Run CALL Turn_On_AUTO_LED CALL Draw_Identify CALL Position_Output Next_Operation: JNB Timer_F2,End_Operation CLR Timer_F2 JNB Start,Stop_System_Label ;CALL Delete_Pulse CALL Motor_Control_Drawing JMP End_Operation Stop_System_Label: CALL Stop_System End_Auto_Control: End_Operation: JMP Operation ISR_Timer0: DJNZ TimerCount,Next_ISR_Timer0 SETB Timer_F1 MOV TimerCount,#TimeCount Next_ISR_Timer0: DJNZ TimerCount1,End_ISR_Timer0 SETB Timer_F2 MOV TimerCount1,Speed End_ISR_Timer0: RETI $Include ( Maths.inc ) $Include ( Dkdc.inc ) $Include ( Draw.inc ) $Include ( Key.inc ) $Include ( Transfer.inc ) $Include ( Manual.inc ) $Include ( Auto.inc ) $Include ( Routine.inc ) ;**** Table **** Motor_Control_Table: ;DB 00H,15H,05H,0DH,09H,0BH,0AH,1AH,12H,16H,14H DB 00H,0FEH,0FDH,0FBH,0F7H END MATH.INC: ;=========================================== ;Control_Point[k] ;Input : R5 ;Output : R7,R6 ;Destroy : R5,R6,R7 ;=========================================== Control_Point_X_Sub: PUSH 00H MOV R0,#NumKnots MOV A,@R0 RL A ADD A,#KnotBaseAddr MOV B,A MOV A,R5 RL A RL A ADD A,B MOV R0,A MOV A,@R0 MOV R7,A INC R0 MOV A,@R0 MOV R6,A POP 00H End_Control_Point_X_Sub: RET Control_Point_Y_Sub: PUSH 00H MOV R0,#NumKnots MOV A,@R0 RL A ADD A,#KnotBaseAddr MOV B,A MOV A,R5 RL A RL A ADD A,B MOV R0,A INC R0 INC R0 MOV A,@R0 MOV R7,A INC R0 MOV A,@R0 MOV R6,A POP 00H End_Control_Point_Y_Sub: RET ;=========================================== ;N(k,m,t) ;Input : X1H,X1L,Y1H,Y1L - BKH,BKL ;Output : TMP_3,TMP_2,TMP_1,TMP_0 - R7,R6 ;Destroy : A,B,R7,R6,R5,R4,R3 ;=========================================== N_Sub: PUSH 0 %Get_Value#(5) CJNE A,#1,m_khac_1 %Get_Value#(4) ;m baèng 1 %Knot (A,TMP_1,TMP_0) ;tính knot[k] %Get_Value#(6) ;laáy giaù tri t MOV B,A %Get_Value#(7) %CMP (B,A,TMP_1,TMP_0) ;so saùnh t vôùi knot[k] JC N_bang_0 %Get_Value#(4) INC A %Knot (A,TMP_1,TMP_0) ;tính knot[k+1] %INC16 (TMP_1,TMP_0,TMP_1,TMP_0) %Get_Value#(6) ;laáy giaù trò t MOV B,A %Get_Value#(7) %CMP (B,A,TMP_1,TMP_0) ;so saùnh t vôùi knot[k+1] JNC N_bang_0 MOV R0,NBaseAddr MOV @R0,#7FH INC R0 MOV @R0,#0FFH JMP End_N_Sub N_bang_0: MOV R0,NBaseAddr MOV @R0,#0 INC R0 MOV @R0,#0 JMP End_N_Sub m_khac_1: %Get_Value#(4) ;A=k %Knot (A,TMP_1,TMP_0) ;Knot[k] %Get_Value#(4) ;A=k MOV B,A ;B=k %Get_Value#(5) ;A chöùa m ADD A,B DEC A %Knot (A,TMP_3,TMP_2) ;Knot[k+m-1] %SUB16 (TMP_3,TMP_2,TMP_1,TMP_0,TMP_1,TMP_0) %Set_Value#(8,TMP_1) ;gaùn giaù trò %Set_Value#(9,TMP_0) ;denom %CMPZ (TMP_1,TMP_0) JNB EQ_Flag,Denom_khac_0 MOV A,NBaseAddr ADD A,#2 MOV R0,A MOV @R0,#0 INC R0 MOV @R0,#0 JMP N_Sub_Next Denom_khac_0: %Get_Value#(4) MOV TMP_3,A ;TMP_3=k %Get_Value#(5) DEC A MOV TMP_2,A ;TMP_2=m-1 %Get_Value#(6) MOV TMP_1,A ;TMP_1= byte cao t %Get_Value#(7) MOV TMP_0,A ;TMP_1= byte thaáp t MOV A,NBaseAddr ;Chuyeån ADD A,#10 ;con troû MOV NBaseAddr,A ;ñòa chæ %Set_Value#(4,TMP_3) ;k = k %Set_Value#(5,TMP_2) ;m = m-1 %Set_Value#(6,TMP_1) ;t=t %Set_Value#(7,TMP_0) ;t=t CALL N_sub %Get_Value#(6) ;laáy MOV X1H,A ;giaù %Get_Value#(7) ;trò MOV X1L,A ;t %Get_Value#(4) ;tính %Knot (A,Y1H,Y1L) ;knot[k] %SUB16 (X1H,X1L,Y1H,Y1L,X1H,X1L) ;t-knot[k] %Get_Value#(0) ;laáy MOV Y1H,A ;giaù %Get_Value#(1) ;trò MOV Y1L,A ;N %MUL16 (X1H,X1L,Y1H,Y1L) ;(t-knot[k])*N %Get_Value#(8) ;laáy MOV Y2H,A ;giaù %Get_Value#(9) ;trò MOV Y2L,A ;denom %DIV32 (TMP_3,TMP_2,TMP_1,TMP_0,Y2H,Y2L) ;(t-knot[k])*N/denom %Set_Value#(2,TMP_1) %Set_Value#(3,TMP_0) N_Sub_Next: %Get_Value#(4) ;A=k INC A ;A=k+1 %Knot (A,TMP_1,TMP_0) ;tính knot[k+1] %Get_Value#(4) ;A=k MOV B,A ;B=k %Get_Value#(5) ;A=m ADD A,B ;A=k+m %Knot (A,TMP_3,TMP_2) ;tính knot[k+m] %SUB16 (TMP_3,TMP_2,TMP_1,TMP_0,TMP_1,TMP_0) ;knot[k+m] - knot[k+1] %Set_Value#(8,TMP_1) ;gaùn giaù trò %Set_Value#(9,TMP_0) ;denom %CMPZ (TMP_1,TMP_0) JNB EQ_Flag,Denom_khac_0_L1 %Get_Value#(8) ;laáy MOV TMP_1,A ;giaù %Get_Value#(9) ;trò MOV TMP_0,A ;sum %Set_Value#(0,TMP_1) ;N=sum %Set_Value#(1,TMP_0) ;N=sum JMP End_N_Sub Denom_khac_0_L1: %Get_Value#(4) INC A MOV TMP_3,A ;TMP_3=k+1 %Get_Value#(5) DEC A MOV TMP_2,A ;TMP_2=m-1 %Get_Value#(6) MOV TMP_1,A ;TMP_1= byte cao t %Get_Value#(7) MOV TMP_0,A ;TMP_1= byte thaáp t MOV A,NBaseAddr ;Chuyeån ADD A,#10 ;con troû MOV NBaseAddr,A ;ñòa chæ %Set_Value#(4,TMP_3) ;k = k+1 %Set_Value#(5,TMP_2) ;m = m-1 %Set_Value#(6,TMP_1) ;t=t %Set_Value#(7,TMP_0) ;t=t CALL N_sub %Get_Value#(4) ;A=k MOV B,A ;B=k %Get_Value#(5) ;A=m ADD A,B ;A=k+m %Knot (A,X1H,X1L) ;tính knot[k+m] %Get_Value#(6) ;laáy MOV Y1H,A ;giaù %Get_Value#(7) ;trò MOV Y1L,A ;t %SUB16 (X1H,X1L,Y1H,Y1L,X1H,X1L) ;knot[k+m] - t %Get_Value#(0) ;laáy MOV Y1H,A ;giaù %Get_Value#(1) ;trò MOV Y1L,A ;N %MUL16 (X1H,X1L,Y1H,Y1L) ;(knot[k+m]-t)*N %Get_Value#(8) ;laáy MOV Y2H,A ;giaù %Get_Value#(9) ;trò MOV Y2L,A ;denom %DIV32 (TMP_3,TMP_2,TMP_1,TMP_0,Y2H,Y2L) ;(knot[k+m]-t)*N/denom %Get_Value#(2) ;laáy MOV TMP_3,A ;giaù %Get_Value#(3) ;trò MOV TMP_2,A ;sum %ADD16 (TMP_3,TMP_2,TMP_1,TMP_0,TMP_1,TMP_0) ;sum+(knot[k+m]-t)*N/denom %Set_Value#(0,TMP_1) ;N=sum %Set_Value#(1,TMP_0) ;N=sum End_N_Sub: %Get_Value#(5) CJNE A,#4,m_khac_4 JMP N_Sub_Return m_khac_4: %Get_Value#(0) ;laáy MOV TMP_1,A ;giaù trò N %Get_Value#(1) ;ñöa leân MOV TMP_0,A ;taàng tröôùc CLR C MOV A,NBaseAddr ;Chuyeån SUBB A,#10 ;con troû MOV NBaseAddr,A ;ñòa chæ %Set_Value#(0,TMP_1) ;N = N %Set_Value#(1,TMP_0) ;N = N N_Sub_Return: POP 0 RET ;=========================================== ;Laáy giaù trò oâ nhôù leäch khoûi NBaseAddr moät ñoaïn k ;Input : R7 ;Output : A ;=========================================== Get_Value_Sub: PUSH 0 MOV A,NBaseAddr ADD A,R7 MOV R0,A MOV A,@R0 POP 0 End_Get_Value_Sub: RET ;=========================================== ;Gaùn giaù trò cho oâ nhôù thöù k ;Input : R7(k),R6(giaù trò) ;=========================================== Set_Value_Sub: PUSH 0 MOV A,NBaseAddr ADD A,R7 MOV R0,A MOV A,R6 MOV @R0,A POP 0 End_Set_Value_Sub: RET ;=========================================== ;Div 32 bit ;Input : X1H,X1L,Y1H,Y1L - BKH,BKL ;Output : TMP_3,TMP_2,TMP_1,TMP_0 - R7,R6 ;Destroy : A,B,R7,R6,R5,R4,R3 ;=========================================== DIV32_Sub: PUSH X1H MOV R7,#0 MOV R6,#0 ;zero out partial remainder MOV TMP_0,#0 MOV TMP_1,#0 MOV TMP_2,#0 MOV TMP_3,#0 MOV R4,BKH ;load divisor MOV R3,BKL MOV R5,#32 ;loop count ;This begins the loop Div_loop: CALL Shift_D ;shift the dividend and return MSB in C MOV A,R6 ;shift carry into LSB of partial remainder RLC A MOV R6,A MOV A,R7 RLC A MOV R7,A ;now test to see if R7:R6 >= R4:R3 CLR C MOV A,R7 ;subtract R4 from R7 to see if R4 < R7 SUBB A,R4 ; A = R7 - R4, carry set if R7 < R4 JC Cant_sub ;at this point R7>R4 or R7=R4 JNZ Can_sub ;jump if R7>R4 ;if R7 = R4, test for R6>=R3 CLR C MOV A,R6 SUBB A,R3 ; A = R6 - R3, carry set if R6 < R3 JC Cant_sub Can_sub: ;subtract the divisor from the partial remainder CLR C MOV A,R6 SUBB A,R3 ; A = R6 - R3 MOV R6,A MOV A,R7 SUBB A,R4 ; A = R7 - R4 - Borrow MOV R7,A SETB C ; shift a 1 into the quotient JMP Quot Cant_sub: ;shift a 0 into the quotient CLR C Quot: ;shift the carry bit into the quotient CALL Shift_Q ; Test for competion DJNZ R5,Div_loop POP X1H MOV A,X1H JNB ACC.7,End_DIV32_Sub MOV Y1H,#0FFH MOV Y1L,#0FDH %ADD16 (TMP_1,TMP_0,Y1H,Y1L,TMP_1,TMP_0) End_DIV32_Sub: RET ;=========================================== ;Shift_D ;=========================================== Shift_D: ;shift the dividend one bit to the left and return the MSB in C CLR C MOV A,Y1L RLC A MOV Y1L,A MOV A,Y1H RLC A MOV Y1H,A MOV A,X1L RLC A MOV X1L,A MOV A,X1H RLC A MOV X1H,A End_Shift_D: RET ;=========================================== ;Shift_Q ;=========================================== Shift_Q: ;shift the quotent one bit to the left and shift the C into LSB MOV A,TMP_0 RLC A MOV TMP_0,A MOV A,TMP_1 RLC A MOV TMP_1,A MOV A,TMP_2 RLC A MOV TMP_2,A MOV A,TMP_3 RLC A MOV TMP_3,A End_Shift_Q: RET ;=========================================== ;Mul 32 bit ;Input : R7,R6,R5,R4 - R3,R2 ;Output : TMP_3,TMP_2,TMP_1,TMP_0 ;Destroy : A,B,R7,R6,R5,R4,R3,R2 ;=========================================== MUL32_Sub: MOV TMP_3,#0 ;clear out upper 16 bits MOV TMP_2,#0 ;Generate the lowest byte of the result MOV B,R4 MOV A,R2 MUL AB MOV TMP_0,A ;low-order result MOV TMP_1,B ;high_order result ;Now generate the next higher order byte MOV B,R5 MOV A,R2 MUL AB ADD A,TMP_1 ;low-order result MOV TMP_1,A ; save MOV A,B ; get high-order result ADDC A,TMP_2 ; include carry from previous operation MOV TMP_2,A ; save JNC Mul32_loop1 INC TMP_3 ; propagate carry into TMP_3 Mul32_loop1: MOV B,R4 MOV A,R3 MUL AB ADD A,TMP_1 ;low-order result MOV TMP_1,A ; save MOV A,B ; get high-order result ADDC A,TMP_2 ; include carry from previous operation MOV TMP_2,A ; save JNC Mul32_loop2 INC TMP_3 ; propagate carry into TMP_3 Mul32_loop2: ; Now start working on the 3rd byte MOV B,R6 MOV A,R2 MUL AB ADD A,TMP_2 ;low-order result MOV TMP_2,A ; save MOV A,B ; get high-order result ADDC A,TMP_3 ; include carry from previous operation MOV TMP_3,A ; save ; Now the other half MOV B,R5 MOV A,R3 MUL AB ADD A,TMP_2 ;low-order result MOV TMP_2,A ; save MOV A,B ; get high-order result ADDC A,TMP_3 ; include carry from previous operation MOV TMP_3,A ; save ; Now finish off the highest order byte MOV B,R7 MOV A,R2 MUL AB ADD A,TMP_3 ;low-order result MOV TMP_3,A ; save ; Forget about the high-order result, this is only 32 bit math! MOV B,R6 MOV A,R3 MUL AB ADD A,TMP_3 ;low-order result MOV TMP_3,A ; save End_Mul32_Sub: RET ;=========================================== ;Mul 16 bit ;Input : R7,R6 - R5,R4 ;Output : TMP_3,TMP_2,TMP_1,TMP_0 ;Destroy : A,B,R7,R6,R5,R4 ;=========================================== MUL16_Sub: MOV TMP_3,#0 MOV TMP_2,#0 MOV B,R6 MOV A,R4 MUL AB MOV TMP_0,A MOV TMP_1,B MOV B,R7 MOV A,R4 MUL AB ADD A,TMP_1 MOV TMP_1,A MOV A,B ADDC A,TMP_2 MOV TMP_2,A JNC Mul16_loop1 INC TMP_3 Mul16_Loop1: MOV B,R6 MOV A,R5 MUL AB ADD A,TMP_1 MOV TMP_1,A MOV A,B ADDC A,TMP_2 MOV TMP_2,A JNC Mul16_loop2 INC TMP_3 Mul16_loop2: MOV B,R7 MOV A,R5 MUL AB ADD A,TMP_2 MOV TMP_2,A MOV A,B ADDC A,TMP_3 MOV TMP_3,A End_MUL16_Sub: RET ;=========================================== ;Knot[k] ;Input : R5 ;Output : R7,R6 ;Destroy : R5,R6,R7 ;=========================================== Knot_K_Sub: PUSH 00H MOV A,R5 RL A ADD A,#KnotBaseAddr MOV R0,A MOV A,@R0 MOV R7,A INC R0 MOV A,@R0 MOV R6,A POP 00H End_Knot_K_Sub: RET ;=========================================== ;Compare with Zero ;Input : R7,R6 ;Output : GR_Flag,EQ_Flag,LE_Flag ;Destroy : R7,R6 ;=========================================== CMPZ_Sub: CLR GR_Flag CLR EQ_Flag CLR LE_Flag MOV A,R7 JNB ACC.7,Value_GEZ SETB LE_Flag JMP End_CMPZ_Sub Value_GEZ: JNZ Value_GZ MOV A,R6 JNZ Value_GZ SETB EQ_Flag JMP End_CMPZ_Sub Value_GZ: SETB GR_Flag End_CMPZ_Sub: RET ;=========================================== ;Compare_sub ;Input : R5,R4 - R3,R2 ;Output : C ;Destroy : R7,R6,R5,R4,R3,R2,C ;=========================================== CMP_sub: CALL SUB16_Sub MOV A,R7 JNB ACC.7,Clear_Carry SETB C JMP End_CMP_Sub Clear_Carry: CLR C End_CMP_Sub: RET ;=========================================== ;ABS_sub ;Input : R7_R6 ;Ouput : R7_R6 ;Destroy : R7,R6,C ;=========================================== ABS_Sub: MOV A,R7 JNB ACC.7,End_ABS_Sub MOV A,R6 CPL A ADD A,#1 MOV R6,A MOV A,R7 CPL A ADDC A,#0 MOV R7,A End_ABS_Sub: RET ;=========================================== ;SUB16_sub ;Input : R5,R4 - R3,R2 ;Output : R7,R6,C ;Destroy : R7,R6,R5,R4,R3,R2,C ;=========================================== SUB16_sub: MOV A,R4 CLR C SUBB A,R2 MOV R6,A MOV A,R5 SUBB A,R3 MOV R7,A End_SUB16_Sub: RET ;=========================================== ;ADD16_sub ;Input : R5,R4 + R3,R2 ;Output : R7,R6 ;Destroy: R7,R6,R5,R4,R3,R2,C ;=========================================== ADD16_sub: MOV A,R4 ADD A,R2 MOV R6,A MOV A,R5 ADDC A,R3 MOV R7,A End_ADD16_Sub: RET ;=========================================== ;INC16_sub ;Input : R7,R6 ;Output : R7,R6 ;Destroy: R7,R6,C ;=========================================== INC16_Sub: MOV A,R6 ADD A,#1 MOV R6,A MOV A,R7 ADDC A,#0 MOV R7,A End_INC16_Sub: RET ;=========================================== ;DEC16_sub ;Input : R7,R6 ;Output : R7,R6 ;Destroy: R7,R6,C ;=========================================== DEC16_Sub: CLR C MOV A,R6 SUBB A,#1 MOV R6,A MOV A,R7 SUBB A,#0 MOV R7,A End_DEC16_Sub: RET ;=========================================== ;SHR_sub ;Input : R7,R6 ;Output : R7,R6 ;Destroy: R7,R6,C ;=========================================== SHR_sub: CLR C MOV A,R7 JNB ACC.7,Pos_SHR SETB C Pos_SHR: RRC A MOV R7,A MOV A,R6 RRC A MOV R6,A End_SHR_Sub: RET ;=========================================== ;SHL_sub ;Input : R7,R6 ;Output : R7,R6 ;Destroy : R7,R6,C ;=========================================== SHL_sub: CLR C MOV A,R6 RLC A MOV R6,A MOV A,R7 RLC A MOV R7,A End_SHL_Sub: RET ;=========================================== ;Sign_sub ;Input : R7_R6 ;Ouput : R7_R6 ;Destroy : R7,R6,C ;=========================================== Sign_Sub: MOV A,R6 CPL A ADD A,#1 MOV R6,A MOV A,R7 CPL A ADDC A,#0 MOV R7,A End_Sign_Sub: RET ÑKÑC.INC: ;================================================ ;Go Left ;================================================ Left_Control: JNB Start,Not_Dec16_Left %DEC16(Cur_XH,Cur_XL,Cur_XH,Cur_XL) Not_Dec16_Left: MOV R7,#Step_Unit MOV DPTR,#Motor_Control_Table MOV A,Out_Led ANL A,#11110000B ORL A,#00000001B MOV Out_Led,A PUSH P0 MOV P0,A SETB Led_EN NOP CLR Led_EN POP P0 Loop_Left: MOV A,PointerX MOVC A,@A+DPTR PUSH P0 MOV P0,A SETB MotorX_Bit NOP CLR MotorX_Bit POP P0 DJNZ PointerX,Next_Left MOV PointerX,#MotorStep Next_Left: DJNZ R7,Loop_Left SETB X_Del End_Left_Control: RET ;================================================ ;Go Right ;================================================ Right_Control: JNB Start,Not_Inc16_Right %INC16(Cur_XH,Cur_XL,Cur_XH,Cur_XL) Not_Inc16_Right: MOV R7,#Step_Unit MOV DPTR,#Motor_Control_Table MOV A,Out_Led ANL A,#11110000B ORL A,#00001000B MOV Out_Led,A PUSH P0 MOV P0,A SETB Led_EN NOP CLR Led_EN POP P0 Loop_Right: MOV A,PointerX MOVC A,@A+DPTR PUSH P0 MOV P0,A SETB MotorX_Bit NOP CLR MotorX_Bit POP P0 INC PointerX MOV A,PointerX CJNE A,#MotorStep+1,Next_Right MOV PointerX,#1 Next_Right: DJNZ R7,Loop_Right SETB X_Del End_Right_Control: RET ;================================================ ;Go Up ;================================================ Up_Control: JNB Start,Not_Inc16_Up %INC16(Cur_YH,Cur_YL,Cur_YH,Cur_YL) Not_Inc16_Up: MOV R7,#Step_Unit MOV DPTR,#Motor_Control_Table MOV A,Out_Led ANL A,#11110000B ORL A,#00000010B MOV Out_Led,A PUSH P0 MOV P0,A SETB Led_EN NOP CLR Led_EN POP P0 Loop_Up: ;JNB Timer_F2,$ ;CLR Timer_F2 MOV A,PointerY MOVC A,@A+DPTR PUSH P0 MOV P0,A SETB MotorY_Bit NOP CLR MotorY_Bit POP P0 DJNZ PointerY,Next_Up MOV PointerY,#MotorStep Next_Up: DJNZ R7,Loop_Up SETB Y_Del End_Up_Control: RET ;================================================ ;Go Down ;================================================ Down_Control: JNB Start,Not_Dec16_Down %DEC16(Cur_YH,Cur_YL,Cur_YH,Cur_YL) Not_Dec16_Down: MOV R7,#Step_Unit MOV DPTR,#Motor_Control_Table MOV A,Out_Led ANL A,#11110000B ORL A,#00000100B MOV Out_Led,A PUSH P0 MOV P0,A SETB Led_EN NOP CLR Led_EN POP P0 Loop_Down: ;JNB Timer_F2,$ ;CLR Timer_F2 MOV A,PointerY MOVC A,@A+DPTR PUSH P0 MOV P0,A SETB MotorY_Bit NOP CLR MotorY_Bit POP P0 INC PointerY MOV A,PointerY CJNE A,#MotorStep+1,Next_Down MOV PointerY,#1 Next_Down: DJNZ R7,Loop_Down SETB Y_Del End_Down_Control: RET ;================================================ ;Go Up_Left ;================================================ Up_Left_Control: JNB Start,Not_DI16_Up_Left %DEC16(Cur_XH,Cur_XL,Cur_XH,Cur_XL) %INC16(Cur_YH,Cur_YL,Cur_YH,Cur_YL) Not_DI16_Up_Left: MOV R7,#Step_Unit MOV DPTR,#Motor_Control_Table MOV A,Out_Led ANL A,#11110000B ORL A,#00000011B MOV Out_Led,A PUSH P0 MOV P0,A SETB Led_EN NOP CLR Led_EN POP P0 Loop_Up_Left: MOV A,PointerX MOVC A,@A+DPTR PUSH P0 MOV P0,A SETB MotorX_Bit NOP CLR MotorX_Bit POP P0 DJNZ PointerX,Next_Up_Left1 MOV PointerX,#MotorStep Next_Up_Left1: MOV A,PointerY MOVC A,@A+DPTR PUSH P0 MOV P0,A SETB MotorY_Bit NOP CLR MotorY_Bit POP P0 DJNZ PointerY,Next_Up_Left2 MOV PointerY,#MotorStep Next_Up_Left2: DJNZ R7,Loop_Up_Left SETB X_Del SETB Y_Del End_Up_Left_Control: RET ;================================================ ;Go Up_Right ;================================================ Up_Right_Control: JNB Start,Not_DI16_Up_Right %INC16(Cur_XH,Cur_XL,Cur_XH,Cur_XL) %INC16(Cur_YH,Cur_YL,Cur_YH,Cur_YL) Not_DI16_Up_Right: MOV R7,#Step_Unit MOV DPTR,#Motor_Control_Table MOV A,Out_Led ANL A,#11110000B ORL A,#00001010B MOV Out_Led,A PUSH P0 MOV P0,A SETB Led_EN NOP CLR Led_EN POP P0 Loop_Up_Right: MOV A,PointerX MOVC A,@A+DPTR PUSH P0 MOV P0,A SETB MotorX_Bit NOP CLR MotorX_Bit POP P0 INC PointerX MOV A,PointerX CJNE A,#MotorStep+1,Next_Up_Right1 MOV PointerX,#1 Next_Up_Right1: MOV A,PointerY MOVC A,@A+DPTR PUSH P0 MOV P0,A SETB MotorY_Bit NOP CLR MotorY_Bit POP P0 DJNZ PointerY,Next_Up_Right2 MOV PointerY,#MotorStep Next_Up_Right2: DJNZ R7,Loop_Up_Right SETB X_Del SETB Y_Del End_Up_Right_Control: RET ;================================================ ;Go Down_Left ;================================================ Down_Left_Control: JNB Start,Not_DI16_Down_Left %DEC16(Cur_XH,Cur_XL,Cur_XH,Cur_XL) %DEC16(Cur_YH,Cur_YL,Cur_YH,Cur_YL) Not_DI16_Down_Left: MOV R7,#Step_Unit MOV DPTR,#Motor_Control_Table MOV A,Out_Led ANL A,#11110000B ORL A,#00000101B MOV Out_Led,A PUSH P0 MOV P0,A SETB Led_EN NOP CLR Led_EN POP P0 Loop_Down_Left: MOV A,PointerX MOVC A,@A+DPTR PUSH P0 MOV P0,A SETB MotorX_Bit NOP CLR MotorX_Bit POP P0 DJNZ PointerX,Next_Down_Left1 MOV PointerX,#MotorStep Next_Down_Left1: MOV A,PointerY MOVC A,@A+DPTR PUSH P0 MOV P0,A SETB MotorY_Bit NOP CLR MotorY_Bit POP P0 INC PointerY MOV A,PointerY CJNE A,#MotorStep+1,Next_Down_Left2 MOV PointerY,#1 Next_Down_Left2: DJNZ R7,Loop_Down_Left SETB X_Del SETB Y_Del End_Down_Left_Control: RET ;================================================ ;Go Down_Right ;================================================ Down_Right_Control: JNB Start,Not_DI16_Down_Right %INC16(Cur_XH,Cur_XL,Cur_XH,Cur_XL) %DEC16(Cur_YH,Cur_YL,Cur_YH,Cur_YL) Not_DI16_Down_Right: MOV R7,#Step_Unit MOV DPTR,#Motor_Control_Table MOV A,Out_Led ANL A,#11110000B ORL A,#00001100B MOV Out_Led,A PUSH P0 MOV P0,A SETB Led_EN NOP CLR Led_EN POP P0 Loop_Down_Right: MOV A,PointerX MOVC A,@A+DPTR PUSH P0 MOV P0,A SETB MotorX_Bit NOP CLR MotorX_Bit POP P0 INC PointerX MOV A,PointerX CJNE A,#MotorStep+1,Next_Down_Right1 MOV PointerX,#1 Next_Down_Right1: MOV A,PointerY MOVC A,@A+DPTR PUSH P0 MOV P0,A SETB MotorY_Bit NOP CLR MotorY_Bit POP P0 INC PointerY MOV A,PointerY CJNE A,#MotorStep+1,Next_Down_Right2 MOV PointerY,#1 Next_Down_Right2: DJNZ R7,Loop_Down_Right SETB X_Del SETB Y_Del End_Down_Right_Control: RET DRAW.INC: ;============================================== ;Khoi dong Spline ;Input : ;Output : No ;============================================== Spline_Init: PUSH 0 MOV R0,#NumKnots MOV A,@R0 DEC A ;A=Numknots-1 %Knot (A,DeltaXH,DeltaXL) ;tính knot[numknots-1] ;CLR C ;MOV A,DeltaXH ;delta=knot[numknots-1] div 2 ;RRC A ; ;MOV DeltaXH,A ; ;MOV A,DeltaXL ; ;RRC A ; ;MOV DeltaXL,A ; ;MOV Dinc1H,#0 ;MOV Dinc1L,#0 CLR A %Knot (A,TH,TL) ;t=knot[0] ;MOV TH,#0 ;MOV TL,#0 POP 0 End_Spline_Init: RET ;============================================== ;Spline ;Input : ;Output : No ;============================================== Spline: MOV XH,#0 MOV XL,#0 MOV YH,#0 MOV YL,#0 MOV K,#0 ;CLR C ;MOV A,Dinc1L ;t=Dinc1*2 ;RLC A ; ;MOV TL,A ; ;MOV A,Dinc1H ; ;RLC A ; ;MOV TH,A ; Spline_L1: %N(K,TH,TL,DeltaYH,DeltaYL) ;N(k,m=4,t) %Control_Point_X(K,Y1H,Y1L) ;Y1=Control_Point[k].x %MUL32 (Y1H,Y1L,DeltaYH,DeltaYL) ;Control_Point[k].x*N MOV Y2H,#7FH MOV Y2L,#0FFH %DIV32 (TMP_3,TMP_2,TMP_1,TMP_0,Y2H,Y2L) ;chia cho 32767 %ADD16 (XH,XL,TMP_1,TMP_0,XH,XL) %Control_Point_Y(K,Y1H,Y1L) ;Y1=Control_Point[k].y %MUL32 (Y1H,Y1L,DeltaYH,DeltaYL) ;Control_Point[k].y*N MOV Y2H,#7FH MOV Y2L,#0FFH %DIV32 (TMP_3,TMP_2,TMP_1,TMP_0,Y2H,Y2L) ;chia cho 32767 %ADD16 (YH,YL,TMP_1,TMP_0,YH,YL) INC K MOV A,K ;A=k PUSH 0 MOV R0,#NumPoints MOV B,@R0 ;B=NumPoints POP 0 CJNE A,B,Spline_L2 JMP Spline_L3 Spline_L2: JMP Spline_L1 Spline_L3: ;So saùnh XH,XL - YH,YL vôùi Cur_XH,Cur_XL - Cur_YH,Cut_YL %SUB16 (XH,XL,Cur_XH,Cur_XL,Dinc2H,Dinc2L) Spline_Move_X: %CMPZ (Dinc2H,Dinc2L) JB EQ_Flag,Spline_Not_Move_X JB GR_Flag,Spline_Go_Right CALL Left_Control ;LE_Flag=1 JMP Spline_Not_Move_X Spline_Go_Right: CALL Right_Control JMP Spline_Not_Move_X Spline_Not_Move_X: %SUB16 (YH,YL,Cur_YH,Cur_YL,Dinc2H,Dinc2L) Spline_Move_Y: %CMPZ (Dinc2H,Dinc2L) JB EQ_Flag,Spline_Not_Move_Y JB GR_Flag,Spline_Go_Up CALL Down_Control ;LE_Flag=1 JMP Spline_Not_Move_Y Spline_Go_Up: CALL Up_Control JMP Spline_Not_Move_Y Spline_Not_Move_Y: %INC16 (TH,TL,TH,TL) %CMP (TH,TL,DeltaXH,DeltaXL) JC End_Spline ;chöa veõ xong CLR Motor_Flag CLR Spline_Draw MOV Ext_Data,#80H MOV DataBaseAddr,#0FH SETB Transmit_Flag CALL Turn_On_AUTO_LED ;Xoùa caùc ñeøn chæ höôùng chuyeån ñoäng CALL Delete_Pulse End_Spline: RET ;============================================== ;Khoi dong Line ;Input : X1H,X1L - Y1H,Y1L - X2H,X2L - Y2H,Y2L ;Output : No ;============================================== Line_Init: MOV XH,X1H MOV XL,X1L MOV YH,Y1H MOV YL,Y1L %SUB16 (X2H,X2L,X1H,X1L,DeltaXH,DeltaXL) MOV A,DeltaXH CLR B1 ;DeltaX döông JNB ACC.7,Next_B SETB B1 ;DeltaX aâm Next_B: %ABS (DeltaXH,DeltaXL) %SUB16 (Y2H,Y2L,Y1H,Y1L,DeltaYH,DeltaYL) MOV A,DeltaYH CLR C1 ;DeltaY döông JNB ACC.7,Next_C SETB C1 ;DeltaY aâm Next_C: %ABS (DeltaYH,DeltaYL) %CMP (DeltaXH,DeltaXL,DeltaYH,DeltaYL) MOV D1,C JC Less_DX_DY %SUB16 (DeltaYH,DeltaYL,DeltaXH,DeltaXL,Dinc2H,Dinc2L) MOV Dinc1H,DeltaYH MOV Dinc1L,DeltaYL %SHR (DeltaXH,DeltaXL,DeltaYH,DeltaYL) %SUB16 (Dinc1H,Dinc1L,DeltaYH,DeltaYL,DeltaYH,DeltaYL) INC DeltaXH JMP End_Line_Init Less_DX_DY: %SUB16 (DeltaXH,DeltaXL,DeltaYH,DeltaYL,Dinc2H,Dinc2L) MOV Dinc1H,DeltaXH MOV Dinc1L,DeltaXL MOV DeltaXH,DeltaYH MOV DeltaXL,DeltaYL %SHR (DeltaYH,DeltaYL,DeltaYH,DeltaYL) %SUB16 (Dinc1H,Dinc1L,DeltaYH,DeltaYL,DeltaYH,DeltaYL) INC DeltaXH End_Line_Init: RET ;============================================== ;Line ;Input : X1H,X1L - Y1H,Y1L - X2H,X2L - Y2H,Y2L ;Output : No ;============================================== Line: MOV A,DeltaYH JNB ACC.7,Delta_Positive %ADD16 (DeltaYH,DeltaYL,Dinc1H,Dinc1L,DeltaYH,DeltaYL) JNB D1,D1_0 JNB C1,C1_0 CALL Down_Control JMP Next_Delta C1_0: CALL Up_Control JMP Next_Delta D1_0: JNB B1,B1_0 CALL Left_Control JMP Next_Delta B1_0: CALL Right_Control JMP Next_Delta Delta_Positive: %ADD16 (DeltaYH,DeltaYL,Dinc2H,Dinc2L,DeltaYH,DeltaYL) JB B1,B1_1 JB C1,C1_Down CALL Up_Right_Control JMP Next_Delta C1_Down: CALL Down_Right_Control JMP Next_Delta B1_1: JNB C1,C1_Up CALL Down_Left_Control JMP Next_Delta C1_Up: CALL Up_Left_Control Next_Delta: DJNZ DeltaXL,End_Line DJNZ DeltaXH,End_Line CLR Motor_Flag CLR Line_Draw MOV DataBaseAddr,#0FH SETB Transmit_Flag CALL Turn_On_AUTO_LED ;Xoùa caùc ñeøn chæ höôùng chuyeån ñoäng CALL Delete_Pulse End_Line: RET ;============================================== ;Khoi dong Circle (phan tinh Circle14) ;Input : X1H,X1L - Y1H,Y1L - X2H,X2L - Y2H,Y2L ;Output : Circle14 ;============================================== Calc_Circle14_Rev: %SUB16 (X2H,X2L,X1H,X1L,X2H,X2L) %SUB16 (Y2H,Y2L,Y1H,Y1L,Y2H,Y2L) %CMPZ (X2H,X2L) JB GR_Flag,X2_GZ_Rev JB EQ_Flag,X2_EZ_Rev JB LE_Flag,X2_LZ_Rev X2_GZ_Rev: %CMPZ (Y2H,Y2L) JB GR_Flag,Circle14_1_Rev JB EQ_Flag,Circle14_4_Rev JB LE_Flag,Circle14_4_Rev X2_EZ_Rev: %CMPZ (Y2H,Y2L) JB GR_Flag,Circle14_1_Rev JB LE_Flag,Circle14_3_Rev X2_LZ_Rev: %CMPZ (Y2H,Y2L) JB GR_Flag,Circle14_2_Rev JB EQ_Flag,Circle14_2_Rev JB LE_Flag,Circle14_3_Rev Circle14_1_Rev: MOV Circle14,#1 JMP End_Calc_Circle14_Rev Circle14_2_Rev: MOV Circle14,#2 JMP End_Calc_Circle14_Rev Circle14_3_Rev: MOV Circle14,#3 JMP End_Calc_Circle14_Rev Circle14_4_Rev: MOV Circle14,#4 End_Calc_Circle14_Rev: RET ;============================================== ;Khoi dong Circle (phan tinh Circle14) ;Input : X1H,X1L - Y1H,Y1L - X2H,X2L - Y2H,Y2L ;Output : Circle14 ;============================================== Calc_Circle14_For: %SUB16 (X2H,X2L,X1H,X1L,X2H,X2L) %SUB16 (Y2H,Y2L,Y1H,Y1L,Y2H,Y2L) %CMPZ (X2H,X2L) JB GR_Flag,X2_GZ_For JB EQ_Flag,X2_EZ_For JB LE_Flag,X2_LZ_For X2_GZ_For: %CMPZ (Y2H,Y2L) JB GR_Flag,Circle14_1_For JB EQ_Flag,Circle14_1_For JB LE_Flag,Circle14_4_For X2_EZ_For: %CMPZ (Y2H,Y2L) JB GR_Flag,Circle14_2_For JB LE_Flag,Circle14_4_For X2_LZ_For: %CMPZ (Y2H,Y2L) JB GR_Flag,Circle14_2_For JB EQ_Flag,Circle14_3_For JB LE_Flag,Circle14_3_For Circle14_1_For: MOV Circle14,#1 JMP End_Calc_Circle14_For Circle14_2_For: MOV Circle14,#2 JMP End_Calc_Circle14_For Circle14_3_For: MOV Circle14,#3 JMP End_Calc_Circle14_For Circle14_4_For: MOV Circle14,#4 End_Calc_Circle14_For: RET ;============================================== ;Khoi dong Circle (phan tinh D1 va D2) ;Input : X1H,X1L - Y1H,Y1L - BKH,BKL - X2H,X2L - Y2H,Y2L ;Output : DeltaXH,DeltaXL - DeltaYH,DeltaYL ;============================================== Calc_D1_D2: MOV DeltaXH,BKH MOV DeltaXL,BKL %SHL (DeltaXH,DeltaXL,DeltaXH,DeltaXL) %Sign (DeltaXH,DeltaXL) %INC16 (DeltaXH,DeltaXL,DeltaXH,DeltaXL) MOV DeltaYH,BKH MOV DeltaYL,BKL %Sign (DeltaYH,DeltaYL) %INC16 (DeltaYH,DeltaYL,DeltaYH,DeltaYL) End_Calc_D1_D2: RET ;============================================== ;Khoi dong Circle (Tinh XH,XL,YH,YL) ;Input : Circle14 - X1H,X1L - Y1H,Y1L - CurXH,CurXL - CurYH,CurYL ;Output : XH,XL - YH,YL ;============================================== Calc_X_Y: MOV A,Circle14 CJNE A,#1,Circle14_Diff_1 %SUB16 (Cur_XH,Cur_XL,X1H,X1L,XH,XL) %SUB16 (Cur_YH,Cur_YL,Y1H,Y1L,YH,YL) JMP End_Calc_X_Y Circle14_Diff_1: CJNE A,#2,Circle14_Diff_2 %SUB16 (Cur_YH,Cur_YL,Y1H,Y1L,XH,XL) %SUB16 (X1H,X1L,Cur_XH,Cur_XL,YH,YL) JMP End_Calc_X_Y Circle14_Diff_2: CJNE A,#3,Circle14_Diff_3 %SUB16 (X1H,X1L,Cur_XH,Cur_XL,XH,XL) %SUB16 (Y1H,Y1L,Cur_YH,Cur_YL,YH,YL) JMP End_Calc_X_Y Circle14_Diff_3: %SUB16 (Y1H,Y1L,Cur_YH,Cur_YL,XH,XL) %SUB16 (Cur_XH,Cur_XL,X1H,X1L,YH,YL) End_Calc_X_Y: RET ;============================================== ;Khoi dong Circle (Tinh CH,CL) ;Input : Circle14 - X2H,X2L - Y2H,Y2L ;Output : CH,CL ;============================================== Calc_C_Rev: MOV A,Circle14 CJNE A,#1,Circle14_Diff_1_Rev MOV CH,X2H MOV CL,X2L JMP End_Calc_C_Rev Circle14_Diff_1_Rev: CJNE A,#2,Circle14_Diff_2_Rev MOV CH,Y2H MOV CL,Y2L JMP End_Calc_C_Rev Circle14_Diff_2_Rev: CJNE A,#3,Circle14_Diff_3_Rev MOV CH,X2H MOV CL,X2L %Sign (CH,CL) JMP End_Calc_C_Rev Circle14_Diff_3_Rev: MOV CH,Y2H MOV CL,Y2L %Sign (CH,CL) End_Calc_C_Rev: %INC16 (CH,CL,CH,CL) RET ;============================================== ;Khoi dong Circle (Tinh CH,CL) ;Input : Circle14 - X2H,X2L - Y2H,Y2L ;Output : CH,CL ;============================================== Calc_C_For: MOV A,Circle14 CJNE A,#1,Circle14_Diff_1_For MOV CH,Y2H MOV CL,Y2L JMP End_Calc_C_For Circle14_Diff_1_For: CJNE A,#2,Circle14_Diff_2_For MOV CH,X2H MOV CL,X2L %Sign (CH,CL) JMP End_Calc_C_For Circle14_Diff_2_For: CJNE A,#3,Circle14_Diff_3_For MOV CH,Y2H MOV CL,Y2L %Sign (CH,CL) JMP End_Calc_C_For Circle14_Diff_3_For: MOV CH,X2H MOV CL,X2L End_Calc_C_For: %INC16 (CH,CL,CH,CL) RET ;============================================== ;Khoi dong Circle (Convert X,Y) ;Input : XH,XL - YH,YL ;Output : XH,XL - YH,YL ;============================================== Convert_X_Y: MOV R7,XH MOV R6,XL MOV XH,YH MOV XL,YL MOV YH,R7 MOV YL,R6 End_Convert_X_Y: RET ;============================================== ;Khoi dong Circle ;Input : No ;Output : No ;============================================== Circle_Init_Rev: CALL Calc_Circle14_Rev CALL Calc_D1_D2 CALL Calc_X_Y CALL Calc_C_Rev End_Circle_Init_Rev: RET ;============================================== ;Khoi dong Circle ;Input : No ;Output : No ;============================================== Circle_Init_For: CALL Calc_Circle14_For CALL Calc_D1_D2 CALL Calc_X_Y CALL Calc_C_For CALL Convert_X_Y End_Circle_Init_For: RET ;============================================== ;Ve mot phan tu hinh tron: ;Input : X1H,X1L - Y1H,Y1L - X2H,X2L ;Output : No ;============================================== Circle_Rev: MOV A,DeltaXH JNB ACC.7,D1_Positive_Rev MOV A,DeltaYH JNB ACC.7,D2_Positive_Rev JMP Case1_Rev D2_Positive_Rev: JMP Case2_Rev D1_Positive_Rev: JMP Case3_Rev Case1_Rev: %BT1 (DeltaXH,DeltaXL,YH,YL) %BT2 (DeltaYH,DeltaYL,YH,YL) %INC16 (YH,YL,YH,YL) %Direction1_Rev JMP Next_Circle_Rev Case2_Rev: %BT3 (DeltaXH,DeltaXL,XH,XL,YH,YL) %BT3 (DeltaYH,DeltaYL,XH,XL,YH,YL) %DEC16 (XH,XL,XH,XL) %INC16 (YH,YL,YH,YL) %Direction2_Rev JMP Next_Circle_Rev Case3_Rev: %BT4 (DeltaXH,DeltaXL,XH,XL) %BT5 (DeltaYH,DeltaYL,XH,XL) %DEC16 (XH,XL,XH,XL) %Direction3_Rev Next_Circle_Rev: %CMP (XH,XL,CH,CL) JNC End_Circle_Rev CLR Motor_Flag CLR Circle_Rev_Draw MOV DataBaseAddr,#0FH SETB Transmit_Flag CALL Turn_On_AUTO_LED CALL Delete_Pulse End_Circle_Rev: RET ;============================================== ;Ve mot phan tu hinh tron: ;Input : X1H,X1L - Y1H,Y1L - X2H,X2L ;Output : No ;============================================== Circle_For: MOV A,DeltaXH JNB ACC.7,D1_Positive_For MOV A,DeltaYH JNB ACC.7,D2_Positive_For JMP Case1_For D2_Positive_For: JMP Case2_For D1_Positive_For: JMP Case3_For Case1_For: %BT1 (DeltaXH,DeltaXL,YH,YL) %BT2 (DeltaYH,DeltaYL,YH,YL) %INC16 (YH,YL,YH,YL) %Direction1_For JMP Next_Circle_For Case2_For: %BT3 (DeltaXH,DeltaXL,XH,XL,YH,YL) %BT3 (DeltaYH,DeltaYL,XH,XL,YH,YL) %DEC16 (XH,XL,XH,XL) %INC16 (YH,YL,YH,YL) %Direction2_For JMP Next_Circle_For Case3_For: %BT4 (DeltaXH,DeltaXL,XH,XL) %BT5 (DeltaYH,DeltaYL,XH,XL) %DEC16 (XH,XL,XH,XL) %Direction3_For Next_Circle_For: %CMP (XH,XL,CH,CL) JNC End_Circle_For CLR Motor_Flag CLR Circle_For_Draw MOV DataBaseAddr,#0FH SETB Transmit_Flag CALL Turn_On_AUTO_LED CALL Delete_Pulse End_Circle_For: RET ;================================================= ;Nhaác buùt veõ leân ;================================================= Pen_Up: JNB Pen_Lift,End_Pen_Up CLR Press MOV A,Out_Led ANL A,#01111111B MOV Out_Led,A End_Pen_Up: RET ;================================================= ;Haï buùt veõ xuoáng ;================================================= Pen_Down: JB Pen_Lift,End_Pen_Down CLR Press MOV A,Out_Led ORL A,#10000000B MOV Out_Led,A End_Pen_Down: RET KEY.INC: ;================================================ ;Doan chuong trinh quet phim ;Output : KeyOut ;================================================ KeyDecoder: MOV A,Key CALL KeyCode NOP JB KeyIn,Key_Equal DJNZ Key,End_KeyDecoder MOV Key,#KeyNumber JNB KeyPressed,Key_Next1 CLR KeyPressed JMP End_KeyDecoder Key_Next1: ;Khoâng coù phím naøo ñöôïc nhaán MOV KeyOut,#0 MOV Key_Counter,#0 CALL Delete_Pulse JMP End_KeyDecoder Key_Equal: ;Coù phím nhaán MOV A,Key CJNE A,Key_Pressed,Key_Not_Equal INC Key_Counter MOV A,Key_Counter CJNE A,#KeyCount,End_KeyPressed MOV A,Key_Pressed CALL OutKeyCode MOV Key_Counter,#0 JMP End_KeyPressed Key_Not_Equal: ;Chöa ñuû soá laàn laëp queùt phím MOV Key_Counter,#0 MOV Key_Pressed,Key JMP End_KeyPressed End_KeyPressed: SETB KeyPressed DJNZ Key,End_KeyDecoder MOV Key,#KeyNumber End_KeyDecoder: RET ;================================================ ;Doan chuong trinh xuat ma quet phim ;================================================ KeyCode: ;Taïo caùc giaù trò ñeå kieåm tra phím naøo ñöôïc nhaán MOV DPTR,#(Key_Code-1) MOVC A,@A+DPTR ORL P2,#00001111B ANL A,P2 MOV P2,A RET Key_Code: DB 11111110B DB 11111101B DB 11111011B DB 11110111B End_KeyCode: ;================================================ ;Doan chuong trinh xuat ra phim duoc nhan ;================================================ OutKeyCode: ;Set côø F(i) töông öùng vôùi phím ñaõ ñöôïc nhaán MOV DPTR,#(Flag_Code-1) MOVC A,@A+DPTR MOV KeyOut,A RET Flag_Code: DB 00000001B DB 00000010B DB 00000100B DB 00001000B End_OutKeyCode: MANUAL.INC: ;================================================= ;Xoùa caùc ñeøn ñieàu khieån höôùng chuyeåàn ñoäng vaø ñeøn AUTO ;================================================= Delete_Direction_LED: MOV A,Out_Led ANL A,#11100000B MOV Out_Led,A End_Delete_Direction_LED: RET ;================================================= ;Cheá ñoä ñieàu khieån baèng tay ;================================================= Manual: JNB F1,Not_Left CALL Left_Control JMP End_Manual Not_Left: JNB F2,Not_Up CALL Up_Control JMP End_Manual Not_Up: JNB F3,Not_Down CALL Down_Control JMP End_Manual Not_Down: JNB F4,End_Manual CALL Right_Control End_Manual: RET TRANSFER.INC: Transfer: Receive: JNB RI,End_Receive CLR RI MOV A,SBUF MOV C,P ANL C,RB8 JC Data_OK MOV C,P ORL C,RB8 JNC Data_OK MOV DataBaseAddr,#0FFH SETB Transmit_Flag MOV R0,#DataBaseAddr MOV DataIn_Counter,#DataInByte MOV A,Out_Led ORL A,#00100000B MOV Out_Led,A JMP End_Receive Data_OK: MOV @R0,A INC R0 DJNZ DataIn_Counter,End_Receive MOV DataIn_Counter,#DataInByte MOV R0,#DataBaseAddr MOV A,DataBaseAddr CJNE A,#PC_Addr,End_Receive SETB Draw_Flag MOV A,Out_Led ANL A,#11011111B MOV Out_Led,A End_Receive: Transmit: JNB Transmit_Flag,End_Transmit JNB TI,End_Transmit CLR TI CLR Transmit_Flag MOV A,DataBaseAddr MOV C,P MOV TB8,C MOV SBUF,A End_Transmit: End_Transfer: RET AUTO.INC: ;================================================= ;Baät ñeøn AUTO ;================================================= Turn_on_AUTO_LED: MOV A,Out_Led ANL A,#11110000B ORL A,#00010000B MOV Out_Led,A RET End_Turn_On_AUTO_LED: ;================================================= ;Xaùc ñònh loaïi leänh nhaän ñöôïc vaø thöïc hieän caùc khôûi ñoäng töông öùng ;================================================= Draw_Identify: JNB Draw_Flag,End_Draw_Label CLR Draw_Flag JMP Next_Draw_Identify End_Draw_Label: JMP End_Draw_Identify Next_Draw_Identify: MOV A,DataBaseAddr+1 CJNE A,#0,Not_Move CALL Pen_Up CALL Line_Init SETB Motor_Flag SETB Line_Draw JMP End_Draw_Identify Not_Move: CJNE A,#1,Not_Line CALL Pen_Down CALL Line_Init SETB Motor_Flag SETB Line_Draw JMP End_Draw_Identify Not_Line: CJNE A,#2,Not_Circle_For CALL Pen_Down CALL Circle_Init_For SETB Motor_Flag SETB Circle_For_Draw JMP End_Draw_Identify Not_Circle_For: CJNE A,#3,Not_Circle_Rev CALL Pen_Down CALL Circle_Init_Rev SETB Motor_Flag SETB Circle_Rev_Draw JMP End_Draw_Identify Not_Circle_Rev: CJNE A,#4,Not_Data_Out SETB Data_Out JMP End_Draw_Identify Not_Data_Out: CJNE A,#5,Not_Speed_Change MOV Speed,DataBaseAddr+3 MOV DataBaseAddr,#0FH SETB Transmit_Flag JMP End_Draw_Identify Not_Speed_Change: CJNE A,#6,Not_Data_In CALL Mov_Ext_Data ;Ñöa döõ lieäu vaøo vuøng 128byte cao MOV DataBaseAddr,#0FH SETB Transmit_Flag JMP End_Draw_Identify Not_Data_In: CJNE A,#7,Not_Spline CALL Pen_Down CALL Spline_Init SETB Motor_Flag SETB Spline_Draw JMP End_Draw_Identify Not_Spline: CJNE A,#8,Not_LCD SETB Motor_Flag SETB LCD_Display_Flag JMP End_Draw_Identify Not_LCD: CJNE A,#9,Not_Clear CALL Clear_LCD MOV DataBaseAddr,#0FH SETB Transmit_Flag JMP End_Draw_Identify Not_Clear: CJNE A,#10,Not_Next_Row CALL Next_Row_LCD MOV DataBaseAddr,#0FH SETB Transmit_Flag JMP End_Draw_Identify Not_Next_Row: End_Draw_Identify: RET ;================================================= ;Ñieàu khieån ñoäng cô veõ caùc ñöôøng töông öùng vôùi leänh nhaän ñöôïc ;================================================= Motor_Control_Drawing: JNB Motor_Flag,End_Motor_Control_Drawing JNB Line_Draw,Motor_Control_L1 CALL Line JMP End_Motor_Control_Drawing Motor_Control_L1: JNB Circle_Rev_Draw,Motor_Control_L2 CALL Circle_Rev JMP End_Motor_Control_Drawing Motor_Control_L2: JNB Circle_For_Draw,Motor_Control_L3 CALL Circle_For Motor_Control_L3: JNB Spline_Draw,Motor_Control_L4 CALL Spline Motor_Control_L4: JNB LCD_Display_Flag,Motor_Control_L5 CALL LCD_Display Motor_Control_L5: End_Motor_Control_Drawing: RET ;================================================= ;Xuaát toïa ñoä hieän haønh cuûa buùt veõ ;================================================= Position_Output: JNB Data_Out,End_Position_Output MOV DataBaseAddr,@R1 INC R1 SETB Transmit_Flag DJNZ DataOut_Counter,End_Position_Output MOV DataOut_Counter,#DataOutByte CLR Data_Out MOV R1,#Cur_XH End_Position_Output: RET ;================================================= ;Döøng heä thoáng baèng nuùt Start/Stop ;================================================= Stop_System: JNB Run,End_Stop_System PUSH P0 MOV A,Out_Led ORL A,#01000000B MOV Out_Led,A MOV P0,Out_Led SETB Led_EN NOP CLR Led_EN POP P0 MOV SBUF,#0F0H CLR IE.1 End_Stop_System: ROUNTINE.INC: ;================================================= ;Khôûi ñoäng Port noái tieáp, caùc timer vaø ngaét ;================================================= Serial_Port_Timer_Init: MOV SCON,#11010010B MOV IE,#10000010B MOV TMOD,#22H MOV TH1,#-3 MOV TH0,#TimeBase SETB TR1 SETB TR0 RET End_Serial_Port_Timer_Init: ;================================================= ;Khôûi ñoäng caùc bit ;================================================= Bit_Init: SETB Transmit_Flag CLR Timer_F1 CLR Draw_Flag CLR KeyPressed CLR F1 CLR F2 CLR F3 CLR F4 CLR Motor_Flag CLR MotorX_Bit CLR MotorY_Bit CLR Led_EN CLR P1.0 CLR Line_Draw CLR Circle_Rev_Draw CLR Circle_For_Draw CLR Spline_Draw CLR LCD_Display_Flag CLR Data_Out CLR X_Del CLR Y_Del SETB Press CLR LCD_Busy CLR Run End_Bit_Init: RET ;================================================= ;Khôûi ñoäng caùc bieán ;================================================= Variable_Init: MOV Speed,#V MOV TimerCount,#TimeCount MOV TimerCount1,Speed MOV DataIn_Counter,#DataInByte MOV R0,#DataBaseAddr MOV R1,#Cur_XH MOV PointerX,#MotorStep MOV PointerY,#MotorStep MOV Key,#KeyNumber MOV Key_Pressed,#0 MOV Key_Counter,#0 MOV DataBaseAddr,#0FH MOV Out_Led,#0 MOV Cur_XH,#0 MOV Cur_XL,#0 MOV Cur_YH,#0 MOV Cur_YL,#0 MOV DataOut_Counter,#DataOutByte MOV Press_Counter,#PressCount MOV NBaseAddr,#0D8H MOV Ext_Data,#80H MOV LCD_Pointer,#80H RET End_Variable_Init: ;================================================= ;Xoùa xung kích ñoäng cô böôùc ;================================================= Delete_Pulse: JNB X_Del,Next_Delete_Pulse CLR X_Del PUSH P0 MOV A,#0FFH MOV P0,A SETB MotorX_Bit NOP CLR MotorX_Bit POP P0 Next_Delete_Pulse: JNB Y_Del,End_Delete_Pulse CLR Y_Del PUSH P0 MOV A,#0FFH MOV P0,A SETB MotorY_Bit NOP CLR MotorY_Bit POP P0 End_Delete_Pulse: RET ;================================================= ;Xuaát caùc tín hieäu ñeøn baùo ;================================================= Out_Led_Control: PUSH P0 MOV P0,Out_Led SETB Led_EN NOP CLR Led_EN POP P0 RET End_Out_Led: ;================================================= ;Kieåm tra caùc coâng taéc haønh trình, neáu chaïm bieân -> döøng TIMER ;================================================= Limit_Control: JNB Start_X,Stop_Start_X JNB End_X,Stop_End_X JNB Start_Y,Stop_Start_Y JNB End_Y,Stop_End_Y JMP End_Limit_Control Stop_Start_X: JNB Timer_F2,$ CLR Timer_F2 CALL Right_Control JNB Start_X,Stop_Start_X JMP Stop Stop_End_X: JNB Timer_F2,$ CLR Timer_F2 CALL Left_Control JNB End_X,Stop_End_X JMP Stop Stop_Start_Y: JNB Timer_F2,$ CLR Timer_F2 CALL Up_Control JNB Start_Y,Stop_Start_Y JMP Stop Stop_End_Y: JNB Timer_F2,$ CLR Timer_F2 CALL Down_Control JNB End_Y,Stop_End_Y JMP Stop Stop: PUSH P0 MOV A,Out_Led ORL A,#01000000B MOV Out_Led,A MOV P0,Out_Led SETB Led_EN NOP CLR Led_EN POP P0 MOV SBUF,#0F1H CLR IE.1 End_Limit_Control: RET ;================================================= ;Chuyeån 10 byte döõ lieäu töø oâ nhôù 32H..3BH leân vuøng 128byte cao ;================================================= Mov_Ext_Data: PUSH 0 PUSH 1 MOV R2,#10 MOV R1,#DataBaseAddr+2 Mov_Data_Loop: MOV R0,Ext_Data MOV A,@R1 MOV @R0,A INC Ext_Data INC R1 DJNZ R2,Mov_Data_Loop POP 1 POP 0 End_Mov_Ext_Data: RET

Các file đính kèm theo tài liệu này:

  • docThesis.doc
  • docIntro.doc
  • rarProgram.rar
Luận văn liên quan