พิมพ์หน้านี้ - RFID กับ MCS-51 ขอความช่วยเหลือครับ

LSVคลังสมองออนไลน์ "ปีที่14"

ห้องโครงงาน - D.I.Y.- เทคโนโลยี่ => ►ถาม-ตอบโครงงาน => ข้อความที่เริ่มโดย: RANGSAN007 ที่ กุมภาพันธ์ 16, 2011, 04:58:30 pm



หัวข้อ: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ กุมภาพันธ์ 16, 2011, 04:58:30 pm
คือผมจะทำโปรเจ็คจบ เกี่ยวกับ RFID คือ  ผมจะใช้ โมดูล ID-20 RFID Reader 125 Khz  เป็นตัวอ่านการ์ด ซึ่งจะนำไปใช้เพียงขาเดียวคือขา 9 ซึ่งขานี้จะส่งรหัสประจำแต่ละบัตรออกมาเป็น ASCII แล้วจะเอาขาที่ 9 ไปเข้า mcs-51 ยังไงครับ  เพื่อให้ mcs-51 สั้งงานในเงื่อนใขต่างๆ ที่เราต้องการ                 เช่น การ์ดใบที่ 1 สั่ง on  P0.0 การ์ก ใบที่ 2 สั่ง ON P0.1 ประมาณนี้ครับ     (mcs-51 = 89v51rd2 ใช้ Assembly ครับ )   ขอความช่วยเหลือด้วยครับ  thank2   thank2
(http://wara.com/userfiles/image/RFID1/5.jpg)


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: JUB ที่ กุมภาพันธ์ 16, 2011, 10:56:46 pm
ในส่วนของ program ไม่ยากครับถ้าเป็นแบบที่ว่ามา แต่ที่ว่าขา9มันส่ง
ascii ออกมาน่ะมังส่งมาแบบไหน baud เท่าไร ส่งมากี่ byte ถ้าไม่รู้
ก็ไปต่อไม่ได้ครับ...  :)


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ กุมภาพันธ์ 17, 2011, 12:36:17 am
เพิ่มเติมครับ baud 9600 (http://wara.com/userfiles/image/RFID1/2.jpg) (http://wara.com/userfiles/image/RFID1/6.jpg)   thank2 thank2 thank2


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ กุมภาพันธ์ 17, 2011, 12:44:25 am
(http://wara.com/userfiles/image/RFID1/4.jpg)
(http://wara.com/userfiles/image/RFID1/7.jpg)
ลองการ์ดหลายใบ
(http://wara.com/userfiles/image/RFID1/3.jpg)


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: JUB ที่ กุมภาพันธ์ 17, 2011, 10:47:49 am
สรุปให้ผมทีว่า.... card ใบแรก กับ ใบที่สอง ข้อมูลเป็นอะไรบ้าง ต้องประมวลผลยังไง
เอามาให้ผมดูแบบนี้...ผมแนะนำยากครับ ผมไม่มีอุปกรณ์ลอง...

แต่ผมสรุปว่า มีข้อมูล 14 byte
stx = 1 byte
data = 10 byte
check sum = 2 byte
cr+lf = 2 byte
etx = 1 byte

ถูกมั๊ยครับ......

เอาข้อมูลที่รับได้ไปคำนวนได้เลย หากไม่ต้องการ คำนวณ check sum
แต่ถ้าต้องการ check sum มันต้องเอา ascii ไปแปลงเป็น hex ก่อน แล้วค่อยไป ex-or กันอีกที
ปัญหาคือคุณรุ้และเคยเขียน asm มาบ้างหรือป่าว...???

 :)


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ กุมภาพันธ์ 18, 2011, 05:12:47 pm
ตอนนี้ ผมเก็บข้อมูลเข้าไปที่ A แต่ไม่รู้จะเปรียบเทียบข้อมูลการ์ดยังไง ผมใช้คำสั่ง CJNE เป็นตัวเปรัยบเทียบ (ไม่รู้ผมเข้าใจถูกหรือป่าวครับหรือสามารถใช้คาสั่งอื่นเพื่อเปรียบเทียบได้)

      START:               MOV TMOD,#20H
      MOV SCON,#50H
      MOV TH1,#0FBH                                  ;9600
      SETB TR1
      CLR RI
      MOV P0,#00H                                       ; OFF P0
   LOOP1:   JNB RI,$
      MOV A,SBUF                                          ;เก็บค่าที่อ่านได้จากการ์ดเข้าไปที่ A
      CLR RI
         
                                 CJNE    A,.................,LOOP2                <<ต่อมาไม่รู้จะเอาค่าใน A มาเปรียบเทียบข้อมูลการ์ดใบที่ 1 ได้ไงครับ  เช่นค่าที่ออกมาจากบัตร คือ 1200A8DA2F4F
                                 SETB    P0.0                                        ; ON P0.0   เปิดหลอดไฟหลอดที่ 1

               LOOP2:      CJNE    A,.................,LOOP1                 ;เปรียบเทียบ ใบที่ 2
                                 SETB    P0.1         
..
..
..
..


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ กุมภาพันธ์ 18, 2011, 06:38:53 pm
คือตอนนี้ ที่ต้องการคือ   เราเขียนโปรแกรมเก็บ ID  เข้าไปในส่วน source code แล้วเมื่อมีการ์ดมาก็อ่านแล้วเอา ID ที่อ่านได้ ไปเช็ค กับ ID ใน source code ที่เราเขียนไว้แล้ว ว่าตรงกันหรือไม่ ครับ thank2 thank2 thank2 thank2 thank2


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ กุมภาพันธ์ 18, 2011, 06:50:58 pm
อ้างอิงข้อมูลจาก http://wara.com/article-747.html (http://wara.com/article-747.html)


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: JUB ที่ กุมภาพันธ์ 18, 2011, 07:04:22 pm
ให้เก็บลง ram แบบ arry ครับ จองพื้นที่ไว้ 14 byte ตามความยาวข้อมูล แล้วใช้ index pointer R0 ในการเปรียบเทียบ
ข้อมูลกับค่าตัวแปรที่เรากำหนดไว้ เช่น

โค๊ด:
start_point_buffer      equ      040h


loop:
mov r0 , #start_point_buffer
acall 232_receive                        ;--- receive routine 1 byte return data to acc
mov @r0 , a
inc r0
cjne r0 , #start_point_buffer+14 , loop


chk_data_rec:

mov r0 , #start_point_buffer
cjne @r0 , #ค่าของ stx , start_byte_error
mov r0 , #start_point_buffer
cjne @r0 , #ค่าของ card1 data1 , chk_card2
inc r0
cjne @r0 , #ค่าของ card1 data2 , chk_card2
inc r0
cjne @r0 , #ค่าของ card1 data3 , chk_card2
;
;
;
;
inc r0
cjne @r0 , #ค่าของ card1 data10 , chk_card2
inc r0
cjne @r0 , #ค่าของ chksum1 , chk_card2
nc r0
cjne @r0 , #ค่าของ chksum2 , chk_card2
nc r0
cjne @r0 , #ค่าของ etx , end_byte_error

;all data card 1 ok

setb p1.0
ajmp loop



chk_card2:


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ กุมภาพันธ์ 18, 2011, 09:32:11 pm
ขอบคุณมากครับ  แต่ผมติดปัญหาตรงที่ ว่า  เวลา เอาการ์ดใบที่ไม่ได้คีย์ข้อมูลไว้มาทาบที่เครื่องอ่าน  ก่อนที่จะเอาใบที่มีการคีย์ไว้ มาทาบ  เวลาเอาใบที่คีย์ข้อมูลไว้มาทาบโปรแกรมจะไม่ยอมรับการ์ดใบนี้  คือต้องทาบซ้ำ ๆ ไปประมาณ 5-8 ครั้ง ถึงจะได้  thank2   แต่ถ้าเอาใบที่คีย์ข้อมูลไว้แล้วมาทาบเป็นใบแรกก็จะทำงานปกติ       หรือเวลาเช็ค data ที่ตำแหน่งต่าง แล้วเกิด error  ผมต้องทำอะไรก่อนที่จะทำการอ่านครั้งใหม่หรือป่าวครับ หรือผมต้องคืนค่าอะไรอีกหรือป่าวครับ  thank2 thank2 thank2 thank2


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: JUB ที่ กุมภาพันธ์ 18, 2011, 09:52:09 pm
มัน error ก็ไม่ทำงานไงครับ กลับเข้า loop ใหม่ไม่มีอะไรเกิดขึ้น...
ผมก็ งงๆ นะ ปัญหาหามันเกิดจาก ตัว module rfid หรือป่าว
เอา data ตอน error มาให้ดูหน่อย...

แล้ว card ที่คีกับไม่คี ท่านจะเอามาลองทำไมถ้ามันเกิดปัญหา..... ???
มันเกิน concept งานที่บอกไว้แล้วนะครับ....


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ กุมภาพันธ์ 18, 2011, 10:05:05 pm
โค๊ด:
		;##############################
;##############################
                       CPU "8051.TBL"
HOF "INT8"
ORG 0

start_point_buffer:      EQU      040H

START: MOV TMOD,#20H
MOV SCON,#50H
MOV TH1,#0FBH
SETB TR1
CLR RI
START2: MOV R0,#start_point_buffer

LOOP1: JNB RI,$
MOV A,SBUF
CLR RI

LOOP2: MOV @R0,A
INC R0
CJNE R0,#start_point_buffer+14,LOOP1


CHK_CARD1: MOV R0,#start_point_buffer

CJNE @R0,#02H,START2 ;STX=02H
MOV R0,#start_point_buffer

INC R0
CJNE @R0,#30H,START ;0

INC R0
CJNE @R0,#39H,START ;9

INC R0
CJNE @R0,#30H,START ;0

INC R0
CJNE @R0,#30H,START ;0

INC R0
CJNE @R0,#38H,START ;8

INC R0
CJNE @R0,#41H,START ;A

INC R0
CJNE @R0,#38H,START ;8

INC R0
CJNE @R0,#36H,START ;6

INC R0
CJNE @R0,#33H,START ;3

INC R0
CJNE @R0,#31H,START ;1

INC R0
CJNE @R0,#33H,START ;3

INC R0
CJNE @R0,#34H,START ;4

CLR P0.0
ACALL DELAY
MOV P0,#0FFH

SJMP START




;####END MIAN####
DELAY: MOV R2,#200
DEL1: MOV R3,#80
DEL2: MOV R4,#80
DJNZ R4,$
DJNZ R3,DEL2
DJNZ R2,DEL1
RET



หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ กุมภาพันธ์ 18, 2011, 10:18:23 pm
ผมไม่ได้เช็คซัม  ข้อมูล STX = 20H ข้อมูลการ์ดใบแรก 09008A863134   ใบที่ 2 คือ 23000A46523D

โค๊ด:
		;##############################
;##############################
                       CPU "8051.TBL"
HOF "INT8"
ORG 0

start_point_buffer:      EQU      040H

START: MOV TMOD,#20H
MOV SCON,#50H
MOV TH1,#0FBH
SETB TR1
CLR RI
START2: MOV R0,#start_point_buffer

LOOP1: JNB RI,$
MOV A,SBUF
CLR RI

LOOP2: MOV @R0,A
INC R0
CJNE R0,#start_point_buffer+14,LOOP1


CHK_CARD1: MOV R0,#start_point_buffer

CJNE @R0,#02H,START2 ;STX=02H
MOV R0,#start_point_buffer

INC R0
CJNE @R0,#30H,CHK_CARD2 ;0

INC R0
CJNE @R0,#39H,CHK_CARD2 ;9

INC R0
CJNE @R0,#30H,CHK_CARD2 ;0

INC R0
CJNE @R0,#30H,CHK_CARD2 ;0

INC R0
CJNE @R0,#38H,CHK_CARD2 ;8

INC R0
CJNE @R0,#41H,CHK_CARD2 ;A

INC R0
CJNE @R0,#38H,CHK_CARD2 ;8

INC R0
CJNE @R0,#36H,CHK_CARD2 ;6

INC R0
CJNE @R0,#33H,CHK_CARD2 ;3

INC R0
CJNE @R0,#31H,CHK_CARD2 ;1

INC R0
CJNE @R0,#33H,CHK_CARD2 ;3

INC R0
CJNE @R0,#34H,CHK_CARD2 ;4

CLR P0.0
ACALL DELAY
MOV P0,#0FFH
SJMP START

CHK_CARD2: MOV R0,#start_point_buffer

CJNE @R0,#02H,START2 ;STX=02H
MOV R0,#start_point_buffer

INC R0
CJNE @R0,#32H,START ;2

INC R0
CJNE @R0,#33H,START ;3

INC R0
CJNE @R0,#30H,START ;0

INC R0
CJNE @R0,#30H,START ;0

INC R0
CJNE @R0,#30H,START ;0

INC R0
CJNE @R0,#41H,START ;A

INC R0
CJNE @R0,#34H,START ;4

INC R0
CJNE @R0,#36H,START11 ;6

INC R0
CJNE @R0,#35H,START11 ;5

INC R0
CJNE @R0,#32H,START11 ;2

INC R0
CJNE @R0,#33H,START11 ;3

INC R0
CJNE @R0,#44H,START11 ;D

CLR P0.1
ACALL DELAY
MOV P0,#0FFH


AJMP START

START11: AJMP START


;####END MIAN####
DELAY: MOV R2,#200
DEL1: MOV R3,#80
DEL2: MOV R4,#80
DJNZ R4,$
DJNZ R3,DEL2
DJNZ R2,DEL1
RET



หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: JUB ที่ กุมภาพันธ์ 18, 2011, 10:43:11 pm
แล้วตอนนี้ปัญหามีอะไรบ้างครับ...  :)


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ กุมภาพันธ์ 18, 2011, 11:02:18 pm
ตอนนี้  ถ้าคีย์ทุกใบแล้วก็ไม่น่ามีปัญหาอะไรครับ  แต่  ไม่รู้ว่าถ้า คีย์ 24 ใบไม่รู้จะได้ป่าว  แค่ใบเดียวกินไป 30 บรรทัด ถ้า 24 ใบก็เยอะพอสมควร  พอจะมีแบบสั้นๆ หรือป่าว  แต่ถ้าไม่มีก็ไม่เป็นไรครับ    แนวคิดผมผมคิดว่าถ้า data ตำแหน่งไหนเหมือนกันก็ไม่ต้อง เช็คข้ามไปเลย ไม่รู้จะได้ป่าว       แค่นี้ก็น่าจะพอครับ  งานต่อไปก็คือเขียน PLC ครับ    ขอมคุณท่าน JUB  มากๆครับ  thank2 wav!! thank2 :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D thank2


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: JUB ที่ กุมภาพันธ์ 18, 2011, 11:27:41 pm
จะใช้กี่ใบก็ต้องเขียนแบบนี้ครับ ถ้าจะให้สั้นๆ
ต้องใช้วิธีเปิดตารางครับ คือ ทำตารางข้อมูลของ card แต่ละใบไว้
แล้วเวลาตรวจสอบ card ให้เขี่ยนโปรแกรมย่อยขึ้นมา
เพื่อนำค่าจาก buffer มาเทียบกับค่าในตารางที่อยู่ใน programmory
ที่เราได้ทำไว้ เวลาแก้ไขก็ทำได้ง่ายด้วยครับ.... คงพอมองภาพออกนะ....  :)

อันนี้ผมแก้ bug ให้นิดหน่อย
โค๊ด:
;##############################
;##############################

START_POINT_BUFFER      EQU      040H



CSEG AT 0000H
AJMP INITIAL


CSEG AT 0050H
INITIAL: MOV SP,#060H
MOV TMOD,#20H
MOV SCON,#50H
MOV TH1,#0FBH
SETB TR1

;//******************//;
;//* WAIT RFID DATA *//;
;//******************//;
WAIT_DATA: MOV R0,#START_POINT_BUFFER
WAIT_DATA1: CLR RI
JNB RI,$
MOV @R0,SBUF
INC R0
CJNE R0,#START_POINT_BUFFER+14,WAIT_DATA1

;//****************//;
;//* CHECK CARD 1 *//;
;//****************//;
CHK_CARD1: MOV R0,#START_POINT_BUFFER
CJNE @R0,#02H,START_TX_ERROR ;STX=02H

INC R0
CJNE @R0,#30H,CHK_CARD2 ;0

INC R0
CJNE @R0,#39H,CHK_CARD2 ;9

INC R0
CJNE @R0,#30H,CHK_CARD2 ;0

INC R0
CJNE @R0,#30H,CHK_CARD2 ;0

INC R0
CJNE @R0,#38H,CHK_CARD2 ;8

INC R0
CJNE @R0,#41H,CHK_CARD2 ;A

INC R0
CJNE @R0,#38H,CHK_CARD2 ;8

INC R0
CJNE @R0,#36H,CHK_CARD2 ;6

INC R0
CJNE @R0,#33H,CHK_CARD2 ;3

INC R0
CJNE @R0,#31H,CHK_CARD2 ;1

INC R0
CJNE @R0,#33H,CHK_CARD2 ;3

INC R0
CJNE @R0,#34H,CHK_CARD2 ;4

CLR P1.0
ACALL DELAY
SETB P1.0
AJMP WAIT_DATA

START_TX_ERROR: ACALL CLR_BUFFER
AJMP WAIT_DATA

;//****************//;
;//* CHECK CARD 2 *//;
;//****************//;
CHK_CARD2: MOV R0,#START_POINT_BUFFER+1
CJNE @R0,#32H,OUT_OF_DATA ;2

INC R0
CJNE @R0,#33H,OUT_OF_DATA ;3

INC R0
CJNE @R0,#30H,OUT_OF_DATA ;0

INC R0
CJNE @R0,#30H,OUT_OF_DATA ;0

INC R0
CJNE @R0,#30H,OUT_OF_DATA ;0

INC R0
CJNE @R0,#41H,OUT_OF_DATA ;A

INC R0
CJNE @R0,#34H,OUT_OF_DATA ;4

INC R0
CJNE @R0,#36H,OUT_OF_DATA ;6

INC R0
CJNE @R0,#35H,OUT_OF_DATA ;5

INC R0
CJNE @R0,#32H,OUT_OF_DATA ;2

INC R0
CJNE @R0,#33H,OUT_OF_DATA ;3

INC R0
CJNE @R0,#44H,OUT_OF_DATA ;D

CLR P1.1
ACALL DELAY
SETB P1.1
AJMP WAIT_DATA

OUT_OF_DATA: ACALL CLR_BUFFER
AJMP WAIT_DATA

;//***** CLR RAM BUFFER *****//;
CLR_BUFFER: MOV R0,#START_POINT_BUFFER
CLR A
CLR_BUFFER1: MOV @R0,A
INC R0
CJNE R0,#START_POINT_BUFFER+14,CLR_BUFFER1
RET

;//***** DELAY ROUTINE *****//;
DELAY: MOV R2,#200
DEL1: MOV R3,#80
DEL2: MOV R4,#80
DJNZ R4,$
DJNZ R3,DEL2
DJNZ R2,DEL1
RET

END


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ กุมภาพันธ์ 19, 2011, 12:34:31 pm
 thank2 ครับ ขอบคุณมากครับ thank2


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ เมษายน 01, 2011, 11:51:48 pm
ขอความช่วยเหลืออีกรอบครับ  คือตอนนี้อาจารย์ บอกว่า โปรเจ็คผมมันตายตัวไป ก็คือมันไม่สามารถให้ผู้ใช้เปลี่ยนการ์ดเองได้ในกรณที่การ์ดใบเดิมหายไป  อาจารย์ก็เลยแนะนำว่าให้แก้ใขจุดนี้
ผมก็เลยมีแนวคิดว่าจะใช้ EEPROM ในการเก็บข้อมูลรหัสบัตร 24 ใบ (อาจจะใช้ Master การ์ด ในการสั่งเปลี่ยนบัตรใบใหม่ หรือ ใช้ สวิตช์กด เพื่อสั่งเปลี่ยนบัตร )  เรื่องการใช้งาน EEPROM ผมไม่เคยเรียนมาเลยคือไม่รู้อะไรเลย
ตอนนี้ผมใช้ p0 กับ p2 แสดง 7-Segment  หมายเลขบัตรแต่ละใบ 1-24 และ p 1 ใช้ควบคุม plc และ p 3.0 เป็นขารับข้อมูลจากตัวอ่าน RFID  ก็จะเหลือแค่ p3.1-3.7 ที่ใช้ได้
ขอคำแนะนำด้วยครับ จนจริงๆครับ thank2 thank2
โค๊ด:
		;##############################
;#   AUTOMATIC CAR PARKING    #
;##############################
                        CPU "8051.TBL"
HOF "INT8"
ORG 0

START_POINT_BUFFER:      EQU      040H

INITIAL: MOV SP,#060H
MOV TMOD,#20H
MOV SCON,#50H
MOV TH1,#0FBH
SETB TR1

MOV P0,#0C0H
MOV P2,#0C0H
MOV P1,#0FFH

;//******************//;
;//* WAIT RFID DATA *//;
;//******************//;
WAIT_DATA: MOV R0,#START_POINT_BUFFER
WAIT_DATA1: CLR RI
JNB RI,$
MOV @R0,SBUF
INC R0
CJNE R0,#START_POINT_BUFFER+14,WAIT_DATA1
;//******************//;
;//*   CHECK CARD 1 *//;
;//******************//;
CHK_CARD1: MOV R0,#START_POINT_BUFFER
CJNE @R0,#02H,START_TX_ERROR ;STX=02H
MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD2 ;2
INC R0
CJNE @R0,#41H,CHK_CARD2 ;A
INC R0
CJNE @R0,#30H,CHK_CARD2 ;0
INC R0
CJNE @R0,#30H,CHK_CARD2 ;0
INC R0
CJNE @R0,#39H,CHK_CARD2 ;9
INC R0
CJNE @R0,#41H,CHK_CARD2 ;A
INC R0
CJNE @R0,#46H,CHK_CARD2 ;F
INC R0
CJNE @R0,#39H,CHK_CARD2 ;9
INC R0
CJNE @R0,#41H,CHK_CARD2 ;A
INC R0
CJNE @R0,#46H,CHK_CARD2 ;F
INC R0
CJNE @R0,#45H,CHK_CARD2 ;E
INC R0
CJNE @R0,#36H,CHK_CARD2 ;6
MOV P0,#0F9H
MOV P1,#0FEH
ACALL DELAY
MOV P0,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
START_TX_ERROR: ACALL CLR_BUFFER
AJMP WAIT_DATA
;//******************//;
;//*   CHECK CARD 2 *//;
;//******************//;
CHK_CARD2: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD3 ;2
INC R0
CJNE @R0,#41H,CHK_CARD3 ;A
INC R0
CJNE @R0,#30H,CHK_CARD3 ;0
INC R0
CJNE @R0,#30H,CHK_CARD3 ;0
INC R0
CJNE @R0,#39H,CHK_CARD3 ;9
INC R0
CJNE @R0,#41H,CHK_CARD3 ;A
INC R0
CJNE @R0,#46H,CHK_CARD3 ;F
INC R0
CJNE @R0,#41H,CHK_CARD3 ;A
INC R0
CJNE @R0,#39H,CHK_CARD3 ;9
INC R0
CJNE @R0,#33H,CHK_CARD3 ;3
INC R0
CJNE @R0,#44H,CHK_CARD3 ;D
INC R0
CJNE @R0,#39H,CHK_CARD3 ;9
MOV P0,#0A4H
MOV P1,#0FDH
ACALL DELAY
MOV P0,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
  ;//******************//;
;//*   CHECK CARD 3 *//;
;//******************//;
CHK_CARD3: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD4 ;2
INC R0
CJNE @R0,#41H,CHK_CARD4 ;A
INC R0
CJNE @R0,#30H,CHK_CARD4 ;0
INC R0
CJNE @R0,#30H,CHK_CARD4 ;0
INC R0
CJNE @R0,#39H,CHK_CARD4 ;9
INC R0
CJNE @R0,#44H,CHK_CARD4 ;D
INC R0
CJNE @R0,#46H,CHK_CARD4 ;F
INC R0
CJNE @R0,#44H,CHK_CARD4 ;D
INC R0
CJNE @R0,#42H,CHK_CARD4 ;B
INC R0
CJNE @R0,#33H,CHK_CARD4 ;3
INC R0
CJNE @R0,#46H,CHK_CARD4 ;F
INC R0
CJNE @R0,#39H,CHK_CARD4 ;9
MOV P0,#0B0H
MOV P1,#0FCH
ACALL DELAY
MOV P0,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
;//******************//;
;//*   CHECK CARD 4 *//;
;//******************//;
CHK_CARD4: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD5 ;2
INC R0
CJNE @R0,#41H,CHK_CARD5 ;A
INC R0
CJNE @R0,#30H,CHK_CARD5 ;0
INC R0
CJNE @R0,#30H,CHK_CARD5 ;0
INC R0
CJNE @R0,#39H,CHK_CARD5 ;9
INC R0
CJNE @R0,#44H,CHK_CARD5 ;D
INC R0
CJNE @R0,#45H,CHK_CARD5 ;E
INC R0
CJNE @R0,#39H,CHK_CARD5 ;9
INC R0
CJNE @R0,#32H,CHK_CARD5 ;2
INC R0
CJNE @R0,#42H,CHK_CARD5 ;B
INC R0
CJNE @R0,#37H,CHK_CARD5 ;7
INC R0
CJNE @R0,#35H,CHK_CARD5 ;5
MOV P0,#99H
MOV P1,#0FBH
ACALL DELAY
MOV P0,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
;//******************//;
;//*   CHECK CARD 5 *//;
;//******************//;
CHK_CARD5: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD6 ;2
INC R0
CJNE @R0,#41H,CHK_CARD6 ;A
INC R0
CJNE @R0,#30H,CHK_CARD6 ;0
INC R0
CJNE @R0,#30H,CHK_CARD6 ;0
INC R0
CJNE @R0,#39H,CHK_CARD6 ;9
INC R0
CJNE @R0,#44H,CHK_CARD6 ;D
INC R0
CJNE @R0,#46H,CHK_CARD6 ;F
INC R0
CJNE @R0,#44H,CHK_CARD6 ;D
INC R0
CJNE @R0,#43H,CHK_CARD6 ;C
INC R0
CJNE @R0,#44H,CHK_CARD6 ;D
INC R0
CJNE @R0,#38H,CHK_CARD6 ;8
INC R0
CJNE @R0,#37H,CHK_CARD6 ;7
MOV P0,#92H
MOV P1,#0FAH
ACALL DELAY
MOV P0,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
;//******************//;
;//*   CHECK CARD 6 *//;
;//******************//;
CHK_CARD6: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD7 ;2
INC R0
CJNE @R0,#41H,CHK_CARD7 ;A
INC R0
CJNE @R0,#30H,CHK_CARD7 ;0
INC R0
CJNE @R0,#30H,CHK_CARD7 ;0
INC R0
CJNE @R0,#39H,CHK_CARD7 ;9
INC R0
CJNE @R0,#44H,CHK_CARD7 ;D
INC R0
CJNE @R0,#45H,CHK_CARD7 ;E
INC R0
CJNE @R0,#39H,CHK_CARD7 ;9
INC R0
CJNE @R0,#46H,CHK_CARD7 ;F
INC R0
CJNE @R0,#34H,CHK_CARD7 ;4
INC R0
CJNE @R0,#41H,CHK_CARD7 ;A
INC R0
CJNE @R0,#41H,CHK_CARD7 ;A
MOV P0,#82H
MOV P1,#0F9H
ACALL DELAY
MOV P0,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
;//******************//;
;//*   CHECK CARD 7 *//;
;//******************//;
CHK_CARD7: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD8 ;2
INC R0
CJNE @R0,#41H,CHK_CARD8 ;A
INC R0
CJNE @R0,#30H,CHK_CARD8 ;0
INC R0
CJNE @R0,#30H,CHK_CARD8 ;0
INC R0
CJNE @R0,#39H,CHK_CARD8 ;9
INC R0
CJNE @R0,#42H,CHK_CARD8 ;B
INC R0
CJNE @R0,#30H,CHK_CARD8 ;0
INC R0
CJNE @R0,#42H,CHK_CARD8 ;B
INC R0
CJNE @R0,#42H,CHK_CARD8 ;B
INC R0
CJNE @R0,#34H,CHK_CARD8 ;4
INC R0
CJNE @R0,#30H,CHK_CARD8 ;0
INC R0
CJNE @R0,#45H,CHK_CARD8 ;E
MOV P0,#0F8H
MOV P1,#0F8H
ACALL DELAY
MOV P0,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
;//******************//;
;//*   CHECK CARD 8 *//;
;//******************//;
CHK_CARD8: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD9 ;2
INC R0
CJNE @R0,#41H,CHK_CARD9 ;A
INC R0
CJNE @R0,#30H,CHK_CARD9 ;0
INC R0
CJNE @R0,#30H,CHK_CARD9 ;0
INC R0
CJNE @R0,#39H,CHK_CARD9 ;9
INC R0
CJNE @R0,#42H,CHK_CARD9 ;B
INC R0
CJNE @R0,#35H,CHK_CARD9 ;5
INC R0
CJNE @R0,#43H,CHK_CARD9 ;C
INC R0
CJNE @R0,#42H,CHK_CARD9 ;B
INC R0
CJNE @R0,#34H,CHK_CARD9 ;4
INC R0
CJNE @R0,#35H,CHK_CARD9 ;5
INC R0
CJNE @R0,#39H,CHK_CARD9 ;9
MOV P0,#80H
MOV P1,#0F7H
ACALL DELAY
MOV P0,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
;//******************//;
;//*   CHECK CARD 9 *//;
;//******************//;
CHK_CARD9: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD10 ;2
INC R0
CJNE @R0,#41H,CHK_CARD10 ;A
INC R0
CJNE @R0,#30H,CHK_CARD10 ;0
INC R0
CJNE @R0,#30H,CHK_CARD10 ;0
INC R0
CJNE @R0,#39H,CHK_CARD10 ;9
INC R0
CJNE @R0,#42H,CHK_CARD10 ;B
INC R0
CJNE @R0,#32H,CHK_CARD10 ;2
INC R0
CJNE @R0,#44H,CHK_CARD10 ;D
INC R0
CJNE @R0,#46H,CHK_CARD10 ;F
INC R0
CJNE @R0,#44H,CHK_CARD10 ;D
INC R0
CJNE @R0,#36H,CHK_CARD10 ;6
INC R0
CJNE @R0,#31H,CHK_CARD10 ;1
MOV P0,#90H
MOV P1,#0F6H
ACALL DELAY
MOV P0,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
;//******************//;
;//*  CHECK CARD 10 *//;
;//******************//;
CHK_CARD10: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD11 ;2
INC R0
CJNE @R0,#43H,CHK_CARD11 ;C
INC R0
CJNE @R0,#30H,CHK_CARD11 ;0
INC R0
CJNE @R0,#30H,CHK_CARD11 ;0
INC R0
CJNE @R0,#34H,CHK_CARD11 ;4
INC R0
CJNE @R0,#37H,CHK_CARD11 ;7
INC R0
CJNE @R0,#42H,CHK_CARD11 ;B
INC R0
CJNE @R0,#44H,CHK_CARD11 ;D
INC R0
CJNE @R0,#39H,CHK_CARD11 ;9
INC R0
CJNE @R0,#39H,CHK_CARD11 ;9
INC R0
CJNE @R0,#34H,CHK_CARD11 ;4
INC R0
CJNE @R0,#46H,CHK_CARD11 ;F
MOV P2,#0F9H
MOV P1,#0F5H
ACALL DELAY
MOV P2,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
;//******************//;
;//*  CHECK CARD 11 *//;
;//******************//;
CHK_CARD11: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD12 ;2
INC R0
CJNE @R0,#43H,CHK_CARD12 ;C
INC R0
CJNE @R0,#30H,CHK_CARD12 ;0
INC R0
CJNE @R0,#30H,CHK_CARD12 ;0
INC R0
CJNE @R0,#34H,CHK_CARD12 ;4
INC R0
CJNE @R0,#37H,CHK_CARD12 ;7
INC R0
CJNE @R0,#42H,CHK_CARD12 ;B
INC R0
CJNE @R0,#44H,CHK_CARD12 ;D
INC R0
CJNE @R0,#34H,CHK_CARD12 ;4
INC R0
CJNE @R0,#42H,CHK_CARD12 ;B
INC R0
CJNE @R0,#39H,CHK_CARD12 ;9
INC R0
CJNE @R0,#44H,CHK_CARD12 ;D
MOV P0,#0F9H
MOV P2,#0F9H
MOV P1,#0F4H
ACALL DELAY
MOV P0,#0C0H
MOV P2,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
;//******************//;
;//*  CHECK CARD 12 *//;
;//******************//;
CHK_CARD12: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD13 ;2
INC R0
CJNE @R0,#43H,CHK_CARD13 ;C
INC R0
CJNE @R0,#30H,CHK_CARD13 ;0
INC R0
CJNE @R0,#30H,CHK_CARD13 ;0
INC R0
CJNE @R0,#34H,CHK_CARD13 ;4
INC R0
CJNE @R0,#37H,CHK_CARD13 ;7
INC R0
CJNE @R0,#42H,CHK_CARD13 ;B
INC R0
CJNE @R0,#44H,CHK_CARD13 ;D
INC R0
CJNE @R0,#36H,CHK_CARD13 ;6
INC R0
CJNE @R0,#35H,CHK_CARD13 ;5
INC R0
CJNE @R0,#42H,CHK_CARD13 ;B
INC R0
CJNE @R0,#33H,CHK_CARD13 ;3
MOV P2,#0F9H
MOV P0,#0A4H
MOV P1,#0F3H
ACALL DELAY
MOV P2,#0C0H
MOV P0,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
;//******************//;
;//*  CHECK CARD 13 *//;
;//******************//;
CHK_CARD13: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD14 ;2
INC R0
CJNE @R0,#43H,CHK_CARD14 ;C
INC R0
CJNE @R0,#30H,CHK_CARD14 ;0
INC R0
CJNE @R0,#30H,CHK_CARD14 ;0
INC R0
CJNE @R0,#34H,CHK_CARD14 ;4
INC R0
CJNE @R0,#37H,CHK_CARD14 ;7
INC R0
CJNE @R0,#42H,CHK_CARD14 ;B
INC R0
CJNE @R0,#44H,CHK_CARD14 ;D
INC R0
CJNE @R0,#35H,CHK_CARD14 ;5
INC R0
CJNE @R0,#38H,CHK_CARD14 ;8
INC R0
CJNE @R0,#38H,CHK_CARD14 ;8
INC R0
CJNE @R0,#45H,CHK_CARD14 ;E
MOV P2,#0F9H
MOV P0,#0B0H
MOV P1,#0F2H
ACALL DELAY
MOV P2,#0C0H
MOV P0,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
;//******************//;
;//*  CHECK CARD 14 *//;
;//******************//;
CHK_CARD14: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD15 ;2
INC R0
CJNE @R0,#43H,CHK_CARD15 ;C
INC R0
CJNE @R0,#30H,CHK_CARD15 ;0
INC R0
CJNE @R0,#30H,CHK_CARD15 ;0
INC R0
CJNE @R0,#34H,CHK_CARD15 ;4
INC R0
CJNE @R0,#37H,CHK_CARD15 ;7
INC R0
CJNE @R0,#42H,CHK_CARD15 ;B
INC R0
CJNE @R0,#44H,CHK_CARD15 ;D
INC R0
CJNE @R0,#38H,CHK_CARD15 ;8
INC R0
CJNE @R0,#43H,CHK_CARD15 ;C
INC R0
CJNE @R0,#35H,CHK_CARD15 ;5
INC R0
CJNE @R0,#41H,CHK_CARD15 ;A
MOV P2,#0F9H
MOV P0,#99H
MOV P1,#0F1H
ACALL DELAY
MOV P2,#0C0H
MOV P0,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
;//******************//;
;//*  CHECK CARD 15 *//;
;//******************//;
CHK_CARD15: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD16 ;2
INC R0
CJNE @R0,#43H,CHK_CARD16 ;C
INC R0
CJNE @R0,#30H,CHK_CARD16 ;0
INC R0
CJNE @R0,#30H,CHK_CARD16 ;0
INC R0
CJNE @R0,#34H,CHK_CARD16 ;4
INC R0
CJNE @R0,#37H,CHK_CARD16 ;7
INC R0
CJNE @R0,#42H,CHK_CARD16 ;B
INC R0
CJNE @R0,#44H,CHK_CARD16 ;D
INC R0
CJNE @R0,#37H,CHK_CARD16 ;7
INC R0
CJNE @R0,#32H,CHK_CARD16 ;2
INC R0
CJNE @R0,#41H,CHK_CARD16 ;A
INC R0
CJNE @R0,#34H,CHK_CARD16 ;4
MOV P2,#0F9H
MOV P0,#92H
MOV P1,#0F0H
ACALL DELAY
MOV P2,#0C0H
MOV P0,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
;//******************//;
;//*  CHECK CARD 16 *//;
;//******************//;
CHK_CARD16: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD17 ;2
INC R0
CJNE @R0,#43H,CHK_CARD17 ;C
INC R0
CJNE @R0,#30H,CHK_CARD17 ;0
INC R0
CJNE @R0,#30H,CHK_CARD17 ;0
INC R0
CJNE @R0,#34H,CHK_CARD17 ;4
INC R0
CJNE @R0,#37H,CHK_CARD17 ;7
INC R0
CJNE @R0,#42H,CHK_CARD17 ;B
INC R0
CJNE @R0,#44H,CHK_CARD17 ;D
INC R0
CJNE @R0,#37H,CHK_CARD17 ;7
INC R0
CJNE @R0,#46H,CHK_CARD17 ;F
INC R0
CJNE @R0,#41H,CHK_CARD17 ;A
INC R0
CJNE @R0,#39H,CHK_CARD17 ;9
MOV P2,#0F9H
MOV P0,#82H
MOV P1,#0E0H
ACALL DELAY
MOV P2,#0C0H
MOV P0,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
;//******************//;
;//*  CHECK CARD 17 *//;
;//******************//;
CHK_CARD17: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD18 ;2
INC R0
CJNE @R0,#43H,CHK_CARD18 ;C
INC R0
CJNE @R0,#30H,CHK_CARD18 ;0
INC R0
CJNE @R0,#30H,CHK_CARD18 ;0
INC R0
CJNE @R0,#34H,CHK_CARD18 ;4
INC R0
CJNE @R0,#37H,CHK_CARD18 ;7
INC R0
CJNE @R0,#42H,CHK_CARD18 ;B
INC R0
CJNE @R0,#44H,CHK_CARD18 ;D
INC R0
CJNE @R0,#41H,CHK_CARD18 ;A
INC R0
CJNE @R0,#36H,CHK_CARD18 ;6
INC R0
CJNE @R0,#37H,CHK_CARD18 ;7
INC R0
CJNE @R0,#30H,CHK_CARD18 ;0
MOV P2,#0F9H
MOV P0,#0F8H
MOV P1,#0D0H
ACALL DELAY
MOV P2,#0C0H
MOV P0,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
;//******************//;
;//*  CHECK CARD 18 *//;
;//******************//;
CHK_CARD18: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD19 ;2
INC R0
CJNE @R0,#43H,CHK_CARD19 ;C
INC R0
CJNE @R0,#30H,CHK_CARD19 ;0
INC R0
CJNE @R0,#30H,CHK_CARD19 ;0
INC R0
CJNE @R0,#34H,CHK_CARD19 ;4
INC R0
CJNE @R0,#37H,CHK_CARD19 ;7
INC R0
CJNE @R0,#42H,CHK_CARD19 ;B
INC R0
CJNE @R0,#39H,CHK_CARD19 ;9
INC R0
CJNE @R0,#45H,CHK_CARD19 ;E
INC R0
CJNE @R0,#35H,CHK_CARD19 ;5
INC R0
CJNE @R0,#33H,CHK_CARD19 ;3
INC R0
CJNE @R0,#37H,CHK_CARD19 ;7
MOV P2,#0F9H
MOV P0,#80H
MOV P1,#0C0H
ACALL DELAY
MOV P2,#0C0H
MOV P0,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
;//******************//;
;//*  CHECK CARD 19 *//;
;//******************//;
CHK_CARD19: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD20 ;2
INC R0
CJNE @R0,#43H,CHK_CARD20 ;C
INC R0
CJNE @R0,#30H,CHK_CARD20 ;0
INC R0
CJNE @R0,#30H,CHK_CARD20 ;0
INC R0
CJNE @R0,#34H,CHK_CARD20 ;4
INC R0
CJNE @R0,#37H,CHK_CARD20 ;7
INC R0
CJNE @R0,#42H,CHK_CARD20 ;B
INC R0
CJNE @R0,#39H,CHK_CARD20 ;9
INC R0
CJNE @R0,#43H,CHK_CARD20 ;C
INC R0
CJNE @R0,#42H,CHK_CARD20 ;B
INC R0
CJNE @R0,#31H,CHK_CARD20 ;1
INC R0
CJNE @R0,#39H,CHK_CARD20 ;9
MOV P2,#0F9H
MOV P0,#90H
MOV P1,#0B0H
ACALL DELAY
MOV P2,#0C0H
MOV P0,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
;//******************//;
;//*  CHECK CARD 20 *//;
;//******************//;
CHK_CARD20: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD21 ;2
INC R0
CJNE @R0,#43H,CHK_CARD21 ;C
INC R0
CJNE @R0,#30H,CHK_CARD21 ;0
INC R0
CJNE @R0,#30H,CHK_CARD21 ;0
INC R0
CJNE @R0,#34H,CHK_CARD21 ;4
INC R0
CJNE @R0,#37H,CHK_CARD21 ;7
INC R0
CJNE @R0,#42H,CHK_CARD21 ;B
INC R0
CJNE @R0,#39H,CHK_CARD21 ;9
INC R0
CJNE @R0,#46H,CHK_CARD21 ;F
INC R0
CJNE @R0,#32H,CHK_CARD21 ;2
INC R0
CJNE @R0,#32H,CHK_CARD21 ;2
INC R0
CJNE @R0,#30H,CHK_CARD21 ;0
MOV P2,#0A4H
MOV P1,#0A0H
ACALL DELAY
MOV P2,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
;//******************//;
;//*  CHECK CARD 21 *//;
;//******************//;
CHK_CARD21: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD22 ;2
INC R0
CJNE @R0,#43H,CHK_CARD22 ;C
INC R0
CJNE @R0,#30H,CHK_CARD22 ;0
INC R0
CJNE @R0,#30H,CHK_CARD22 ;0
INC R0
CJNE @R0,#34H,CHK_CARD22 ;4
INC R0
CJNE @R0,#42H,CHK_CARD22 ;B
INC R0
CJNE @R0,#44H,CHK_CARD22 ;D
INC R0
CJNE @R0,#44H,CHK_CARD22 ;D
INC R0
CJNE @R0,#42H,CHK_CARD22 ;B
INC R0
CJNE @R0,#33H,CHK_CARD22 ;3
INC R0
CJNE @R0,#30H,CHK_CARD22 ;0
INC R0
CJNE @R0,#39H,CHK_CARD22 ;9
MOV P0,#0F9H
MOV P2,#0A4H
MOV P1,#90H
ACALL DELAY
MOV P2,#0C0H
MOV P0,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
;//******************//;
;//*  CHECK CARD 22 *//;
;//******************//;
CHK_CARD22: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD23 ;2
INC R0
CJNE @R0,#43H,CHK_CARD23 ;C
INC R0
CJNE @R0,#30H,CHK_CARD23 ;0
INC R0
CJNE @R0,#30H,CHK_CARD23 ;0
INC R0
CJNE @R0,#34H,CHK_CARD23 ;4
INC R0
CJNE @R0,#42H,CHK_CARD23 ;B
INC R0
CJNE @R0,#44H,CHK_CARD23 ;D
INC R0
CJNE @R0,#31H,CHK_CARD23 ;1
INC R0
CJNE @R0,#33H,CHK_CARD23 ;3
INC R0
CJNE @R0,#38H,CHK_CARD23 ;8
INC R0
CJNE @R0,#38H,CHK_CARD23 ;8
INC R0
CJNE @R0,#45H,CHK_CARD23 ;E
MOV P0,#0A4H
MOV P2,#0A4H
MOV P1,#80H
ACALL DELAY
MOV P0,#0C0H
MOV P2,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
;//******************//;
;//*  CHECK CARD 23 *//;
;//******************//;
CHK_CARD23: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD24 ;2
INC R0
CJNE @R0,#43H,CHK_CARD24 ;C
INC R0
CJNE @R0,#30H,CHK_CARD24 ;0
INC R0
CJNE @R0,#30H,CHK_CARD24 ;0
INC R0
CJNE @R0,#34H,CHK_CARD24 ;4
INC R0
CJNE @R0,#42H,CHK_CARD24 ;B
INC R0
CJNE @R0,#44H,CHK_CARD24 ;D
INC R0
CJNE @R0,#31H,CHK_CARD24 ;1
INC R0
CJNE @R0,#34H,CHK_CARD24 ;4
INC R0
CJNE @R0,#33H,CHK_CARD24 ;3
INC R0
CJNE @R0,#46H,CHK_CARD24 ;F
INC R0
CJNE @R0,#35H,CHK_CARD24 ;5
MOV P0,#0B0H
MOV P2,#0A4H
MOV P1,#70H
ACALL DELAY
MOV P0,#0C0H
MOV P2,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA
;//******************//;
;//*  CHECK CARD 24 *//;
;//******************//;
CHK_CARD24: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,OUT_OF_DATA ;2
INC R0
CJNE @R0,#43H,OUT_OF_DATA ;C
INC R0
CJNE @R0,#30H,OUT_OF_DATA ;0
INC R0
CJNE @R0,#30H,OUT_OF_DATA ;0
INC R0
CJNE @R0,#34H,OUT_OF_DATA ;4
INC R0
CJNE @R0,#42H,OUT_OF_DATA ;B
INC R0
CJNE @R0,#44H,OUT_OF_DATA ;D
INC R0
CJNE @R0,#31H,OUT_OF_DATA ;1
INC R0
CJNE @R0,#36H,OUT_OF_DATA ;6
INC R0
CJNE @R0,#43H,OUT_OF_DATA ;C
INC R0
CJNE @R0,#44H,OUT_OF_DATA ;D
INC R0
CJNE @R0,#41H,OUT_OF_DATA ;A
MOV P0,#99H
MOV P2,#0A4H
MOV P1,#60H
ACALL DELAY
MOV P0,#0C0H
MOV P2,#0C0H
MOV P1,#0FFH
AJMP WAIT_DATA

OUT_OF_DATA: ACALL CLR_BUFFER
AJMP INITIAL

;//***** CLR RAM BUFFER *****//;
CLR_BUFFER: MOV R0,#START_POINT_BUFFER
CLR A
CLR_BUFFER1: MOV @R0,A
INC R0
CJNE R0,#START_POINT_BUFFER+14,CLR_BUFFER1
RET

;//***** DELAY ROUTINE *****//;
DELAY: MOV R2,#150
DEL1: MOV R3,#80
DEL2: MOV R4,#80
DJNZ R4,$
DJNZ R3,DEL2
DJNZ R2,DEL1
RET
DELAY2: MOV R4,#100
DEL4: MOV R7,#40
DEL3: MOV R6,#10
DJNZ R6,$
DJNZ R7,DEL3
DJNZ R4,DEL4
RET







หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ เมษายน 26, 2011, 03:30:49 pm
รูปไม่ขึ้นhttp://image.free.in.th/show.php?id=8a77b83b62b9d889a18e6f5d16ffdfa4 (http://image.free.in.th/show.php?id=8a77b83b62b9d889a18e6f5d16ffdfa4)


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ เมษายน 26, 2011, 03:35:11 pm
แนวคิดตามรูป http://image.free.in.th/show.php?id=8a77b83b62b9d889a18e6f5d16ffdfa4 (http://image.free.in.th/show.php?id=8a77b83b62b9d889a18e6f5d16ffdfa4)

แต่ไม่รู้จะเพิ่ม eeprom มายังไง  ผมว่าจะเพิ่มที่ P2 เพราะได้ใช้แค่ 2 เส้น ยังเหลือ 6 เส้น  ช่วยแนะแนวทางการติดต่อกับ eeprom ให้หน่อยครับ   thank2  ขอบคุณมากๆครับ   thank2


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: JUB ที่ เมษายน 26, 2011, 06:00:43 pm
I2C หรือ SPI ...... google ตัวอย่างเยอะแยะ....  :)


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ เมษายน 27, 2011, 04:26:29 pm
เจอแต่ C ไม่มี asm เลย


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: JUB ที่ เมษายน 28, 2011, 08:40:11 am
มีครับลองหาดูดีๆ.....


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ เมษายน 28, 2011, 01:01:18 pm
ช่วยดูแนวทางให้ผมหน่อยครับว่ามันเป็นไปได้ไหม  แล้วถ้าไม่ได้ควรแก้ใขอย่างไร
            เริ่มตัน ตัวเครื่องยังไม่มีข้อมูลบัตร  ต้องกดรหัส *1234 แล้วตามด้วยตำแหน่งผู้ใช้ เช่น ผู้ใช้คนที่ 1 ให้กด 01 แล้วนำการ์ดมาทาบ ตัวเครื่องจะทำการบันทึกข้อมูลบัตรคนที่ 1  จนถึง คนที่ 24 (สำหรับเจ้าของเครื่อง)
การทำงาน     เช่นคนที่ 1 ต้องการนำรถเข้ามาจอด ก็ทาบบัตร แล้วกดรหัส 4 ตัวอะไรก็ได้ตามใจผู้ใช้  แล้วเครื่องจะส่งเลขฐาน 16 ออกมาสั่งงาน PLC ที่ P1 เช่นคนที่ 1 ส่งข้อมูล 0000 0001                                       
                   แล้วเวลานำรถออก ก็ทาบการ์ด ตามด้วยการกดรหัส 4 ตัวเดิมที่กดไว้ตอนนำรถเข้าจอด แล้วเครื่องจะส่งเลขฐาน 16 ออกมาสั่งงาน PLC เหมือนเดิม  แล้วเครื่องจะทำการเคลียรหัส (เพื่อในกรณีเปลี่นเจ้าของบัตร  ง่ายๆคือ กดครั้งแรกเป็นอะไรก็ได้แต่ตอนนำรถออกให้จำให้ได้)    การทำงานก็ประมาณนี้ครับไม่รู้ว่าได้หรือไม่    :D :D :D


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ เมษายน 28, 2011, 01:55:13 pm
ไม่รู้ว่าต่อแบบนี้ได้ป่าวครับ แล้วจะเก็บข้อมูลพอหรือไม่ครับ     แล้วการเขียนตามเงื่อนใขจะได้ป่าวครับ
(http://www.sixca.com/micro/mcs51/i2c_eeprom/connecting.gif)


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ เมษายน 28, 2011, 02:16:27 pm
(http://upic.me/i/gs/graphic1.jpg)


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ เมษายน 28, 2011, 02:32:11 pm
ท่านใดรับสอน asm ตามเงื่อนใขด้านบน ช่วยติดต่อ  PM  thank2 thank2 thank2 thank2


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: JUB ที่ เมษายน 28, 2011, 10:35:42 pm
ลองเขียน flowchart ลำดับการทำงานดูก่อน เรื่อง program ไม่ยาก.......


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ เมษายน 29, 2011, 12:06:32 am
เมื่อทำการบันทึกข้อมูลการ์ดโดยกด *1234 แล้ว  ในกรณีที่เครื่องทำงานอยู่สามารถกด *1234 เพื่อบันทึกการ์ดใบอื่นๆในกรณี เปลี่ยนการ์ดหรือการ์ดใบเดิมหาย



ขั้นตอนการบันทึกข้อมูลหรือเปลี่ยนการ์ดจะทำโดยเจ้าของเครื่องไม่ใช่ผู้ใช้
(http://upic.me/i/7k/drawing2.jpg)


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: JUB ที่ เมษายน 29, 2011, 07:49:26 am
เขียน program initerface อุปกรณ์แต่ละตัวแล้วแยกไว้...
เช่น ส่วนการแสดงผล lcd ส่วนรับค่า key และ card
ที่เหลือก็มี i2c กับ plc


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ เมษายน 29, 2011, 11:53:47 am
ส่วน LCD
โค๊ด:
	

START_POINT_BUFFER:      EQU 040H ; กำหนดหน่วยความจำสำหรับค่า Data RFID
LCD_ADDR: EQU 030H ; กำหนดหน่วยความสำหรับค่า Address LCD
LCD_DATA: EQU 031H ; กำหนดหน่วยความสำหรับค่า Data LCD


MOV P1,#0FFH
MOV P0,#00H ; กำหนดค่าเริ่มต้นให้กับพอร์ต 0
MOV P2,#00011111B

MAIN:  LCALL INIT_LCD ; เรียกโปรแกรมย่อยเพื่อเตรียมการทำงานเริ่มต้น LCD
                            ACALL LCD_CLR ; ล้างจอแสดงผล
MOV LCD_ADDR,#00H ; กำหนดค่า Address เริ่มต้นเป็น 00
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_01 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 00H-0FH
MOV LCD_ADDR,#40H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_02 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH


WAIT_DATA: MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_02 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
;-------ส่วนแสดงผล USER : 01-24
LCD_01: MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_1 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH




;---------------------------------------------------------------------------------
; LCD Initialize โปรแกรมย่อยเพื่อเตรียมการทำงานเริ่มต้น LCD
;---------------------------------------------------------------------------------
INIT_LCD: LCALL DELAY_100ms ; หน่วงเวลา เพื่อให้จอแอลซีดีพร้อมก่อน
CLR P2.7 ; ขา RS เป็น 0 เพื่อแจ้งให้ทราบว่าเป็นการส่งคำสั่ง
MOV P0,#00111000B ; กำหนดโหมดเป็นแบบ 8bit
LCALL LCD_CLK ; ส่งพัลซ์ 1 ลูก ที่ขา Enable
LCALL DELAY_10ms ; หน่วงเวลาเพื่อให้จอฯพร้อมรับคำสั่งถัดไป
LCALL LCD_OFF ; เรียกโปรแกรมย่อย ปิดจอแสดงผล
LCALL LCD_CLR ; เรียกโปรแกรมย่อย ล้างค่าจอแสดงผล
MOV P0,#00000110B ; กำหนดโหมดการป้อนข้อมูล
LCALL LCD_CLK ; ส่งพัลซ์ 1 ลูก ที่ขา Enable
LCALL LCD_HOME ; เรียกโปรแกรมย่อยเพื่อย้ายเคอร์เซอร์ไปยังตำแหน่งแรก
;-----------------------------------------------------------------
; LCD Clear Display โปรแกรมย่อยล้างค่าจอแสดงผล
;-----------------------------------------------------------------
LCD_CLR: CLR P2.7
MOV P0,#00000001B
ACALL LCD_CLK
RET
;----------------------------------------------------------------------------------------
; LCD Return Home โปรแกรมย่อยเพื่อย้ายเคอร์เซอร์ไปยังตำแหน่งแรก
;----------------------------------------------------------------------------------------
LCD_HOME: CLR P2.7
MOV P0,#00000010B
ACALL LCD_CLK
RET
;----------------------------------------------------------
; LCD Display Off โปรแกรมย่อย ปิดจอแสดงผล
;-----------------------------------------------------------
LCD_OFF: CLR P2.7
MOV P0,#00001000B
ACALL LCD_CLK
RET
;--------------------------------------------------------------------
; LCD Clk โปรแกรมย่อยเพื่อ ส่งพัลซ์ 1 ลูก ที่ขา Enable
;--------------------------------------------------------------------
LCD_CLK: SETB P2.6
LCALL LCD_DELAY
CLR P2.6
LCALL LCD_DELAY
RET
;--------------------------------------------------------------
; LCD Display On โปรแกรมย่อย เปิดจอแสดงผล
;--------------------------------------------------------------
LCD_ON: CLR P2.7
MOV P0,#00001100B
LCALL LCD_CLK
RET
;--------------------------------------------------------
; LCD Cursor On โปรแกรมย่อย เปิดเคอร์เซอร์
;--------------------------------------------------------
LCD_BLINK: CLR P2.7
MOV P0,#00001111B
LCALL LCD_CLK
RET
;-------------------------------------------------------------------------------------------
; LCD Left Shift Display โปรแกรมย่อย เลือกการแสดงผลไปทางซ้าย 1 ครั้ง
;--------------------------------------------------------------------------------------------
LCD_LSHF: CLR P2.7
MOV P0,#00011000B
LCALL LCD_CLK
RET
;---------------------------------------------------------------------------------------------
; LCD Right Shift Display โปรแกรมย่อย เลือกการแสดงผลไปทางขวา 1 ครั้ง
;---------------------------------------------------------------------------------------------
LCD_RSHF: CLR P2.7
MOV P0,#00011100B
LCALL LCD_CLK
RET
;----------------------------------------------------------------------------------
; Set LCD Address โปรแกรมย่อยเพื่อกำหนดตำแหน่งในจอแอลซีดี
;---------------------------------------------------------------------------------
SET_ADDR_LCD: CLR P2.7
MOV A,LCD_ADDR
SETB ACC.7
MOV P0,A
LCALL LCD_CLK
RET
;-------------------------------------------------------------------------------------------
; Write Character to show LCD โปรแกรมย่อยเพื่อแสดงตัวอักษรที่ต้องการ
;-------------------------------------------------------------------------------------------
WRCHAR_LCD: SETB P2.7
MOV P0,LCD_DATA
LCALL LCD_CLK
LCALL LCD_ON
RET
;-------------------------------------------------------------------------------------------------------------------
; Write Line of 16 Character from ROM โปรแกรมย่อยเพื่อส่งตัวอักษรจาก ROM ไปจอแอลซีดี
;-------------------------------------------------------------------------------------------------------------------
WRLINE_LCD: MOV R0,#0
WRLINE_LCD_1: SETB P2.7
CLR A
MOVC A,@A+DPTR
MOV P0,A
LCALL LCD_CLK
INC DPTR
INC R0
CJNE R0,#16,WRLINE_LCD_1
LCALL LCD_ON
RET
;---------------------------------------------------------------------------------------
;    DELAY ROUTINE   โปรแกรมย่อยสำหรับหน่วงเวลา
;---------------------------------------------------------------------------------------
LCD_DELAY: MOV R7,#002
LCD_DELAY_1: MOV R6,#0E6H
LCD_DELAY_2: NOP
NOP
DJNZ R6,LCD_DELAY_2
DJNZ R7,LCD_DELAY_1
RET
DELAY_10ms: MOV R7,#010
DELAY_10ms_1: MOV R6,#0E6H
DELAY_10ms_2: NOP
NOP
DJNZ R6,DELAY_10ms_2
DJNZ R7,DELAY_10ms_1
RET
DELAY_100ms: MOV R7,#100
DELAY_100ms_1: MOV R6,#0E6H
DELAY_100ms_2: NOP
NOP
DJNZ R6,DELAY_100ms_2
DJNZ R7,DELAY_100ms_1
RET
DELAY_1s: MOV R5,#100
DELAY_1s_1: LCALL DELAY_10ms
DJNZ R5,DELAY_1s_1
RET
DELAY: MOV R2,#250
DEL1: MOV R3,#80
DEL2: MOV R4,#80
DJNZ R4,$
DJNZ R3,DEL2
DJNZ R2,DEL1
RET
;-------------------------------------------------------------------------------------
; กำหนดค่าข้อมูลของตัวอักษรที่ต้องการ เก็บไว้ที่หน่วยความจำ ROM
; Define Constant ( Store in Flash EEPROM Program Memory )
;-------------------------------------------------------------------------------------
TITLE_01: DFB "AUTO CAR PARKING "
TITLE_02: DFB " Proximity card  "
TITLE_03: DFB "  Unknown card   "
TITLE_04: DFB "AUTOMATIC CAR   "
TITLE_05: DFB "PARKING           "
TITLE_1: DFB "  User ID :  1      "
TITLE_2: DFB "  User ID :  2      "
TITLE_3: DFB "  User ID :  3      "
TITLE_4: DFB "  User ID :  4      "
TITLE_5: DFB "  User ID :  5      "
TITLE_6: DFB "  User ID :  6      "
TITLE_7: DFB "  User ID :  7      "
TITLE_8: DFB "  User ID :  8      "
TITLE_9: DFB "  User ID :  9      "
TITLE_10: DFB "  User ID :  10     "
TITLE_11: DFB "  User ID :  11     "
TITLE_12: DFB "  User ID :  12     "
TITLE_13: DFB "  User ID :  13     "
TITLE_14: DFB "  User ID :  14     "
TITLE_15: DFB "  User ID :  15     "
TITLE_16: DFB "  User ID :  16     "
TITLE_17: DFB "  User ID :  17      "
TITLE_18: DFB "  User ID :  18      "
TITLE_19: DFB "  User ID :  19      "
TITLE_20: DFB "  User ID :  20      "
TITLE_21: DFB "  User ID :  21      "
TITLE_22: DFB "  User ID :  22      "
TITLE_23: DFB "  User ID :  23      "
TITLE_24: DFB "  User ID :  24      "





หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ เมษายน 29, 2011, 12:00:40 pm
ส่วนรับค่าจากการ์ด   แต่การรับคีย์ไม่เข้าใจว่าจะเอาคีย์ที่กดทีละตัวไปเก็บไว้ไหนแล้วรวมกันเป็นข้อมูล 1 ชุด เก็บไว้ใน eeprom
โค๊ด:
INITIAL: MOV SP,#060H
MOV TMOD,#20H
MOV SCON,#50H
MOV TH1,#0FBH
SETB TR1

MOV R0,#START_POINT_BUFFER
WAIT_DATA1: CLR RI
JNB RI,$
MOV @R0,SBUF
INC R0
CJNE R0,#START_POINT_BUFFER+14,WAIT_DATA1


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ เมษายน 29, 2011, 12:09:07 pm
ส่วน PLC         จะส่งข้อมูลเปิด1 ครั้งแล้ว ปิด
ไม่ว่าจะนำรถเข้าหรือออก ก็ส่งข้อมูลเหมือนเดิม
โค๊ด:
ID_01: MOV P1,#0FEH
LCALL DELAY
MOV P1,#0FFH

ID_02: MOV P1,#0FDH
LCALL DELAY
MOV P1,#0FFH

ID_03: MOV P1,#0FCH
LCALL DELAY
MOV P1,#0FFH

ID_04: MOV P1,#0FBH
LCALL DELAY
MOV P1,#0FFH
              จนถึง 24


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: JUB ที่ เมษายน 29, 2011, 12:18:31 pm
กำหนด memmory map ด้วยครับ
เพราะตอนเราเขียน main program จะต้องอ้างตำแหน่ง
ของ memory และ commend ใน program ย่อยด้วยว่า
มีการใช้ register ตัวใดบ้าง buffer ตำแหน่งใด
ค่าที่ส่งผ่านและค่าที่รับได้อยู่ตำแหน่งไหน...... เอาให้ละเอียด
เพราะมันจะเป็นเหมือน library ที่เราต้องเรียกใช้ใน main programs
....


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ เมษายน 29, 2011, 12:23:32 pm
 >:(  ไม่ค่อยเข้าใจครับ


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ เมษายน 29, 2011, 12:25:44 pm
อันนี้โปรแกรมเต็มครับ  แต่ตอนนั้นยังไม่มีการกดคีย์และการเปลี่ยนการ์ด
โค๊ด:
		;##############################
;#   AUTOMATIC CAR PARKING     #
;##############################
                        CPU "8051.TBL"
HOF "INT8"
ORG 0

START_POINT_BUFFER:      EQU 040H ; กำหนดหน่วยความจำสำหรับค่า Data RFID
LCD_ADDR: EQU 030H ; กำหนดหน่วยความสำหรับค่า Address LCD
LCD_DATA: EQU 031H ; กำหนดหน่วยความสำหรับค่า Data LCD

INITIAL: MOV SP,#060H
MOV TMOD,#20H
MOV SCON,#50H
MOV TH1,#0FBH
SETB TR1
MOV P1,#0FFH
MOV P0,#00H ; กำหนดค่าเริ่มต้นให้กับพอร์ต 0
MOV P2,#00011111B
MAIN:  LCALL INIT_LCD ; เรียกโปรแกรมย่อยเพื่อเตรียมการทำงานเริ่มต้น LCD
ACALL LCD_CLR ; ล้างจอแสดงผล
LOOP: MOV LCD_ADDR,#10H ; กำหนดค่า Address เริ่มต้นเป็น 00
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_04 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 10H-1FH
MOV DPTR,#TITLE_05 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 20H-2FH
MOV R4,#40 ; เลื่อนชุดแสดงผลไปทาง้ซ้าย 40 ครั้ง
LOOP_LCD_L_SHF: LCALL LCD_LSHF
LCALL DELAY_100ms
LCALL DELAY_100ms
LCALL DELAY_100ms
DJNZ R4,LOOP_LCD_L_SHF
LCALL INIT_LCD
MOV LCD_ADDR,#00H ; กำหนดค่า Address เริ่มต้นเป็น 00
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_01 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 00H-0FH
MOV LCD_ADDR,#40H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_02 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
;------------------------------;
;    WAIT RFID DATA   ;
;------------------------------;
WAIT_DATA: MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_02 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH

MOV R0,#START_POINT_BUFFER
WAIT_DATA1: CLR RI
JNB RI,$
MOV @R0,SBUF
INC R0
CJNE R0,#START_POINT_BUFFER+14,WAIT_DATA1
;------------------------------------;
;       CHECK CARD 1        ;
;------------------------------------;
CHK_CARD1: MOV R0,#START_POINT_BUFFER
CJNE @R0,#02H,START_TX_ERROR ;STX=02H
MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD2 ;2
INC R0
CJNE @R0,#41H,CHK_CARD2 ;A
INC R0
CJNE @R0,#30H,CHK_CARD2 ;0
INC R0
CJNE @R0,#30H,CHK_CARD2 ;0
INC R0
CJNE @R0,#39H,CHK_CARD2 ;9
INC R0
CJNE @R0,#41H,CHK_CARD2 ;A
INC R0
CJNE @R0,#46H,CHK_CARD2 ;F
INC R0
CJNE @R0,#39H,CHK_CARD2 ;9
INC R0
CJNE @R0,#41H,CHK_CARD2 ;A
INC R0
CJNE @R0,#46H,CHK_CARD2 ;F
INC R0
CJNE @R0,#45H,CHK_CARD2 ;E
INC R0
CJNE @R0,#36H,CHK_CARD2 ;6
MOV P1,#0FEH
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_1 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
START_TX_ERROR: LCALL CLR_BUFFER
AJMP WAIT_DATA
;------------------------------------;
;       CHECK CARD 2        ;
;------------------------------------;
CHK_CARD2: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD3 ;2
INC R0
CJNE @R0,#41H,CHK_CARD3 ;A
INC R0
CJNE @R0,#30H,CHK_CARD3 ;0
INC R0
CJNE @R0,#30H,CHK_CARD3 ;0
INC R0
CJNE @R0,#39H,CHK_CARD3 ;9
INC R0
CJNE @R0,#41H,CHK_CARD3 ;A
INC R0
CJNE @R0,#46H,CHK_CARD3 ;F
INC R0
CJNE @R0,#41H,CHK_CARD3 ;A
INC R0
CJNE @R0,#39H,CHK_CARD3 ;9
INC R0
CJNE @R0,#33H,CHK_CARD3 ;3
INC R0
CJNE @R0,#44H,CHK_CARD3 ;D
INC R0
CJNE @R0,#39H,CHK_CARD3 ;9
MOV P1,#0FDH
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_2 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
  ;---------------------------------;
;      CHECK CARD 3      ;
;---------------------------------;
CHK_CARD3: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD4 ;2
INC R0
CJNE @R0,#41H,CHK_CARD4 ;A
INC R0
CJNE @R0,#30H,CHK_CARD4 ;0
INC R0
CJNE @R0,#30H,CHK_CARD4 ;0
INC R0
CJNE @R0,#39H,CHK_CARD4 ;9
INC R0
CJNE @R0,#44H,CHK_CARD4 ;D
INC R0
CJNE @R0,#46H,CHK_CARD4 ;F
INC R0
CJNE @R0,#44H,CHK_CARD4 ;D
INC R0
CJNE @R0,#42H,CHK_CARD4 ;B
INC R0
CJNE @R0,#33H,CHK_CARD4 ;3
INC R0
CJNE @R0,#46H,CHK_CARD4 ;F
INC R0
CJNE @R0,#39H,CHK_CARD4 ;9
MOV P1,#0FCH
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_3 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
;---------------------------------;
;       CHECK CARD 4     ;
;---------------------------------;
CHK_CARD4: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD5 ;2
INC R0
CJNE @R0,#41H,CHK_CARD5 ;A
INC R0
CJNE @R0,#30H,CHK_CARD5 ;0
INC R0
CJNE @R0,#30H,CHK_CARD5 ;0
INC R0
CJNE @R0,#39H,CHK_CARD5 ;9
INC R0
CJNE @R0,#44H,CHK_CARD5 ;D
INC R0
CJNE @R0,#45H,CHK_CARD5 ;E
INC R0
CJNE @R0,#39H,CHK_CARD5 ;9
INC R0
CJNE @R0,#32H,CHK_CARD5 ;2
INC R0
CJNE @R0,#42H,CHK_CARD5 ;B
INC R0
CJNE @R0,#37H,CHK_CARD5 ;7
INC R0
CJNE @R0,#35H,CHK_CARD5 ;5
MOV P1,#0FBH
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_4 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
;---------------------------------;
;      CHECK CARD 5      ;
;---------------------------------;
CHK_CARD5: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD6 ;2
INC R0
CJNE @R0,#41H,CHK_CARD6 ;A
INC R0
CJNE @R0,#30H,CHK_CARD6 ;0
INC R0
CJNE @R0,#30H,CHK_CARD6 ;0
INC R0
CJNE @R0,#39H,CHK_CARD6 ;9
INC R0
CJNE @R0,#44H,CHK_CARD6 ;D
INC R0
CJNE @R0,#46H,CHK_CARD6 ;F
INC R0
CJNE @R0,#44H,CHK_CARD6 ;D
INC R0
CJNE @R0,#43H,CHK_CARD6 ;C
INC R0
CJNE @R0,#44H,CHK_CARD6 ;D
INC R0
CJNE @R0,#38H,CHK_CARD6 ;8
INC R0
CJNE @R0,#37H,CHK_CARD6 ;7
MOV P1,#0FAH
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_5 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
;---------------------------------;
;      CHECK CARD 6      ;
;---------------------------------;
CHK_CARD6: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD7 ;2
INC R0
CJNE @R0,#41H,CHK_CARD7 ;A
INC R0
CJNE @R0,#30H,CHK_CARD7 ;0
INC R0
CJNE @R0,#30H,CHK_CARD7 ;0
INC R0
CJNE @R0,#39H,CHK_CARD7 ;9
INC R0
CJNE @R0,#44H,CHK_CARD7 ;D
INC R0
CJNE @R0,#45H,CHK_CARD7 ;E
INC R0
CJNE @R0,#39H,CHK_CARD7 ;9
INC R0
CJNE @R0,#46H,CHK_CARD7 ;F
INC R0
CJNE @R0,#34H,CHK_CARD7 ;4
INC R0
CJNE @R0,#41H,CHK_CARD7 ;A
INC R0
CJNE @R0,#41H,CHK_CARD7 ;A
MOV P1,#0F9H
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_6 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
;---------------------------------;
;      CHECK CARD 7      ;
;---------------------------------;
CHK_CARD7: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD8 ;2
INC R0
CJNE @R0,#41H,CHK_CARD8 ;A
INC R0
CJNE @R0,#30H,CHK_CARD8 ;0
INC R0
CJNE @R0,#30H,CHK_CARD8 ;0
INC R0
CJNE @R0,#39H,CHK_CARD8 ;9
INC R0
CJNE @R0,#42H,CHK_CARD8 ;B
INC R0
CJNE @R0,#30H,CHK_CARD8 ;0
INC R0
CJNE @R0,#42H,CHK_CARD8 ;B
INC R0
CJNE @R0,#42H,CHK_CARD8 ;B
INC R0
CJNE @R0,#34H,CHK_CARD8 ;4
INC R0
CJNE @R0,#30H,CHK_CARD8 ;0
INC R0
CJNE @R0,#45H,CHK_CARD8 ;E
MOV P1,#0F8H
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_7 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
;---------------------------------;
;      CHECK CARD 8      ;
;---------------------------------;
CHK_CARD8: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD9 ;2
INC R0
CJNE @R0,#41H,CHK_CARD9 ;A
INC R0
CJNE @R0,#30H,CHK_CARD9 ;0
INC R0
CJNE @R0,#30H,CHK_CARD9 ;0
INC R0
CJNE @R0,#39H,CHK_CARD9 ;9
INC R0
CJNE @R0,#42H,CHK_CARD9 ;B
INC R0
CJNE @R0,#35H,CHK_CARD9 ;5
INC R0
CJNE @R0,#43H,CHK_CARD9 ;C
INC R0
CJNE @R0,#42H,CHK_CARD9 ;B
INC R0
CJNE @R0,#34H,CHK_CARD9 ;4
INC R0
CJNE @R0,#35H,CHK_CARD9 ;5
INC R0
CJNE @R0,#39H,CHK_CARD9 ;9
MOV P1,#0F7H
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_8 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
;---------------------------------;
;      CHECK CARD 9      ;
;---------------------------------;
CHK_CARD9: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD10 ;2
INC R0
CJNE @R0,#41H,CHK_CARD10 ;A
INC R0
CJNE @R0,#30H,CHK_CARD10 ;0
INC R0
CJNE @R0,#30H,CHK_CARD10 ;0
INC R0
CJNE @R0,#39H,CHK_CARD10 ;9
INC R0
CJNE @R0,#42H,CHK_CARD10 ;B
INC R0
CJNE @R0,#32H,CHK_CARD10 ;2
INC R0
CJNE @R0,#44H,CHK_CARD10 ;D
INC R0
CJNE @R0,#46H,CHK_CARD10 ;F
INC R0
CJNE @R0,#44H,CHK_CARD10 ;D
INC R0
CJNE @R0,#36H,CHK_CARD10 ;6
INC R0
CJNE @R0,#31H,CHK_CARD10 ;1
MOV P1,#0F6H
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_9 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
;---------------------------------;
;    CHECK CARD 10      ;
;---------------------------------;
CHK_CARD10: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD11 ;2
INC R0
CJNE @R0,#43H,CHK_CARD11 ;C
INC R0
CJNE @R0,#30H,CHK_CARD11 ;0
INC R0
CJNE @R0,#30H,CHK_CARD11 ;0
INC R0
CJNE @R0,#34H,CHK_CARD11 ;4
INC R0
CJNE @R0,#37H,CHK_CARD11 ;7
INC R0
CJNE @R0,#42H,CHK_CARD11 ;B
INC R0
CJNE @R0,#44H,CHK_CARD11 ;D
INC R0
CJNE @R0,#39H,CHK_CARD11 ;9
INC R0
CJNE @R0,#39H,CHK_CARD11 ;9
INC R0
CJNE @R0,#34H,CHK_CARD11 ;4
INC R0
CJNE @R0,#46H,CHK_CARD11 ;F
MOV P1,#0F5H
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_10 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
;---------------------------------;
;    CHECK CARD 11      ;
;---------------------------------;
CHK_CARD11: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD12 ;2
INC R0
CJNE @R0,#43H,CHK_CARD12 ;C
INC R0
CJNE @R0,#30H,CHK_CARD12 ;0
INC R0
CJNE @R0,#30H,CHK_CARD12 ;0
INC R0
CJNE @R0,#34H,CHK_CARD12 ;4
INC R0
CJNE @R0,#37H,CHK_CARD12 ;7
INC R0
CJNE @R0,#42H,CHK_CARD12 ;B
INC R0
CJNE @R0,#44H,CHK_CARD12 ;D
INC R0
CJNE @R0,#34H,CHK_CARD12 ;4
INC R0
CJNE @R0,#42H,CHK_CARD12 ;B
INC R0
CJNE @R0,#39H,CHK_CARD12 ;9
INC R0
CJNE @R0,#44H,CHK_CARD12 ;D
MOV P1,#0F4H
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_11 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
;---------------------------------;
;     CHECK CARD 12     ;
;---------------------------------;
CHK_CARD12: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD13 ;2
INC R0
CJNE @R0,#43H,CHK_CARD13 ;C
INC R0
CJNE @R0,#30H,CHK_CARD13 ;0
INC R0
CJNE @R0,#30H,CHK_CARD13 ;0
INC R0
CJNE @R0,#34H,CHK_CARD13 ;4
INC R0
CJNE @R0,#37H,CHK_CARD13 ;7
INC R0
CJNE @R0,#42H,CHK_CARD13 ;B
INC R0
CJNE @R0,#44H,CHK_CARD13 ;D
INC R0
CJNE @R0,#36H,CHK_CARD13 ;6
INC R0
CJNE @R0,#35H,CHK_CARD13 ;5
INC R0
CJNE @R0,#42H,CHK_CARD13 ;B
INC R0
CJNE @R0,#33H,CHK_CARD13 ;3
MOV P1,#0F3H
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_12 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
;---------------------------------;
;     CHECK CARD 13     ;
;---------------------------------;
CHK_CARD13: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD14 ;2
INC R0
CJNE @R0,#43H,CHK_CARD14 ;C
INC R0
CJNE @R0,#30H,CHK_CARD14 ;0
INC R0
CJNE @R0,#30H,CHK_CARD14 ;0
INC R0
CJNE @R0,#34H,CHK_CARD14 ;4
INC R0
CJNE @R0,#37H,CHK_CARD14 ;7
INC R0
CJNE @R0,#42H,CHK_CARD14 ;B
INC R0
CJNE @R0,#44H,CHK_CARD14 ;D
INC R0
CJNE @R0,#35H,CHK_CARD14 ;5
INC R0
CJNE @R0,#38H,CHK_CARD14 ;8
INC R0
CJNE @R0,#38H,CHK_CARD14 ;8
INC R0
CJNE @R0,#45H,CHK_CARD14 ;E
MOV P1,#0F2H
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_13 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
;---------------------------------;
;     CHECK CARD 14     ;
;---------------------------------;
CHK_CARD14: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD15 ;2
INC R0
CJNE @R0,#43H,CHK_CARD15 ;C
INC R0
CJNE @R0,#30H,CHK_CARD15 ;0
INC R0
CJNE @R0,#30H,CHK_CARD15 ;0
INC R0
CJNE @R0,#34H,CHK_CARD15 ;4
INC R0
CJNE @R0,#37H,CHK_CARD15 ;7
INC R0
CJNE @R0,#42H,CHK_CARD15 ;B
INC R0
CJNE @R0,#44H,CHK_CARD15 ;D
INC R0
CJNE @R0,#38H,CHK_CARD15 ;8
INC R0
CJNE @R0,#43H,CHK_CARD15 ;C
INC R0
CJNE @R0,#35H,CHK_CARD15 ;5
INC R0
CJNE @R0,#41H,CHK_CARD15 ;A
MOV P1,#0F1H
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_14 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
;---------------------------------;
;     CHECK CARD 15     ;
;---------------------------------;
CHK_CARD15: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD16 ;2
INC R0
CJNE @R0,#43H,CHK_CARD16 ;C
INC R0
CJNE @R0,#30H,CHK_CARD16 ;0
INC R0
CJNE @R0,#30H,CHK_CARD16 ;0
INC R0
CJNE @R0,#34H,CHK_CARD16 ;4
INC R0
CJNE @R0,#37H,CHK_CARD16 ;7
INC R0
CJNE @R0,#42H,CHK_CARD16 ;B
INC R0
CJNE @R0,#44H,CHK_CARD16 ;D
INC R0
CJNE @R0,#37H,CHK_CARD16 ;7
INC R0
CJNE @R0,#32H,CHK_CARD16 ;2
INC R0
CJNE @R0,#41H,CHK_CARD16 ;A
INC R0
CJNE @R0,#34H,CHK_CARD16 ;4
MOV P1,#0F0H
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_15 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
;---------------------------------;
;     CHECK CARD 16     ;
;---------------------------------;
CHK_CARD16: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD17 ;2
INC R0
CJNE @R0,#43H,CHK_CARD17 ;C
INC R0
CJNE @R0,#30H,CHK_CARD17 ;0
INC R0
CJNE @R0,#30H,CHK_CARD17 ;0
INC R0
CJNE @R0,#34H,CHK_CARD17 ;4
INC R0
CJNE @R0,#37H,CHK_CARD17 ;7
INC R0
CJNE @R0,#42H,CHK_CARD17 ;B
INC R0
CJNE @R0,#44H,CHK_CARD17 ;D
INC R0
CJNE @R0,#37H,CHK_CARD17 ;7
INC R0
CJNE @R0,#46H,CHK_CARD17 ;F
INC R0
CJNE @R0,#41H,CHK_CARD17 ;A
INC R0
CJNE @R0,#39H,CHK_CARD17 ;9
MOV P1,#0E0H
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_16 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
;---------------------------------;
;     CHECK CARD 17     ;
;---------------------------------;
CHK_CARD17: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD18 ;2
INC R0
CJNE @R0,#43H,CHK_CARD18 ;C
INC R0
CJNE @R0,#30H,CHK_CARD18 ;0
INC R0
CJNE @R0,#30H,CHK_CARD18 ;0
INC R0
CJNE @R0,#34H,CHK_CARD18 ;4
INC R0
CJNE @R0,#37H,CHK_CARD18 ;7
INC R0
CJNE @R0,#42H,CHK_CARD18 ;B
INC R0
CJNE @R0,#44H,CHK_CARD18 ;D
INC R0
CJNE @R0,#41H,CHK_CARD18 ;A
INC R0
CJNE @R0,#36H,CHK_CARD18 ;6
INC R0
CJNE @R0,#37H,CHK_CARD18 ;7
INC R0
CJNE @R0,#30H,CHK_CARD18 ;0
MOV P1,#0D0H
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_17 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
;---------------------------------;
;     CHECK CARD 18     ;
;---------------------------------;
CHK_CARD18: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD19 ;2
INC R0
CJNE @R0,#43H,CHK_CARD19 ;C
INC R0
CJNE @R0,#30H,CHK_CARD19 ;0
INC R0
CJNE @R0,#30H,CHK_CARD19 ;0
INC R0
CJNE @R0,#34H,CHK_CARD19 ;4
INC R0
CJNE @R0,#37H,CHK_CARD19 ;7
INC R0
CJNE @R0,#42H,CHK_CARD19 ;B
INC R0
CJNE @R0,#39H,CHK_CARD19 ;9
INC R0
CJNE @R0,#45H,CHK_CARD19 ;E
INC R0
CJNE @R0,#35H,CHK_CARD19 ;5
INC R0
CJNE @R0,#33H,CHK_CARD19 ;3
INC R0
CJNE @R0,#37H,CHK_CARD19 ;7
MOV P1,#0C0H
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_18 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
;---------------------------------;
;     CHECK CARD 19     ;
;---------------------------------;
CHK_CARD19: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD20 ;2
INC R0
CJNE @R0,#43H,CHK_CARD20 ;C
INC R0
CJNE @R0,#30H,CHK_CARD20 ;0
INC R0
CJNE @R0,#30H,CHK_CARD20 ;0
INC R0
CJNE @R0,#34H,CHK_CARD20 ;4
INC R0
CJNE @R0,#37H,CHK_CARD20 ;7
INC R0
CJNE @R0,#42H,CHK_CARD20 ;B
INC R0
CJNE @R0,#39H,CHK_CARD20 ;9
INC R0
CJNE @R0,#43H,CHK_CARD20 ;C
INC R0
CJNE @R0,#42H,CHK_CARD20 ;B
INC R0
CJNE @R0,#31H,CHK_CARD20 ;1
INC R0
CJNE @R0,#39H,CHK_CARD20 ;9
MOV P1,#0B0H
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_19 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
;---------------------------------;
;     CHECK CARD 20     ;
;---------------------------------;
CHK_CARD20: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD21 ;2
INC R0
CJNE @R0,#43H,CHK_CARD21 ;C
INC R0
CJNE @R0,#30H,CHK_CARD21 ;0
INC R0
CJNE @R0,#30H,CHK_CARD21 ;0
INC R0
CJNE @R0,#34H,CHK_CARD21 ;4
INC R0
CJNE @R0,#37H,CHK_CARD21 ;7
INC R0
CJNE @R0,#42H,CHK_CARD21 ;B
INC R0
CJNE @R0,#39H,CHK_CARD21 ;9
INC R0
CJNE @R0,#46H,CHK_CARD21 ;F
INC R0
CJNE @R0,#32H,CHK_CARD21 ;2
INC R0
CJNE @R0,#32H,CHK_CARD21 ;2
INC R0
CJNE @R0,#30H,CHK_CARD21 ;0
MOV P1,#0A0H
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_20 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
;---------------------------------;
;     CHECK CARD 21     ;
;---------------------------------;
CHK_CARD21: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD22 ;2
INC R0
CJNE @R0,#43H,CHK_CARD22 ;C
INC R0
CJNE @R0,#30H,CHK_CARD22 ;0
INC R0
CJNE @R0,#30H,CHK_CARD22 ;0
INC R0
CJNE @R0,#34H,CHK_CARD22 ;4
INC R0
CJNE @R0,#42H,CHK_CARD22 ;B
INC R0
CJNE @R0,#44H,CHK_CARD22 ;D
INC R0
CJNE @R0,#44H,CHK_CARD22 ;D
INC R0
CJNE @R0,#42H,CHK_CARD22 ;B
INC R0
CJNE @R0,#33H,CHK_CARD22 ;3
INC R0
CJNE @R0,#30H,CHK_CARD22 ;0
INC R0
CJNE @R0,#39H,CHK_CARD22 ;9
MOV P1,#90H
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_21 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
;---------------------------------;
;     CHECK CARD 22     ;
;---------------------------------;
CHK_CARD22: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD23 ;2
INC R0
CJNE @R0,#43H,CHK_CARD23 ;C
INC R0
CJNE @R0,#30H,CHK_CARD23 ;0
INC R0
CJNE @R0,#30H,CHK_CARD23 ;0
INC R0
CJNE @R0,#34H,CHK_CARD23 ;4
INC R0
CJNE @R0,#42H,CHK_CARD23 ;B
INC R0
CJNE @R0,#44H,CHK_CARD23 ;D
INC R0
CJNE @R0,#31H,CHK_CARD23 ;1
INC R0
CJNE @R0,#33H,CHK_CARD23 ;3
INC R0
CJNE @R0,#38H,CHK_CARD23 ;8
INC R0
CJNE @R0,#38H,CHK_CARD23 ;8
INC R0
CJNE @R0,#45H,CHK_CARD23 ;E
MOV P1,#80H
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_22 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
;---------------------------------;
;     CHECK CARD 23     ;
;---------------------------------;
CHK_CARD23: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,CHK_CARD24 ;2
INC R0
CJNE @R0,#43H,CHK_CARD24 ;C
INC R0
CJNE @R0,#30H,CHK_CARD24 ;0
INC R0
CJNE @R0,#30H,CHK_CARD24 ;0
INC R0
CJNE @R0,#34H,CHK_CARD24 ;4
INC R0
CJNE @R0,#42H,CHK_CARD24 ;B
INC R0
CJNE @R0,#44H,CHK_CARD24 ;D
INC R0
CJNE @R0,#31H,CHK_CARD24 ;1
INC R0
CJNE @R0,#34H,CHK_CARD24 ;4
INC R0
CJNE @R0,#33H,CHK_CARD24 ;3
INC R0
CJNE @R0,#46H,CHK_CARD24 ;F
INC R0
CJNE @R0,#35H,CHK_CARD24 ;5
MOV P1,#70H
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_23 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
;---------------------------------;
;     CHECK CARD 24     ;
;---------------------------------;
CHK_CARD24: MOV R0,#START_POINT_BUFFER
INC R0
CJNE @R0,#32H,OUT_OF_DATA ;2
INC R0
CJNE @R0,#43H,OUT_OF_DATA ;C
INC R0
CJNE @R0,#30H,OUT_OF_DATA ;0
INC R0
CJNE @R0,#30H,OUT_OF_DATA ;0
INC R0
CJNE @R0,#34H,OUT_OF_DATA ;4
INC R0
CJNE @R0,#42H,OUT_OF_DATA ;B
INC R0
CJNE @R0,#44H,OUT_OF_DATA ;D
INC R0
CJNE @R0,#31H,OUT_OF_DATA ;1
INC R0
CJNE @R0,#36H,OUT_OF_DATA ;6
INC R0
CJNE @R0,#43H,OUT_OF_DATA ;C
INC R0
CJNE @R0,#44H,OUT_OF_DATA ;D
INC R0
CJNE @R0,#41H,OUT_OF_DATA ;A
MOV P1,#60H
MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_24 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY
MOV P1,#0FFH
AJMP WAIT_DATA
;---------------------------------;
;       OUT OF DATA      ;
;---------------------------------;
OUT_OF_DATA: MOV LCD_ADDR,#040H ; กำหนดค่า Address เป็น 40H
LCALL SET_ADDR_LCD
MOV DPTR,#TITLE_03 ; กำหนดตัวชี้ตำแหน่งของตัวอักษรที่ต้องการแสดงผล
LCALL WRLINE_LCD ; เรียกโปรแกรมย่อยเพื่อเขียนไปยังตำแหน่ง 40H-4FH
LCALL DELAY_1s
LCALL LCD_OFF ; เรียกโปรแกรมย่อย ปิดจอแสดงผล
LCALL DELAY_1s
LCALL LCD_ON ; เรียกโปรแกรมย่อย เปิดจอแสดงผล
LCALL DELAY_1s
LCALL LCD_OFF ; เรียกโปรแกรมย่อย ปิดจอแสดงผล
LCALL DELAY_1s
LCALL LCD_ON ; เรียกโปรแกรมย่อย เปิดจอแสดงผล
LCALL DELAY_1s
LCALL LCD_OFF ; เรียกโปรแกรมย่อย ปิดจอแสดงผล
LCALL DELAY_1s
LCALL LCD_ON ; เรียกโปรแกรมย่อย เปิดจอแสดงผล
LCALL DELAY
LCALL CLR_BUFFER
LJMP INITIAL
;---------------------------------;
;  CLAER RAM BUFFER   ;
;---------------------------------;
CLR_BUFFER: MOV R0,#START_POINT_BUFFER
CLR A
CLR_BUFFER1: MOV @R0,A
INC R0
CJNE R0,#START_POINT_BUFFER+14,CLR_BUFFER1
RET
;---------------------------------------------------------------------------------
; LCD Initialize โปรแกรมย่อยเพื่อเตรียมการทำงานเริ่มต้น LCD
;---------------------------------------------------------------------------------
INIT_LCD: LCALL DELAY_100ms ; หน่วงเวลา เพื่อให้จอแอลซีดีพร้อมก่อน
CLR P2.7 ; ขา RS เป็น 0 เพื่อแจ้งให้ทราบว่าเป็นการส่งคำสั่ง
MOV P0,#00111000B ; กำหนดโหมดเป็นแบบ 8bit
LCALL LCD_CLK ; ส่งพัลซ์ 1 ลูก ที่ขา Enable
LCALL DELAY_10ms ; หน่วงเวลาเพื่อให้จอฯพร้อมรับคำสั่งถัดไป
LCALL LCD_OFF ; เรียกโปรแกรมย่อย ปิดจอแสดงผล
LCALL LCD_CLR ; เรียกโปรแกรมย่อย ล้างค่าจอแสดงผล
MOV P0,#00000110B ; กำหนดโหมดการป้อนข้อมูล
LCALL LCD_CLK ; ส่งพัลซ์ 1 ลูก ที่ขา Enable
LCALL LCD_HOME ; เรียกโปรแกรมย่อยเพื่อย้ายเคอร์เซอร์ไปยังตำแหน่งแรก
;-----------------------------------------------------------------
; LCD Clear Display โปรแกรมย่อยล้างค่าจอแสดงผล
;-----------------------------------------------------------------
LCD_CLR: CLR P2.7
MOV P0,#00000001B
ACALL LCD_CLK
RET
;----------------------------------------------------------------------------------------
; LCD Return Home โปรแกรมย่อยเพื่อย้ายเคอร์เซอร์ไปยังตำแหน่งแรก
;----------------------------------------------------------------------------------------
LCD_HOME: CLR P2.7
MOV P0,#00000010B
ACALL LCD_CLK
RET
;----------------------------------------------------------
; LCD Display Off โปรแกรมย่อย ปิดจอแสดงผล
;-----------------------------------------------------------
LCD_OFF: CLR P2.7
MOV P0,#00001000B
ACALL LCD_CLK
RET
;--------------------------------------------------------------------
; LCD Clk โปรแกรมย่อยเพื่อ ส่งพัลซ์ 1 ลูก ที่ขา Enable
;--------------------------------------------------------------------
LCD_CLK: SETB P2.6
LCALL LCD_DELAY
CLR P2.6
LCALL LCD_DELAY
RET
;--------------------------------------------------------------
; LCD Display On โปรแกรมย่อย เปิดจอแสดงผล
;--------------------------------------------------------------
LCD_ON: CLR P2.7
MOV P0,#00001100B
LCALL LCD_CLK
RET
;--------------------------------------------------------
; LCD Cursor On โปรแกรมย่อย เปิดเคอร์เซอร์
;--------------------------------------------------------
LCD_BLINK: CLR P2.7
MOV P0,#00001111B
LCALL LCD_CLK
RET
;-------------------------------------------------------------------------------------------
; LCD Left Shift Display โปรแกรมย่อย เลือกการแสดงผลไปทางซ้าย 1 ครั้ง
;--------------------------------------------------------------------------------------------
LCD_LSHF: CLR P2.7
MOV P0,#00011000B
LCALL LCD_CLK
RET
;---------------------------------------------------------------------------------------------
; LCD Right Shift Display โปรแกรมย่อย เลือกการแสดงผลไปทางขวา 1 ครั้ง
;---------------------------------------------------------------------------------------------
LCD_RSHF: CLR P2.7
MOV P0,#00011100B
LCALL LCD_CLK
RET
;----------------------------------------------------------------------------------
; Set LCD Address โปรแกรมย่อยเพื่อกำหนดตำแหน่งในจอแอลซีดี
;---------------------------------------------------------------------------------
SET_ADDR_LCD: CLR P2.7
MOV A,LCD_ADDR
SETB ACC.7
MOV P0,A
LCALL LCD_CLK
RET
;-------------------------------------------------------------------------------------------
; Write Character to show LCD โปรแกรมย่อยเพื่อแสดงตัวอักษรที่ต้องการ
;-------------------------------------------------------------------------------------------
WRCHAR_LCD: SETB P2.7
MOV P0,LCD_DATA
LCALL LCD_CLK
LCALL LCD_ON
RET
;-------------------------------------------------------------------------------------------------------------------
; Write Line of 16 Character from ROM โปรแกรมย่อยเพื่อส่งตัวอักษรจาก ROM ไปจอแอลซีดี
;-------------------------------------------------------------------------------------------------------------------
WRLINE_LCD: MOV R0,#0
WRLINE_LCD_1: SETB P2.7
CLR A
MOVC A,@A+DPTR
MOV P0,A
LCALL LCD_CLK
INC DPTR
INC R0
CJNE R0,#16,WRLINE_LCD_1
LCALL LCD_ON
RET
;---------------------------------------------------------------------------------------
;    DELAY ROUTINE   โปรแกรมย่อยสำหรับหน่วงเวลา
;---------------------------------------------------------------------------------------
LCD_DELAY: MOV R7,#002
LCD_DELAY_1: MOV R6,#0E6H
LCD_DELAY_2: NOP
NOP
DJNZ R6,LCD_DELAY_2
DJNZ R7,LCD_DELAY_1
RET
DELAY_10ms: MOV R7,#010
DELAY_10ms_1: MOV R6,#0E6H
DELAY_10ms_2: NOP
NOP
DJNZ R6,DELAY_10ms_2
DJNZ R7,DELAY_10ms_1
RET
DELAY_100ms: MOV R7,#100
DELAY_100ms_1: MOV R6,#0E6H
DELAY_100ms_2: NOP
NOP
DJNZ R6,DELAY_100ms_2
DJNZ R7,DELAY_100ms_1
RET
DELAY_1s: MOV R5,#100
DELAY_1s_1: LCALL DELAY_10ms
DJNZ R5,DELAY_1s_1
RET
DELAY: MOV R2,#250
DEL1: MOV R3,#80
DEL2: MOV R4,#80
DJNZ R4,$
DJNZ R3,DEL2
DJNZ R2,DEL1
RET
;-------------------------------------------------------------------------------------
; กำหนดค่าข้อมูลของตัวอักษรที่ต้องการ เก็บไว้ที่หน่วยความจำ ROM
; Define Constant ( Store in Flash EEPROM Program Memory )
;-------------------------------------------------------------------------------------
TITLE_01: DFB "AUTO CAR PARKING "
TITLE_02: DFB " Proximity card  "
TITLE_03: DFB "  Unknown card   "
TITLE_04: DFB "AUTOMATIC CAR   "
TITLE_05: DFB "PARKING           "
TITLE_1: DFB "  User ID :  1      "
TITLE_2: DFB "  User ID :  2      "
TITLE_3: DFB "  User ID :  3      "
TITLE_4: DFB "  User ID :  4      "
TITLE_5: DFB "  User ID :  5      "
TITLE_6: DFB "  User ID :  6      "
TITLE_7: DFB "  User ID :  7      "
TITLE_8: DFB "  User ID :  8      "
TITLE_9: DFB "  User ID :  9      "
TITLE_10: DFB "  User ID :  10     "
TITLE_11: DFB "  User ID :  11     "
TITLE_12: DFB "  User ID :  12     "
TITLE_13: DFB "  User ID :  13     "
TITLE_14: DFB "  User ID :  14     "
TITLE_15: DFB "  User ID :  15     "
TITLE_16: DFB "  User ID :  16     "
TITLE_17: DFB "  User ID :  17      "
TITLE_18: DFB "  User ID :  18      "
TITLE_19: DFB "  User ID :  19      "
TITLE_20: DFB "  User ID :  20      "
TITLE_21: DFB "  User ID :  21      "
TITLE_22: DFB "  User ID :  22      "
TITLE_23: DFB "  User ID :  23      "
TITLE_24: DFB "  User ID :  24      "





หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: JUB ที่ เมษายน 29, 2011, 12:49:31 pm
program ที่แยกไว้ก็คือ library ครับ
เวลาจะใช้ก็ call เอา แต่ program ทั้งหมดต้องใช้
mem ร่วมกัน จึงต้องแบ่งให้ชัดเจน เช่น key buffer อยู่ 40h - 48h
buffer ของ i2c อยู่ 50h- 55h เวลาเรียก library
ก็อ้างตำแหน่งดังกล่าวในการอ่านเขียนหรือส่งผ่านข้อมูล.....


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ เมษายน 29, 2011, 01:14:53 pm
ตรงนี้ไม่รู้จริงๆครับ undecided2 undecided2 undecided2


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ เมษายน 29, 2011, 01:19:32 pm
แต่ส่วนที่เป็นโปรแกรมย่อย แล้วเรียกใช้งานใน main program พอเข้าใจครับ


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: JUB ที่ เมษายน 29, 2011, 04:27:07 pm
เดียวเอาตัวอย่างให้ดู.....


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: JUB ที่ เมษายน 29, 2011, 06:17:17 pm
ตัวอย่างครับ เป็นการส่งค่า Hello ออก lcd
จะเห็นว่ามี library สองตัว spi และ 4 bit
โดยการใช้งานจะส่งค่าผ่าน acc register เป็นหลัก
ถ้าผมต้องการ interface กับ lcd แบบ 4 bit
ผมก็ไปใช้ library 4 bit ถ้าต้องการใช้ lcd
แบบ spi ผมก็ไปใช้ library ของ spi แทน
ซึ่ง main program ไม่ต้องแก้อะไรเลย

library มันก็เหมือนกับ driver นั่นแหละ
จะติดต่อกับอะไรก็ผ่าน driver แทน
เช่นผมอาจจะสร้าง driver ของ  I2c-24c256

ผมอาจจะใช้คำสั่งหลักๆใน library ดังนี้
1. write_i2c:
2. read_i2c:
3. init_i2c:

โดยทั้งหมดส่งค่าผ่าน acc register เช่น
ผมต้องการเขียนข้อมูล 0xfa ไปยัง i2c

     mov     a,#0fah
     acall   write_i2c

เป็นต้น.........
นี่คือทั้งหมดแล้วครับ ขึ้นอยู่กับคุณว่าจะทำความเข้าใจได้มากน้อยแค่ไหน.....

memory map ก็คือ ช่วงของข้อมูล ที่เรากำหนดไว้ใช้ใน main กับ library ต่างๆ....
ซึ่งบางทีอาจมีตำแหน่งเดียวกันหรือต่างกันก็ได้....

main program
โค๊ด:
;//*** reset vector ***//;
        org    0000h
        ajmp    initial
       
;//*** ap start ***//;   
        org    0030h
initial:    mov    p1,#0ffh
        mov    p3,#0ffh
        mov    sp,#070h
        mov    r0,#07fh
        clr    a
        mov    @r0,a
        djnz    r0,$-1

;//*** main program ***//;       
main:        acall    lcdinit        ;--->>> library call initial lcd

        mov    a,#"H"        ;--->>> load data to acc (data link to library)
        acall    lcdputchar    ;--->>> library call put one char from acc
       
        mov    a,#"e"        ;--->>> load data to acc (data link to library)
        acall    lcdputchar    ;--->>> library call put one char from acc
       
        mov    a,#"l"        ;--->>> load data to acc (data link to library)
        acall    lcdputchar    ;--->>> library call put one char from acc
       
        mov    a,#"l"        ;--->>> load data to acc (data link to library)
        acall    lcdputchar    ;--->>> library call put one char from acc
       
        mov    a,#"o"        ;--->>> load data to acc (data link to library)
        acall    lcdputchar    ;--->>> library call put one char from acc

        ajmp    main
       
;//*** lcd library spi interface ***//;
lcd_dat    bit    p1.0
lcd_lat    bit    p1.1
lcd_clk    bit    p1.2
$include (lcdspi.asm)

;//*** lcd library 4bit interface ***//;
;lcd_rw    bit    p1.0
;lcd_rs    bit    p1.1
;lcd_e    bit    p1.2
;lcd_db4    bit    p1.3
;lcd_db5    bit    p1.4
;lcd_db6    bit    p1.5
;lcd_db7    bit    p1.6
;$include (lcd4bit.asm)

        end

spi library
โค๊ด:
;//******************************//;
;//* 74HC595 DRIVE LCD LIBRARY  *//;
;//******************************//;
;//* AUTHOR BY SOMLAK MANGNIMIT *//;
;//* DATE: 8/11/2009            *//;
;//* FILE VERSION 2.0           *//;
;//* LAST UPDATE 18/11/2009     *//;
;//******************************//;

;//******************************//;
;//* HOW TO USE SPI LCD LIBRARY *//;
;//******************************//;
;1.SET PORT&PIN NAME
;LCD_DAT    BIT    P1.0    ;CONNECT TO ETT SPI PIN 2
;LCD_LAT    BIT    P1.1    ;CONNECT TO ETT SPI PIN 3
;LCD_CLK    BIT    P1.2    ;CONNECT TO ETT SPI PIN 4

;2.USE CALL LCDINIT

;3.LIBRARY CALL
;3.1 (LCDPUTCMD) USE FOR WRITE COMMAND TO LCD
;3.2 (LCDPUTCHAR) USE FOR WRITE DATA TO LCD

;//***CAUTION!!!***//;
;THIS LIBRARY NOT CHECK LCD BUSY FLAG AND USE FOR X-TAL 11.0592MHZ.
;WHEN USE OTHER FREQ LCD DELAY NEED TO CALIBRATION.
;WHEN USE LCD CLEAR AND RETURN HOME COMMAND. AFTER COMMAND NEED WAIT > 2.5MS

;//***REGISTER IN USE***//;
;REGISTER "ACC"    **DESTROY AFTER USE LIB CALL**
;REGISTER "B"    **DESTROY AFTER USE LIB CALL**
;REGISTER "R0"    **NOT USE AFTER LCD INITIAL**
;REGISTER "R1"    **NOT USE AFTER LCD INITIAL**

;//*******************************//;
;//* DATA BIT FOR SHIFT REGISTER *//;
;//*******************************//;

LCD_BL        BIT    ACC.0
LCD_RS        BIT    ACC.1
LCD_RW        BIT    ACC.2
LCD_E        BIT    ACC.3
LCD_DB4        BIT    ACC.4
LCD_DB5        BIT    ACC.5
LCD_DB6        BIT    ACC.6
LCD_DB7        BIT    ACC.7

;//**********************//;
;//* LCD INITIALISATION *//;
;//**********************//;

LCDINIT:    CLR    LCD_LAT
        CLR    LCD_CLK
        MOV    A,#000H
        CALL    MOVE_DATA
        CALL    LCDDELAY15M
        MOV    A,#030H
        CALL    LCDRESETCMD
        CALL    LCDDELAY5M
        MOV    A,#030H
        CALL    LCDRESETCMD
        CALL    LCDDELAY100U
        MOV    A,#030H
        CALL    LCDRESETCMD

;//**************//;
;//* 4 BIT MODE *//;
;//**************//;

        MOV    A,#020H
        CALL    LCDRESETCMD

;//****************//;
;//* FUNCTION SET *//;
;//****************//;

        MOV    A,#028H            ;4-BIT-INTERFACE,2-LINES
        CALL    LCDPUTCMD

;//***************//;
;//* DISPLAY OFF *//;
;//***************//;

        MOV    A,#008H            ;DISP.OFF,CURS.OFF,NO-BLINK
        CALL    LCDPUTCMD
       
;//*****************//;
;//* DISPLAY CLEAR *//;
;//*****************//;

        MOV    A,#001H
            CALL    LCDPUTCMD
            CALL    LCDDELAY5M

;//******************//;
;//* ENTRY MODE SET *//;
;//******************//;

        MOV    A,#006H            ;AUTO-INC (SHIFT-CURSOR)
        CALL    LCDPUTCMD

;//**************//;
;//* DISPLAY ON *//;
;//**************//;

        MOV    A,#00CH            ;DISP.ON,CURS.OFF
        JMP    LCDPUTCMD

 ;//*******************//;
;//* WRITE CHARACTER *//;
;//*******************//;

LCDPUTCHAR:    CALL    LCDBUSY
        PUSH    ACC
            CLR    LCD_RW
            SETB    LCD_RS
            SETB    LCD_E
            CALL    MOVE_DATA
            POP    ACC
            SWAP    A
            CLR    LCD_RW
            SETB    LCD_RS
            SETB    LCD_E
            CLR    LCD_E
            CALL    MOVE_DATA
            RET

;//********************************//;
;//* INTERNAL RESET WRITE COMMAND *//;
;//********************************//;

LCDRESETCMD:    CLR    LCD_RW
            SETB    LCD_E
            CLR    LCD_E
            CALL    MOVE_DATA
            RET

;//*****************//;
;//* WRITE COMMAND *//;
;//*****************//;

LCDPUTCMD:    CALL    LCDBUSY
        PUSH    ACC
            CLR    LCD_RW
            CLR    LCD_RS
            SETB    LCD_E
            POP    ACC
            SWAP    A
            CLR    LCD_RW
            CLR    LCD_RS
            SETB    LCD_E
            CALL    MOVE_DATA
            CLR    LCD_E
            RET

;//*******************************//;
;//* SEND DATA TO SHIFT REGISTER *//;
;//*******************************//;

MOVE_DATA:    SETB    LCD_BL
        PUSH    ACC
        MOV    B,#8
SHIFT:        RLC    A
        MOV    LCD_DAT,C
        SETB    LCD_CLK
        NOP
        CLR    LCD_CLK
        DJNZ    B,SHIFT
        NOP
        CLR    LCD_LAT
        POP    B
        POP    ACC
        RET

;//*****************//;       
;//* DELAY ROUTINE *//;
;//*****************//;

LCDBUSY:    PUSH    B
        MOV    B,#20
        POP    B
        RET

LCDDELAY100U:    MOV    R0,#50
        DJNZ    R0,$
        RET

LCDDELAY5M:    MOV    R0,#5
        SJMP    LCDDELAY

LCDDELAY15M:    MOV    R0,#15
        SJMP    LCDDELAY

;//*********************//;
;//* SUB DELAY ROUTINE *//;
;//*********************//;

LCDDELAY:    MOV    R1,#230
LCDDELAY1:    NOP
        NOP
        DJNZ    R1,LCDDELAY1
        RET

;//****************************//;
;//* END OF LCD 4 BIT LIBRARY *//;
;//****************************//;

4bit library
โค๊ด:
;//***************************//;
;//*    LCD 4 BIT LIBARRY    *//;
;//***************************//;
;//* USE FOR MCS-51 CPU      *//;
;//* REGISTER : R0,R1,ACC,B  *//;
;//* By Somlak Mangnimit     *//;
;//* DATE 10/07/2009         *//;
;//* LAST UPDATE 18/11/2009  *//;
;//***************************//;

;//* PORT&PIN NAME USE FOR THIS LIB *//;
;LCD_RW
;LCD_RS
;LCD_E
;LCD_DB4
;LCD_DB5
;LCD_DB6
;LCD_DB7

;//**********************//;
;//* LCD INITIALISATION *//;
;//**********************//;

LCDINIT:    CLR    LCD_RW
        CLR    LCD_RS
        CLR    LCD_E
        MOV    A,#000H
        ACALL    MOVE_DATA
        ACALL    LCDDELAY15M
        MOV    A,#030H
        ACALL    LCDRESETCMD
        ACALL    LCDDELAY5M
        ACALL    LCDDELAY100U
        MOV    A,#030H
        ACALL    LCDRESETCMD

;//**************//;
;//* 4 BIT MODE *//;
;//**************//;

        MOV    A,#020H
        ACALL    LCDRESETCMD

;//****************//;
;//* FUNCTION SET *//;
;//****************//;

        MOV    A,#028H            ;4-BIT-INTERFACE,2-LINES
        ACALL    LCDPUTCMD

;//***************//;
;//* DISPLAY OFF *//;
;//***************//;

        MOV    A,#008H            ;DISP.OFF,CURS.OFF,NO-BLINK
        ACALL    LCDPUTCMD
       
;//*****************//;
;//* DISPLAY CLEAR *//;
;//*****************//;

        MOV    A,#001H
            ACALL    LCDPUTCMD

;//******************//;
;//* ENTRY MODE SET *//;
;//******************//;

        MOV    A,#006H            ;AUTO-INC (SHIFT-CURSOR)
        ACALL    LCDPUTCMD

;//**************//;
;//* DISPLAY ON *//;
;//**************//;

        MOV    A,#00CH            ;DISP.ON,CURS.OFF
        AJMP    LCDPUTCMD

;//*******************//;
;//* BUSY FLAG CHECK *//;
;//*******************//;

LCDBUSY:    MOV    A,#0FFH
        ACALL    MOVE_DATA
            CLR    LCD_RS
            SETB    LCD_RW
            SETB    LCD_E
            MOV    C,LCD_DB7
            CLR    LCD_E
            NOP
            SETB    LCD_E
            JC    LCDBUSY
LCDNOTBUSY:    CLR    LCD_RW
            MOV    A,#000H
            AJMP    MOVE_DATA

;//*******************//;
;//* WRITE CHARACTER *//;
;//*******************//;

LCDPUTCHAR:    PUSH    B
        MOV    B,A
        ACALL    LCDBUSY
            CLR    LCD_RW
            SETB    LCD_RS
            MOV    A,B
            SETB    LCD_E
            SWAP    A
            SETB    LCD_E
            ACALL    MOVE_DATA
            CLR    LCD_E
            POP    B
            RET

;//********************************//;
;//* INTERNAL RESET WRITE COMMAND *//;
;//********************************//;

LCDRESETCMD:    PUSH    B
        MOV    B,A
        ACALL    LCDBUSY
        CLR    LCD_RW
            CLR    LCD_RS
            MOV    A,B
            SETB    LCD_E
            ACALL    MOVE_DATA
            CLR    LCD_E
            POP    B
            RET

;//*****************//;
;//* WRITE COMMAND *//;
;//*****************//;

LCDPUTCMD:    PUSH    B
        MOV    B,A
        ACALL    LCDBUSY
            CLR    LCD_RW
            CLR    LCD_RS
            MOV    A,B
            SWAP    A
            SETB    LCD_E
            ACALL    MOVE_DATA
            CLR    LCD_E
            POP    B
            RET

;//*************************//;
;//* MOVE DATA TO LCD PORT *//;
;//*************************//;

MOVE_DATA:    MOV    C,ACC.4
        MOV    LCD_DB4,C
        MOV    C,ACC.5
        MOV    LCD_DB5,C
        MOV    C,ACC.6
        MOV    LCD_DB6,C
        MOV    C,ACC.7
        RET

;//*****************//;       
;//* DELAY ROUTINE *//;
;//*****************//;

LCDDELAY100U:    MOV    R0,#50
        DJNZ    R0,$
        RET

LCDDELAY5M:    MOV    R0,#5
        SJMP    LCDDELAY

LCDDELAY15M:    MOV    R0,#15
        SJMP    LCDDELAY

;//*********************//;
;//* SUB DELAY ROUTINE *//;
;//*********************//;

LCDDELAY:    MOV    R1,#230
LCDDELAY1:    NOP
        NOP
        DJNZ    R1,LCDDELAY1
        RET

;//****************************//;
;//* END OF LCD 4 BIT LIBRARY *//;
;//****************************//;


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ เมษายน 29, 2011, 07:06:15 pm
ไม่รู้ว่าผมเข้าใจถูกหรือป่าวครับ  ว่า    library มันก็คือโปรแกรมย่อยหนึ่ง  ที่เตรียมไว้เพื่อเรียกใช้ในโปรแกรมหลัก  แล้วเมื่อ  library ทำงานของตัวเองเรียบร้อยแล้ว ก็จะย้อนกับมาที่ โปรแกรมหลัก

แล้วโปรแกรมผมก็ต้อง แยก  library  ไว้ แล้วเขียนให้โปรแกรมหลักเรียกใช้เอา


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: JUB ที่ เมษายน 29, 2011, 11:44:08 pm
ใกล้เคียงครับ library มันก็คือ driver นั่นแหละ เวลาแก้ไขมันจะง่าย....
อย่างวงจรที่คุณออกแบบมา ก็ต้องมี driver ของ

1.keypad
2.I2C eeprom
3.PLC
4.LCD
................bra bra bra......

ต้องการให้อุปกรณ์ตัวไหนทำไร ก็เรียกใช้ใน main ผ่าน driver
โดยอาจ reserved ram ไว้ใช้งานใน main ไว้ส่วนนึ่ง

เช่น ผมต้องการอ่านค่า key ออก lcd
ใน main ผมอาจจะเขียนอย่างนี้....


//******main*****//

main:    acall     read_keypad                ;--->>> library call return value in acc
             add      a,#30                           ;--->>> convert to ascii
             acall     lcdputchar                    ;--->>> library call send char data in acc to lcd

เขียนแบบนี้มันจะแก้ไขได้ง่าย เช่นหากติดต่อกับ อุปกรณ์ไหนแล้วมีปัญหา
ก็ไปแก้ไข driver แล้วก็ test program ใน main แทน........


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ พฤษภาคม 04, 2011, 03:45:22 pm
 undecided2 ไม่รู้จะเริ่มยังไง ได้แต่หลักการ undecided2


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: JUB ที่ พฤษภาคม 04, 2011, 04:03:27 pm
เขียน program interface อปกรณ์แต่ละตัวได้หรือยัง.....

ถ้าไม่ได้จริงๆก็คงต้องจ้างทำล่ะครับ... ง่ายตอนส่งลำบากตอน presence.....  :)


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ พฤษภาคม 04, 2011, 05:50:00 pm
ก็คงจะเป็นอย่างงั้นครับ  >:( แต่ถ้าจ้างจริงก็คงต้องจ้างเป็น asm นี่แหละครับ  แล้วก็คงต้องทำความเข้าใจเอง


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ พฤษภาคม 04, 2011, 05:54:19 pm
 undecided2 คงเป็นเพราะพื้นฐานไม่ค่อยแน่น แต่ เรื่องอื่นก็เสร็จหมดแล้ว เหลือไมโครอย่างเดียวเลย  :D


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: RANGSAN007 ที่ พฤษภาคม 08, 2011, 09:36:16 am
ท่าน JUB รับทำไหมครับ   :) :) :) :) ;) :) ;)


หัวข้อ: Re: RFID กับ MCS-51 ขอความช่วยเหลือครับ
เริ่มหัวข้อโดย: JUB ที่ พฤษภาคม 08, 2011, 03:03:06 pm
ไม่ได้รับงาน project ครับ ลองไปเดิน บ้านหม้อดูครับ มีร้านรับทำเยอะเหมือนกัน...  :)