RFID กับ MCS-51 ขอความช่วยเหลือครับ
LSVคลังสมองออนไลน์ "ปีที่14"
พฤศจิกายน 24, 2024, 11:07:27 pm *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
 
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: 1 [2]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: RFID กับ MCS-51 ขอความช่วยเหลือครับ  (อ่าน 26551 ครั้ง)
JUB
Full Member
member
**

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

กระทู้: 1157



« ตอบ #29 เมื่อ: เมษายน 29, 2011, 07:49:26 am »

เขียน program initerface อุปกรณ์แต่ละตัวแล้วแยกไว้...
เช่น ส่วนการแสดงผล lcd ส่วนรับค่า key และ card
ที่เหลือก็มี i2c กับ plc
บันทึกการเข้า

RANGSAN007
member
*

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

กระทู้: 38


« ตอบ #30 เมื่อ: เมษายน 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      "



บันทึกการเข้า
RANGSAN007
member
*

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

กระทู้: 38


« ตอบ #31 เมื่อ: เมษายน 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
บันทึกการเข้า
RANGSAN007
member
*

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

กระทู้: 38


« ตอบ #32 เมื่อ: เมษายน 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
บันทึกการเข้า
JUB
Full Member
member
**

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

กระทู้: 1157



« ตอบ #33 เมื่อ: เมษายน 29, 2011, 12:18:31 pm »

กำหนด memmory map ด้วยครับ
เพราะตอนเราเขียน main program จะต้องอ้างตำแหน่ง
ของ memory และ commend ใน program ย่อยด้วยว่า
มีการใช้ register ตัวใดบ้าง buffer ตำแหน่งใด
ค่าที่ส่งผ่านและค่าที่รับได้อยู่ตำแหน่งไหน...... เอาให้ละเอียด
เพราะมันจะเป็นเหมือน library ที่เราต้องเรียกใช้ใน main programs
....
บันทึกการเข้า
RANGSAN007
member
*

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

กระทู้: 38


« ตอบ #34 เมื่อ: เมษายน 29, 2011, 12:23:32 pm »

 Angry  ไม่ค่อยเข้าใจครับ
บันทึกการเข้า
RANGSAN007
member
*

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

กระทู้: 38


« ตอบ #35 เมื่อ: เมษายน 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      "



บันทึกการเข้า
JUB
Full Member
member
**

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

กระทู้: 1157



« ตอบ #36 เมื่อ: เมษายน 29, 2011, 12:49:31 pm »

program ที่แยกไว้ก็คือ library ครับ
เวลาจะใช้ก็ call เอา แต่ program ทั้งหมดต้องใช้
mem ร่วมกัน จึงต้องแบ่งให้ชัดเจน เช่น key buffer อยู่ 40h - 48h
buffer ของ i2c อยู่ 50h- 55h เวลาเรียก library
ก็อ้างตำแหน่งดังกล่าวในการอ่านเขียนหรือส่งผ่านข้อมูล.....
บันทึกการเข้า
RANGSAN007
member
*

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

กระทู้: 38


« ตอบ #37 เมื่อ: เมษายน 29, 2011, 01:14:53 pm »

ตรงนี้ไม่รู้จริงๆครับ
บันทึกการเข้า
RANGSAN007
member
*

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

กระทู้: 38


« ตอบ #38 เมื่อ: เมษายน 29, 2011, 01:19:32 pm »

แต่ส่วนที่เป็นโปรแกรมย่อย แล้วเรียกใช้งานใน main program พอเข้าใจครับ
บันทึกการเข้า
JUB
Full Member
member
**

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

กระทู้: 1157



« ตอบ #39 เมื่อ: เมษายน 29, 2011, 04:27:07 pm »

เดียวเอาตัวอย่างให้ดู.....
บันทึกการเข้า
JUB
Full Member
member
**

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

กระทู้: 1157



« ตอบ #40 เมื่อ: เมษายน 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 *//;
;//****************************//;
บันทึกการเข้า
RANGSAN007
member
*

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

กระทู้: 38


« ตอบ #41 เมื่อ: เมษายน 29, 2011, 07:06:15 pm »

ไม่รู้ว่าผมเข้าใจถูกหรือป่าวครับ  ว่า    library มันก็คือโปรแกรมย่อยหนึ่ง  ที่เตรียมไว้เพื่อเรียกใช้ในโปรแกรมหลัก  แล้วเมื่อ  library ทำงานของตัวเองเรียบร้อยแล้ว ก็จะย้อนกับมาที่ โปรแกรมหลัก

แล้วโปรแกรมผมก็ต้อง แยก  library  ไว้ แล้วเขียนให้โปรแกรมหลักเรียกใช้เอา
บันทึกการเข้า
JUB
Full Member
member
**

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

กระทู้: 1157



« ตอบ #42 เมื่อ: เมษายน 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 แทน........
บันทึกการเข้า
RANGSAN007
member
*

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

กระทู้: 38


« ตอบ #43 เมื่อ: พฤษภาคม 04, 2011, 03:45:22 pm »

  ไม่รู้จะเริ่มยังไง ได้แต่หลักการ
บันทึกการเข้า
JUB
Full Member
member
**

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

กระทู้: 1157



« ตอบ #44 เมื่อ: พฤษภาคม 04, 2011, 04:03:27 pm »

เขียน program interface อปกรณ์แต่ละตัวได้หรือยัง.....

ถ้าไม่ได้จริงๆก็คงต้องจ้างทำล่ะครับ... ง่ายตอนส่งลำบากตอน presence.....  Smiley
บันทึกการเข้า
RANGSAN007
member
*

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

กระทู้: 38


« ตอบ #45 เมื่อ: พฤษภาคม 04, 2011, 05:50:00 pm »

ก็คงจะเป็นอย่างงั้นครับ  Angry แต่ถ้าจ้างจริงก็คงต้องจ้างเป็น asm นี่แหละครับ  แล้วก็คงต้องทำความเข้าใจเอง
บันทึกการเข้า
RANGSAN007
member
*

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

กระทู้: 38


« ตอบ #46 เมื่อ: พฤษภาคม 04, 2011, 05:54:19 pm »

  คงเป็นเพราะพื้นฐานไม่ค่อยแน่น แต่ เรื่องอื่นก็เสร็จหมดแล้ว เหลือไมโครอย่างเดียวเลย  Cheesy
บันทึกการเข้า
RANGSAN007
member
*

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

กระทู้: 38


« ตอบ #47 เมื่อ: พฤษภาคม 08, 2011, 09:36:16 am »

ท่าน JUB รับทำไหมครับ   Smiley Smiley Smiley Smiley Wink Smiley Wink
บันทึกการเข้า
JUB
Full Member
member
**

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

กระทู้: 1157



« ตอบ #48 เมื่อ: พฤษภาคม 08, 2011, 03:03:06 pm »

ไม่ได้รับงาน project ครับ ลองไปเดิน บ้านหม้อดูครับ มีร้านรับทำเยอะเหมือนกัน...  Smiley
บันทึกการเข้า
หน้า: 1 [2]   ขึ้นบน
  พิมพ์  
 
กระโดดไป:  

Powered by MySQL Powered by PHP Powered by SMF 1.1 RC2 | SMF © 2001-2006, Lewis Media

lsv2555Please follow the new website at https://www.pohchae.com

Valid CSS!