?? pt2272.asm
字號:
DJNZ R5, GETC_3P ;循環接收8個數據位,進行16次采樣
SETB SIGING
CLR C
RET
GETC_E: CLR SIGING
GETC_F: SETB C
RET
; =========================================================================================
; =========================================================================================
FIND: MOV A, RBUF44 ;分析代碼
CJNE A, #MYA0_3, FIND_E
MOV R4, RBUF81
MOV R5, RBUF82
MOV R6, #7
MOV R0, #00H
MOV R1, #00H
FIND_L: MOV A, R0 ;結果乘以 3
CLR C
RLC A
MOV B, A
MOV A, R1
RLC A
XCH A, B
ADD A, R0
MOV R0, A
MOV A, B
ADDC A, R1
MOV R1, A ;結果乘以 3 結束
MOV A, R4
RLC A
MOV R4, A ;D7-->C
MOV A, R5
RL A
MOV R5, A
ANL A, #01H ;D7-->A.0
ADDC A, R0 ;A.0+C+R0
MOV R0, A
MOV A, R1
ADDC A, #00H
MOV R1, A
DJNZ R6, FIND_L ;確定A4-A10的編碼結果
CLR A
MOV C, RBUF81.0 ;分析代碼,確定是否主控手機
MOV ACC.0, C
MOV C, RBUF82.0
ADDC A, #00H ;A=(0,1,2)。A=0:非主控手機;A=1:主控手機;A=2:無效手機
JB ACC.1, FIND_E ;A=2!
MOV CODEL, R0
MOV CODEH, R1
CLR C
RET ;A=0/1
FIND_E: SETB C
RET
; =========================================================================================
; =========================================================================================
EECHK: MOV EEPTRL, #00H ;0000H記錄不用,因為0000H用于判斷EEPROM是否空
MOV EEPTRH, #00H
MOV EEBUF, #00H
MOV EEBUF+1, #00H
EECHK0: MOV CODEL, EEBUF ;放到編碼緩沖區
MOV CODEH, EEBUF+1
ANL CODEH, #0FH
MOV DPL, EEPTRL ;讀取棧底的兩個字節
MOV DPH, EEPTRH
INC DPTR
INC DPTR ;指向下一個記錄,但是暫時不修改指針
MOV A, DPH
ADD A, #HIGH(65536-EESIZE) ;???
JC EECHK9 ;已經檢查完所有記錄空間。
MOV EEPOL, DPL
MOV EEPOH, DPH ;暫時保存在這里
MOV R0, #EEBUF
MOV B, #02H
ACALL I2CD_R
MOV A, EEBUF+1
ANL A, #0F0H
XRL A, #PWDF
JNZ EECHK9
MOV EEPTRL, EEPOL
MOV EEPTRH, EEPOH
AJMP EECHK0
EECHK9: CLR EEEMPTY ;假設非空
MOV A, EEPTRL
ORL A, EEPTRH
JNZ EECHKE
SETB EEEMPTY ;聲明EEPROM空
EECHKE: RET
; =========================================================================================
; =========================================================================================
EEPUSH: MOV EEBUF, CODEL ;寫入EEPROM棧,采用實棧頂
MOV EEBUF+1, CODEH
ORL EEBUF+1, #PWDF ;標志,50H
MOV DPL, EEPTRL
MOV DPH, EEPTRH
INC DPTR ;每個記錄進入,指針加 2
INC DPTR
MOV A, DPH ;進行堆棧溢出檢查
ADD A, #HIGH(65536-EESIZE)
JC EEPUSHE
ANL DPL, #0FEH
MOV EEPTRL, DPL
MOV EEPTRH, DPH
MOV R0, #EEBUF
MOV B, #02H
ACALL I2CD_W
CLR EEEMPTY ;聲明EEPROM非空
EEPUSHE:RET
; =========================================================================================
; =========================================================================================
EEPOP: MOV A, EEPTRL ;EEPROM退出操作
ORL A, EEPTRH
JZ EEPOPB
EEPOP0: MOV EEPOL, EEPTRL
MOV EEPOH, EEPTRH
CLR C ;指針減 2,指向上一個數據
MOV A, EEPTRL
SUBB A, #02H
MOV EEPTRL, A
MOV A, EEPTRH
SUBB A, #00H
MOV EEPTRH, A ;指針已經更新
MOV A, EEPTRL ;檢查退出一個記錄后,堆棧是否變空?
ORL A, EEPTRH
JNZ EEPOP1
MOV CODEL, A
MOV CODEH, A
SETB EEEMPTY ;聲明EEPROM空
AJMP EEPOP9
EEPOP1: MOV DPL, EEPTRL ;讀取棧頂記錄
MOV DPH, EEPTRH
MOV R0, #EEBUF
MOV B, #02H
ACALL I2CD_R
MOV CODEL, EEBUF ;放到編碼緩沖區
MOV CODEH, EEBUF+1
ANL CODEH, #0FH ;屏蔽掉標志
EEPOP9: MOV EEBUF, #00H ;清除剛才已經退棧的記錄
MOV EEBUF+1, #00H
MOV DPL, EEPOL
MOV DPH, EEPOH
MOV R0, #EEBUF
MOV B, #02H
ACALL I2CD_W
ACALL TOBUF ;送到顯示緩沖區
ACALL LEDOFF
EEPOPB: MOV A, #2-1
ACALL BELL_S ;鳴響
; MOV BELLTM, #30
EEPOPE: RET
; =========================================================================================
; =========================================================================================
TOBUF: MOV A, CODEL ;填寫顯示緩沖區
MOV B, CODEH ;/100
MOV R2, #00H
TOBUF_0:CLR C
SUBB A, #100
XCH A, B
SUBB A, #00H
XCH A, B
JC TOBUF_8
INC R2
AJMP TOBUF_0
TOBUF_8:ADD A, #100
MOV B, #10
DIV AB
MOV DPTR, #FONT
MOVC A, @A+DPTR
MOV DBUF1, A
MOV A, B
MOVC A, @A+DPTR
MOV DBUF0, A
MOV A, R2
MOVC A, @A+DPTR
MOV DBUF2, A
MOV CODELK, CODEL
MOV CODEHK, CODEH
RET
; =========================================================================================
; =========================================================================================
DELAY: PUSH ACC ;延遲時間=A*10ms
MOV A, #20
DLY1: PUSH ACC
MOV A, #250
DJNZ ACC, $ ;500us
POP ACC
DJNZ ACC, DLY1
POP ACC
DJNZ ACC, DELAY
RET
;======= I2C 子程序 =================================================================
; I2CD_W, I2CD_R ;LAYER 1
; I2C_O, I2C_I ;LAYER 2
; I2C_BG, I2C_ED ;LAYER 3
;========================================================================================
; 向存儲器寫入幾個字節,最多8個字節。
; 入口:DPTR 要寫的EEPROM存儲單元地址。
; R0 指向要寫入字節在RAM的首地址。
; B 寫入字節個數。
; 出口:如果 C=1,說明寫出錯。
I2CD_W: ACALL I2C_BG
MOV A, #10100000B ;寫命令
ACALL I2C_O
JC I2CD_WE ;C=1, 未收到 ACK 位,出錯,不再繼續處理,直接返回
MOV A, DPH
ACALL I2C_O
JC I2CD_WE
MOV A, DPL
ACALL I2C_O
JC I2CD_WE
I2CD_WL:MOV A, @R0
ACALL I2C_O
JC I2CD_WE
INC R0
DJNZ B, I2CD_WL
ACALL I2C_ED
CLR C
RET
I2CD_WE:ACALL I2C_ED
SETB C
RET
; =========================================================================================
; 從 EEPROM 讀入幾個字節
; 入口:DPTR 要讀的存儲單元地址。
; R0 指向要讀緩沖區在RAM的首地址。
; B 讀入字節個數。
; 出口:讀到的內容在緩沖區中,如果 C=1,說明讀出錯。
I2CD_R: ACALL I2C_BG
MOV A, #10100000B ;先發送[寫]命令
ACALL I2C_O
JC I2CD_RE ;C=1, 未收到 ACK 位,出錯,不再繼續處理,直接返回
MOV A, DPH ;發送地址低位
ACALL I2C_O
JC I2CD_RE
MOV A, DPL ;發送地址低位
ACALL I2C_O
JC I2CD_RE
ACALL I2C_BG
MOV A, #10100001B ;發送讀命令
ACALL I2C_O
JC I2CD_RE
I2CD_IB:MOV DPL, #08H ;取得一個字節
SETB SDA
I2CD_IL:SETB SCL ;SCL=1
NOP
MOV C, SDA ;MCU 采樣 SDA,送到 C 中
RLC A ;C->ACC.0
CLR SCL ;SCL=0
DJNZ DPL, I2CD_IL ;得到的一個字節在 ACC 中
MOV @R0, A
INC R0
MOV A, B
XRL A, #01H
JZ I2CD_GO
CLR SDA
NOP
I2CD_GO:SETB SCL
NOP
CLR SCL
DJNZ B, I2CD_IB ;取得不止一個字節
ACALL I2C_ED
CLR C
RET
I2CD_RE:ACALL I2C_ED
SETB C
RET
; =========================================================================================
;向 IIC 總線發送一個字節
I2C_O: PUSH B
MOV B, #08H
I2C_OLP:RLC A ;ACC.7 -> C
MOV SDA, C
SETB SCL ;SCL=1
NOP
CLR SCL ;SCL=0
DJNZ B, I2C_OLP
SETB SDA ;準備接收 ACK 位
SETB SCL ;SCL=1, [SDA=1]
NOP
MOV C, SDA
CLR SCL
POP B
RET ;C=1, 未收到 ACK 位,出錯, C=0, 收到 ACK 位,正常
; =========================================================================================
I2C_BG: SETB SCL ;確保SCL=HIGH
CLR SDA ;向 IIC 總線發送開始位
NOP
CLR SCL
RET
; =========================================================================================
I2C_ED: CLR SDA
SETB SCL
NOP
SETB SDA ;向 IIC 總線發送停止位
RET
; =========================================================================================
;最好顯示000-999=1000個,否則容易造成誤解,這里顯示全部2187個,0-9,A-F,H,L,P,U,Y
; =========================================================================================
FONT: DB 0FDH ;"0"
DB 061H ;"1"
DB 0DBH ;"2"
DB 0F3H ;"3"
DB 067H ;"4"
DB 0B7H ;"5"
DB 0BFH ;"6"
DB 0E1H ;"7"
DB 0FFH ;"8"
DB 0F7H ;"9"
DB 0EFH ;"A"
DB 03FH ;"B"
DB 09DH ;"C"
DB 07BH ;"D"
DB 09FH ;"E"
DB 08FH ;"F"
DB 06FH ;"H"
DB 071H ;"J"
DB 01DH ;"L"
DB 0CFH ;"P"
DB 07DH ;"U"
DB 077H ;"Y"
; =========================================================================================
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -