ใครเขียน ASM ช่วยหน่อยครับ
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: ใครเขียน ASM ช่วยหน่อยครับ  (อ่าน 3006 ครั้ง)
Neung_cmi
member
*

คะแนน3
ออฟไลน์ ออฟไลน์

กระทู้: 79


Neung_cmi@hotmail.com
« เมื่อ: ตุลาคม 13, 2007, 10:31:27 pm »

ตอนนี้ผมลองทำสวิต 6 ช่องแบบ กดปิด กดเปิด ใช้ mcs-51 ถ้าผมจะต่อ sw เข้ากับ P3.7 ถ้ากดค้างประมาณ 4 วินาทีแล้วจะทำให้ p1.7 - p1.2 ปิดหมดจะเขียนอย่างไงครับ


      OUT1      BIT   P1.7
      OUT2      BIT   P1.6
      OUT3      BIT   P1.5
      OUT4      BIT   P1.4
      OUT5      BIT   P1.3
      OUT6      BIT   P1.2
      STORBE      BIT   P1.1
      BUZER      BIT   P1.0
      SW1      BIT   P3.0
      SW2      BIT   P3.1
      SW3      BIT    P3.2
      SW4      BIT    P3.3
      SW5      BIT    P3.4
      SW6      BIT    P3.5

      ORG      0000H
START:      MOV      P3,#0FFH
      MOV      P1,#00H
      
SCAN:      JNB      SW1,RELAY1
      JNB      SW2,RELAY2
      JNB      SW3,RELAY3
      JNB      SW4,RELAY4
      JNB      SW5,RELAY5
      JNB      SW6,RELAY6
      SJMP      SCAN
      
RELAY1:      ACALL      DELAY_D
      JB      SW1,SCAN
      ACALL      STORBE_SIG
      ACALL      BEEP
      JNB      SW1,$
      CPL      OUT1
      SJMP      SCAN
RELAY2:      ACALL      DELAY_D
      JB      SW2,SCAN
      ACALL      STORBE_SIG
      ACALL      BEEP
      JNB      SW2,$
      CPL      OUT2
      SJMP      SCAN
RELAY3:      ACALL      DELAY_D
      JB      SW3,SCAN
      ACALL      STORBE_SIG
      ACALL      BEEP
      JNB      SW3,$
      CPL      OUT3
      SJMP      SCAN
RELAY4:      ACALL      DELAY_D
      JB      SW4,SCAN
      ACALL      STORBE_SIG
      ACALL      BEEP
      JNB      SW4,$
      CPL      OUT4
      SJMP      SCAN
RELAY5:      ACALL      DELAY_D
      JB      SW5,SCAN
      ACALL      STORBE_SIG
      ACALL      BEEP
      JNB      SW5,$
      CPL      OUT5
      SJMP      SCAN
RELAY6:      ACALL      DELAY_D
      JB      SW6,SCAN
      ACALL      STORBE_SIG
      ACALL      BEEP
      JNB      SW6,$
      CPL      OUT6
      SJMP      SCAN

BEEP:      MOV      R5,#50H
BEEP1:      MOV      R6,#20H
      MOV      R7,#10H
DEC_1:      DEC      R6
      NOP
      NOP
      NOP
      DJNZ      R6,DEC_1
      MOV      R6,#20H
      CPL      BUZER
DEC_2:      DEC      R7
      NOP
      NOP
      NOP
      DJNZ      R7,DEC_2
      MOV      R7,#10H
      CPL      BUZER
      DJNZ      R5,BEEP1
      RET

STORBE_SIG:   SETB      STORBE
      ACALL      DELAY
      CLR      STORBE
      RET
         
DELAY_D:   MOV      R7,0FFH
      DJNZ      R0,$
      RET
         
DELAY:      MOV      R1,#0FFH
DELAY1:      MOV      R2,#0FFH
      DJNZ      R2,$
      DJNZ      R1,DELAY1
      RET   
      END


บันทึกการเข้า

JUB
Full Member
member
**

คะแนน81
ออฟไลน์ ออฟไลน์

กระทู้: 1157



« ตอบ #1 เมื่อ: ตุลาคม 18, 2007, 10:14:49 am »

ใช้ interrup น่าจะได้นะครับ ยกตัวอย่างเช่น เมื่อเกิด interrup ขึ้นก็หน่วงเวลาไว้ 4 วินาทีจากนั้นก็ตรวจ SW ว่ายังถูกกดอยู่หรือไม่ถ้ายังกดอยู่ก็สั่ง
เคลียร์ port ทั้งหมดได้เลย port ที่ทำไห้เกิด interrup ดูได้จาก datasheet ครับ Cool
บันทึกการเข้า
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: