יום ראשון, 21 בדצמבר 2014

תכנות בשפת אסמבלי איך כותבים באמסבלי שבע מקטעים תכניות מוכנות באסמבלי איך כותבים השהייה הסברים הנדסאי אלקטרוניקה ומחשבים

כתיבה על מיקרו בקר באסמבלי אמסבלר 89c51
כתיבה אל מיקרו בקר



איך עושים השהייה באסמבלי?

MOV R0, #10;
DAVID11244: MOV R1,#255;  
HOM11244: DJNZ R1,HOM11244; 
DJNZ R0, DAVID11244

השהייה היא בעצם לולאה בתוך לולאה.
אנחנו צריכים השהייה משום שהמהירות בין פקודה לפקודה היא כל כך מהירה עד כדי כך שאנחנו לא מפסיקים לראות בעין שלנו את ההבדל (יש לנו עין "פרימיטיבית" שלא שמה לב למהירויות של מיקרו שנייה, מילי שנייה), לכן אנחנו עושים השהייה כדי שהעין שלנו תוכל להבחין בהבדל.
ניקח לדוגמה הבהוב של מנורה: אם מצבה של המורה היה דלוק מלכתחילה ואנחנו נכבה אותה בלי השהייה ואז נדליק: העין שלנו תראה שהמנורה דלוקה כל הזמן.
לעומת זאת אם המנורה שלנו דלוקה מלכתחילה, נעשה שהייה, נכבה, נעשה שהייה ולאחר מכן נחזור על זה ונוכל לראות את הבהוב של המנורה (אם ה-השהייה תהיה מספיק ארוכה, במידה טובה).


** יש לציין כי חלק רק מהתוכנות שכתובות כאן ניתן לשפר באופן משמעותי על ידי שימוש בפרוצדורות / תתי שגרה, זאת אומרת במקום כל פעם לכתוב מחדש למשל את ההשהייה (שחוזרת על עצמה כל פעם ופעם בתכנית מסוימת) אפשר לכתוב אותה פעם אחת, לסמן אותה בתווית, ולקרוא לה מתי שצריכים אותה. * *

איך לכתוב ספרות באסמבלי ב 7 seg
כל הספרות בתצוגת שבע מקטעים all the digits in 7 segment
(כאשר '0' מדליק את הסיפרה, ו '1' מכבה את הלד, כמתואר בשרטוט)




a
b
c
d
e
f
g
DP
הסיפרה
0
0
0
0
0
0
1
1
0
1
0
0
1
1
1
1
1
1
0
0
1
0
0
1
0
1
2
0
0
0
0
1
1
0
1
3
1
0
0
1
1
0
1
1
4
0
1
0
0
1
0
0
1
5
0
1
0
0
0
0
0
1
6
0
0
0
1
1
1
1
1
7
0
0
0
0
0
0
0
1
8
0
0
0
0
1
1
0
1
9



תכנית שמריצה את המספר 1 2 3 אחד אחרי השני בתצוגת שבע מקטעים 
7 segment 

LJMP START;
ORG 200;
START:



// השהייה
MOV R0, #10;
DAVID11244: MOV R1,#255;  
HOM11244: DJNZ R1,HOM11244; 
DJNZ R0, DAVID11244
 
 
mov p1, #11111110B  
mov p0, #11111001B  // מציג את הסיפרה אחד

// השהייה

MOV R0, #255;
DAVID1: MOV R1,#255;
HOM1: DJNZ R1,HOM1; 
DJNZ R0, DAVID1 ;

// השהייה

MOV R0, #255;
DAVID11: MOV R1,#255;
HOM11: DJNZ R1,HOM11; 
DJNZ R0, DAVID11 ;


mov p1, #11111101B
mov p0, #10100100B // הסיפרה שתיים



// השהייה
MOV R0, #255;
DAVID11oo: MOV R1,#255;
HOM11oo: DJNZ R1,HOM11oo; 
DJNZ R0, DAVID11oo ;


mov p1, #11111011B
mov p0, #10110000B  // הסיפרה שלוש



// השהייה
MOV R0, #255;
DAVID11tt: MOV R1,#255;
HOM11tt: DJNZ R1,HOM11tt; 
DJNZ R0, DAVID11tt ;





 LJMP START; 
END



לכתוב יותר מסיפרה אחת בתצוגת שבע מקטעים 7 segments:
איננו יכולים להציג בו זמנית שתי ספרות או יותר (במסך שלנו יש ארבע תצוגות שונות שבהן אפשר לרשום ארבע ספרות בכל תצוגה סיפרה אחרת).
אנחנו יכולים להדליק קבוצה אחת של ספרות בכל פעם - ולא כמה בבת אחת.
אם ברצוננו להציג את המספר 23? הרי שנצטרך שני קבוצות של ספרות... 
הפתרון שלנו הוא ל"עבוד" על העין הפרימיטיבית שלנו, שלא מבדילה במהירויות גבוהות.
אנחנו נציג סיפרה אחת, למשל את הסיפרה שתיים, נעשה שהייה מסויימת, נציג את הסיפרה שלוש שלידה, נעשה השהייה מסויימת, נציג את הסיפרה שתיים כמו מקודם.. וכך הלאה.. בעצם אנחנו מציגים פעם את הסיפרה שתיים בניפרד ופעם את הסיפרה שלוש בניפרד אבל אם נשים השהייה מסויימת העין שלנו תחשוב שהם מופיעים בו זמנית.



תכנית שכותבת את המספר 2014 בתצוגת 7 segment שבע מקטעים:

LJMP START;
ORG 200;
START:

// השהייה
MOV R0, #10;
DAVID11244: MOV R1,#255;
HOM11244: DJNZ R1,HOM11244; 
DJNZ R0, DAVID11244
 
 
mov p1, #11111110B // גורם לכך ששבע המקטעים השמאליים יהיו דלוקים
mov p0, #10100100B // רושם את הסיפרה שתיים

MOV R0, #10;
DAVID112441: MOV R1,#255;
HOM112441: DJNZ R1,HOM112441; 
DJNZ R0, DAVID112441


mov p1, #11111101B // גורם לכך ששבע המקטעים השלישיים מיימן יהיו דלוקים
mov p0, #11000000B // כותב את הסיפרה אפס

// השהייה
  MOV R0, #10;
DAVID11244122: MOV R1,#255;
HOM11244122: DJNZ R1,HOM11244122; 
DJNZ R0, DAVID11244122


mov p1, #11111011B // גורם לכך ששבע המקטעים השניים מימין יהיו דלוקים
mov p0, #11111001B // כותב את הסיפרה שתיים



// השהייה
    MOV R0, #10;
DAVID1124412233: MOV R1,#255;
HOM1124412233: DJNZ R1,HOM1124412233; 
DJNZ R0, DAVID1124412233
mov p1, #11110111B // גורם לכך ששבע המקטעים הראשונים מימין יהיו דלוקים
mov p0, #10011001B // כותב את הסיפרה 4

 LJMP START;  // קופץ לתווית
END






תכנית שסופרת מאפס עד חמש באמצעות שבע מקטעים ( 7 segment), (אפס, אחת, שתיים, שלוש, ארבע, חמש) ועושה טיקטוקים בין סיפרה לסיפרה ובסוף היא עושה ציפצוף שהיא מגיע לסיפרה חמש.


   LJMP START;
ORG 200;
START:



LCALL DELAY;
 
mov p1, #11110111B 

mov p0, #11000000B ;0

LCALL DELAY;


mov p1, #11100111B
   mov p0, #11111001B  ; 1


LCALL DELAY;


mov p1, #11110111B
mov p0, #10100100B; 2



 LCALL DELAY;


mov p1, #11100111B
MOV P0,#10110000B ; '3'


LCALL DELAY;


mov p1, #11110111B
MOV P0,#10011001B ; '4'



LCALL DELAY;


mov p1, #11000111B
MOV P0,#110010010B ; '5'


    LCALL DELAY;

  LJMP START

DELAY:
MOV R2, #6
DAVID: mov r1,#255
againn1:mov r0,#255
againn:djnz r0,againn
djnz r1,againn1
djnz r2,DAVID
 RET
END




תכנית שממלא בלוק נתונים בזיכרון נתונים חיצוני
   LJMP START;
ORG 200;
START:
MOV R5, #20

MOV DPTR, #0040H;
DAVID:
  MOV A, #0A3H;
MOVX @DPTR,A
  INC DPTR
  DJNZ R5, DAVID;                  
ALMOG:
LJMP ALMOG
 END






תכנית שממלאת שני בלוקי נתונים בזיכרון הנתונים החיצוני (בשני אזורים שונים)
   LJMP START;
ORG 200;
START:
MOV R5, #20

MOV DPTR, #0040H;
DAVID:
  MOV A, #0A3H;
MOVX @DPTR,A
  INC DPTR
  DJNZ R5, DAVID;                  

MOV R5, #32
 
mov dptr ,#00A0H
dani:
MOV A, #55;
MOVX @DPTR, A
INC DPTR;


  DJNZ R5, dani;

 
ALMOG:
LJMP ALMOG
 END







איך לכתוב תכנית באסמבלי שמייצרת שני בלוקי נתונים בזיכרון הנתונים החיצוני שדורסת בלוק נתונים אחד בבלוק נתונים אחר.

  1. להצביע על בלוק נתונים ראשון בעזרת המצביע של זיכרון הנתונים החיצוני DPTR, על ידי הכתובת.
  2. להעביר את הנתון  בכתובת ש-DPTR מצביע עליה, לאקומולטור.
  3. שמירה של המצביע בתוך הרגיסטרים R0, R1 (כאשר RO הוא DPH, ו- R1 הוא DPL)
  4. להצביע על בלוק הנתונים השני בעזרת המצביע של זיכרון הנתונים החיצוני DPTR, על ידי הכתובת.
  5. להעביר את הנתון בכתובת ש- DPTR מצביע עליה, לאקומולטור.
  6. לשמור את הכתובת של המצביע DPTR בתוך המחסנית (על ידי הפקודות PUSH)
  7. מכניסים לתוך הריגסטר R2  את מספר הפעמים שאנחנו רוצים להעביר מבלוק הנתונים הראשון לבלוק הנתונים השני (יש לקחת בחשבון כי העברה אחת כבר התבצעה).
  8. ניצור תווית כדי שנוכל לחזור אליה
  9. נוציא מתוך הרגיסטרים R1 R0 את הכתובת של בלוק הנתונים הראשון לתוך ה-DPTR.
  10. נעלה את ה DPTR באחד, על מנת שהמצביע שלנו יתקדם באחד (אם הוא הצביע על הראשון, הוא יצביע על השני, אם הוא הצביע על השני הוא יצביע על השלישי וכך הלאה).
  11. נשמור את הנתון שיש בתוך ה DPTR באקומולטור.
  12. נחזיר שוב את הכתובת ש- DPTR מצביע עליה לתוך הרגיסטרים R0 ו-R1.
  13. נשלוף מתוך המחסנית את הכתובת שמצביע על בלוק הנתונים השני אל תוך ה-DPTR
  14. נקדם את ה-DPTR באחד על מנת שנצביע על הכתובת הבאה בבלוק הנתונים בזיכרון הנתונים החיצוני.
  15. נעביר את הנתון שיש באקומולטור אל הכתובת שה-DPTR מצביע עליה.
  16. נשמור את הכתובת של המצביע DPTR לתוך הנמחסנית.
  17. אם R2 לא אפס, קפוץ לתווית (שורה מספר 8)


התכנית עצמה:

   LJMP START;
ORG 200;
START:
MOV R5, #20

MOV DPTR, #0040H;
DAVID:
  MOV A, #0A3H;
MOVX @DPTR,A
  INC DPTR
  DJNZ R5, DAVID;                  

MOV R5, #32
 
mov dptr ,#00A0H
dani:
MOV A, #55;
MOVX @DPTR, A
INC DPTR;


  DJNZ R5, dani;




 
MOV DPTR, #0040H;
MOVX A,@DPTR

MOV R0, DPH
MOV R1, DPL


MOV DPTR ,#00A0H
MOVX @DPTR , A

PUSH DPH
PUSH DPL


    MOV R2, #18
 ALMOG1:

MOV DPH ,R0
MOV DPL ,R1
INC DPTR



  MOVX A,@DPTR

 MOV R0, DPH
MOV R1, DPL



POP   DPL
POP DPH
 INC DPTR
MOVX @DPTR , A
PUSH DPH
PUSH DPL
DJNZ R2, ALMOG1

ALMOG:
LJMP ALMOG
 END









תכנית שמחליפה בין שני בלוקי נתונים בזיכרון הנתונים החיצוני
איך לכתוב את התכנית:
  1. להצביע על בלוק נתונים ראשון בעזרת המצביע של זיכרון הנתונים החיצוני DPTR, על ידי הכתובת.
  2. להעביר את הנתון  בכתובת ש-DPTR מצביע עליה, לאקומולטור.
  3. מהאקומולטור נשמור ב R3
  4. שמירה של המצביע בתוך הרגיסטרים R0, R1 (כאשר RO הוא DPH, ו- R1 הוא DPL)
  5. להצביע על בלוק הנתונים השני בעזרת המצביע של זיכרון הנתונים החיצוני DPTR, על ידי הכתובת.
  6. נשים את הנתון ש DPTR מצביע עליו לאקומולטור
  7. מהאקומולטור נשים את הנתון ב R4
  8. להעביר את R3 לתוך האקומולטור
  9. להעביר את הנתון מהאקומולטור לכתובת ש- DPTR מצביע עליה.
  10. לשמור את הכתובת של המצביע DPTR בתוך המחסנית (על ידי הפקודות PUSH)
  11. נעביר את R4 לאקומולטור
  12. נוציא מתוך הרגיסטרים את הכתובת שמצביע על זיכרון הנתונים החיצוני
  13. להעביר את האקומולטור לתוך  הכתובת  ש-DPTR מצביע עליה.
  14. מכניסים לתוך הריגסטר R2  את מספר הפעמים שאנחנו רוצים להעביר מבלוק הנתונים הראשון לבלוק הנתונים השני (יש לקחת בחשבון כי העברה אחת כבר התבצעה).
  15. ניצור תווית כדי שנוכל לחזור אליה
  16. נוציא מתוך הרגיסטרים R1 R0 את הכתובת של בלוק הנתונים הראשון לתוך ה-DPTR.
  17. נעלה את ה DPTR באחד, על מנת שהמצביע שלנו יתקדם באחד (אם הוא הצביע על הראשון, הוא יצביע על השני, אם הוא הצביע על השני הוא יצביע על השלישי וכך הלאה).
  18. נשמור את הנתון שיש בתוך ה DPTR באקומולטור.
  19. מהאקומולטור נשמור ב R3
  20. נחזיר שוב את הכתובת ש- DPTR מצביע עליה לתוך הרגיסטרים R0 ו-R1.
  21. נשלוף מתוך המחסנית את הכתובת שמצביע על בלוק הנתונים השני אל תוך ה-DPTR
  22. נקדם את ה-DPTR באחד על מנת שנצביע על הכתובת הבאה בבלוק הנתונים בזיכרון הנתונים החיצוני.
  23. נשים את הנתון ש DPTR מצביע עליו לאקומולטור
  24. מהאקומולטור נשים את הנתון ב R4
  25. להעביר את R3  לתוך האקומולטור
  26. נעביר את הנתון שיש באקומולטור אל הכתובת שה-DPTR מצביע עליה.
  27. נשמור את הכתובת של המצביע DPTR לתוך המחסנית.
  28. נעביר את R4 לאקומולטור
  29. נוצא מתוך הרגיסטרים את הכתובת שמצביע עליה זיכרון הנתונים החיצוני
  30. להעביר את האקומולטור לתוך הכתובת ש-DPTR מצביע עליה.
  31. אם R2 לא אפס, קפוץ לתווית (שורה מספר 15)

התכנית עצמה:

   LJMP START;
ORG 200;
START:
MOV R5, #20

MOV DPTR, #0040H;
DAVID:
  MOV A, #0A3H;
MOVX @DPTR,A
  INC DPTR
  DJNZ R5, DAVID;                  

MOV R5, #32
 
mov dptr ,#00A0H
dani:
MOV A, #55;
MOVX @DPTR, A
INC DPTR;


  DJNZ R5, dani;




 
MOV DPTR, #0040H;
MOVX A,@DPTR

 mov R3, A //NEW

MOV R0, DPH
MOV R1, DPL


MOV DPTR ,#00A0H

 MOVX A, @DPTR //NEW
 MOV R4 ,A //NEW
 MOV A, R3 // NEW

MOVX @DPTR , A

PUSH DPH
PUSH DPL

MOV A, R4 //new
MOV DPH ,R0  // new
MOV DPL ,R1 // new
movx @dptr , A // new

    MOV R2, #18
 ALMOG1:



