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.
186 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 2534 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Luận văn Điều khiển máy vẽ bằng vi xử lý, để xem tài liệu hoàn chỉnh 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