MOV DPH ,R0
MOV DPL ,R1
INC DPTR



  MOVX A,@DPTR
mov R3, A //NEW

 MOV R0, DPH
MOV R1, DPL



POP   DPL
POP DPH
 INC DPTR
                    MOVX A,@DPTR //new
mov r4 ,A //new
mov A, r3 //new

MOVX @DPTR , A
PUSH DPH
PUSH DPL

mov A , r4 // new
  MOV DPH ,R0  // new
MOV DPL ,R1 // new
movx @dptr, A // new

DJNZ R2, ALMOG1

ALMOG:
LJMP ALMOG
 END









כספת באסמבלי מיקרו בקר איך לכתוב תכנית מלאה תכנית של כספת פקודות הסבר





     SETB P1.5

MOV R3,#0; SOFER
MOV R7,#0
MOV R6,#0; GOOD


MOV R1,#0
MOV 50,#00;
LJMP START

  SETB P1.5

MOV R3,#0; SOFER
MOV R7,#0
MOV R6,#0; GOOD
ORG 200

START:







CJNE R3, #1,CC
CJNE R7,#40, MAINN
  INC R6
  MOV R7,#0
  LJMP MAINN
CC:
CJNE R3, #2,DD
    CJNE R7,#60,MAINN
  INC R6
  MOV R7,#0
LJMP MAINN

DD:

CJNE R3, #3,DDD

  CJNE R7,#20, MAINN
  INC R6
  MOV R7,#0
LJMP MAINN
  DDD:


 CJNE R3, #4,FF
  CJNE R7,#40, STUCKING
  INC R6
  CJNE R6,#4, STUCKING
MOV P2, #000000000B
SJMP $
  STUCKING:
CLR P1.5
 LCALL DELAY
  LCALL DELAY
   LCALL DELAY
  LCALL DELAY
  LCALL DELAY
  LCALL DELAY
   LCALL DELAY
  LCALL DELAY
  LCALL DELAY
  LCALL DELAY
   LCALL DELAY
  LCALL DELAY
  LCALL DELAY
  LCALL DELAY
   LCALL DELAY
  LCALL DELAY
  SETB P1.5
  INC R1
  CJNE R1,#3,RRR
CLR P1.5
  SJMP $

 
  RRR:
 
MOV R3,#0; SOFER
MOV R7,#0
MOV R6,#0; GOOD  

FF:  
LJMP MAINN



MAINN:

JNB P3.2, KAFTOR2


JNB P3.3, KAFTOR3


JNB P3.4, KAFTOR4

JNB P3.5, KAFTOR5
   
JNB P3.6, KAFTOR6

JNB P3.7, KAFTOR7


  LJMP START



KAFTOR2:
CLR P1.5
 LCALL DELAY
  LCALL DELAY
   SETB P1.5
   INC R3
     LCALL DELAY
   LCALL DELAY
   LCALL DELAY
  MOV R7,#20
 LJMP START
KAFTOR3:
CLR P1.5
 LCALL DELAY
  LCALL DELAY
   SETB P1.5
   INC R3
     LCALL DELAY
   LCALL DELAY
   LCALL DELAY
 LJMP START
KAFTOR4:
CLR P1.5
 LCALL DELAY
  LCALL DELAY
   SETB P1.5
   INC R3
     LCALL DELAY
   LCALL DELAY
   LCALL DELAY
  MOV R7,#40
 LJMP START
KAFTOR5:
CLR P1.5
 LCALL DELAY
  LCALL DELAY
   SETB P1.5
   INC R3
     LCALL DELAY
   LCALL DELAY
   LCALL DELAY
 LJMP START
KAFTOR6:
CLR P1.5
 LCALL DELAY
  LCALL DELAY
   SETB P1.5
   INC R3
     LCALL DELAY
   LCALL DELAY
   LCALL DELAY
  MOV R7,#60
 LJMP START
KAFTOR7:
CLR P1.5
 LCALL DELAY
  LCALL DELAY
   SETB P1.5
   INC R3
     LCALL DELAY
   LCALL DELAY
   LCALL DELAY
 LJMP START





  DELAY:
MOV R4,#255
 DODO: MOV R5,#100
AVI: DJNZ R5, AVI
DJNZ R4, DODO

RET


SJMP $
END



אין תגובות:

הוסף רשומת תגובה