📄 iic.asm
字号:
SDA EQU P0.5 ;串行数据线
SCL EQU P0.6 ;串行时钟线
SLA EQU 50H ;寻址字节存放单元
NUMBYT EQU 51H ;数据的长度
MTD EQU 30H ;发数据缓冲首地址
MRD EQU 40H ;接受数据缓冲首地址
SLAW EQU 0A0H ;EEPROM寻址字节写
SLAR EQU 0A1H ;EEPROM寻址字节读
RS EQU P3.5
RW EQU P3.4
E EQU P3.6
XPOS EQU 21H ;行方向
YPOS EQU 22H ;列方向
;---------------------------------------------------------------------------------------
ORG 00H
LJMP MAIN
ORG 30H
MAIN: MOV 50H,#11H
MOV 51H,#11H
MOV 52H,#11H
LCALL VIICWRITE
LCALL VIICREAD
MOV A,60H
CJNE A,#11H,YY
CPL P3.3
YY: LJMP $
;;;;;;;;;;;;;;;;;;;;;;IICWRITE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
VIICWRITE:
LCALL WMOV9
MOV SLA,#SLAW
MOV NUMBYT,#02H
LCALL WRNBYT
RET
WMOV9:MOV 5FH,#50H
MOV R0,#MTD
MOV R1,#5FH
MOV R2,#09H
WMOV: MOV A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,WMOV
RET
;;;;;;;;;;;;;;;;;;;;;;;;IICREAD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
VIICREAD:
MOV MTD,#50
MOV SLA,#SLAW
MOV NUMBYT,#01H
LCALL WRNBYT
MOV SLA,#SLAR
MOV NUMBYT,#09H
LCALL RDNBYT
LCALL RMOV8
RET
RMOV8:MOV R0,#MRD
MOV R1,#60H
MOV R2,#08H
RMOV: MOV A,@R0
MOV @R0,A
INC R0
INC R1
DJNZ R2,RMOV
RET
;-------------------写数据块子程序------------------------------
WRNBYT:
MOV R3,NUMBYT
LCALL STA
MOV A,SLA
LCALL WR_BYTE
LCALL CACK
JB F0,WRNBYT
MOV R1,#MTD
WRDA: MOV A,@R1
LCALL WR_BYTE
LCALL CACK
JB F0,WRNBYT
INC R1
DJNZ R3,WRDA
LCALL STOP
RET
;----------------------读数据块子程序----------------------------
RDNBYT:
MOV R3,NUMBYT
LCALL STA
MOV A,SLA
LCALL WR_BYTE
LCALL CACK
JB F0,RDNBYT
RDN: MOV R1,#MRD
RDN1: LCALL RD_BYTE
MOV R1,A
DJNZ R3,ACK
LCALL MNACK
LCALL STOP
RET
ACK: LCALL MACK
INC R1
LJMP RDN1
;--------------发起脉冲子程序------------------------
STA: SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SDA
NOP
CLR SDA
NOP
NOP
NOP
NOP
CLR SCL
RET
;---------------------发停止脉冲子程序------------------------
STOP: CLR SDA
SETB SCL
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
CLR SDA
CLR SCL
RET
;----------------------应答子程序----------------------------
MACK: CLR SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
SETB SDA
RET
;-------------------------非应答子程序----------------------------
MNACK: SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
SETB SDA
RET
;-------------------------非应答子程序----------------------------
CACK: SETB SDA
SETB SCL
CLR F0
MOV C,SDA
JNC CEND
SETB F0
CEND: CLR SCL
RET
;------------------------------ 写一个字节子程序-------------------------
WR_BYTE:
MOV R0,#08H
WR_LP:RLC A
JC WR1
LJMP WR3
WR_LP1:DJNZ R0,WR_LP
RET
WR1: SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
CLR SDA
LJMP WR_LP1
WR3: CLR SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
LJMP WR_LP1
;-------------------------------读一个字节子程序--------------------------
RD_BYTE:
MOV R0,#8H
RD_LP:SETB SDA
SETB SCL
MOV C,SDA
MOV A,R2
RLC A
MOV A,R2
CLR SCL
DJNZ R0,RD_LP
RET
;----------------把秒,分,时等分成两个存储空间---------------------
EXCHANGE:
MOV A,50H
MOV B,#10H
DIV AB
MOV 61H,A
MOV 60H,B
MOV A,51H
MOV B,#10H
DIV AB
MOV 63H,A
MOV 62H,B
MOV A,52H
MOV B,#10H
DIV AB
MOV 65H,A
MOV 64H,B
MOV A,53H
MOV B,#10H
DIV AB
MOV 67H,A
MOV 66H,B
MOV A,54H
MOV B,#10H
DIV AB
MOV 69H,A
MOV 68H,B
MOV 6AH,75H
MOV A,55H
MOV B,#10H
DIV AB
MOV 6CH,A
MOV 6BH,B
RET
;-----------------------------------16进制转换成 ASCII码值---------------------------
ADD_ASCII:
MOV A,60H
ADD A,#48
MOV 60H,A
MOV A,61H
ADD A,#48
MOV 61H,A
MOV A,62H
ADD A,#48
MOV 62H,A
MOV A,63H
ADD A,#48
MOV 63H,A
MOV A,64H
ADD A,#48
MOV 64H,A
MOV A,65H
ADD A,#48
MOV 65H,A
MOV A,66H
ADD A,#48
MOV 66H,A
MOV A,67H
ADD A,#48
MOV 67H,A
MOV A,68H
ADD A,#48
MOV 68H,A
MOV A,69H
ADD A,#48
MOV 69H,A
MOV A,6AH
ADD A,#48
MOV 6AH,A
MOV A,6BH
ADD A,#48
MOV 6BH,A
MOV A,6CH
ADD A,#48
MOV 6CH,A
RET
;--------------------------------LCD 对应的XPOS,YPOS 输出---------------------------------
DISBUF:
MOV XPOS,#0
MOV YPOS,#0
MOV A,#61H
LCALL LCDWRITE
MOV XPOS,#1
MOV YPOS,#0
MOV A,#60H
LCALL LCDWRITE
MOV XPOS,#2
MOV YPOS,#0
MOV A,#63H
LCALL LCDWRITE
MOV XPOS,#3
MOV YPOS,#0
MOV A,#62H
LCALL LCDWRITE
MOV XPOS,#4
MOV YPOS,#0
MOV A,65H
LCALL LCDWRITE
MOV XPOS,#5
MOV YPOS,#0
MOV A,64H
LCALL LCDWRITE
MOV XPOS,#6
MOV YPOS,#0
MOV A,67H
LCALL LCDWRITE
MOV XPOS,#7
MOV YPOS,#0
MOV A,66H
LCALL LCDWRITE
MOV XPOS,#8
MOV YPOS,#0
MOV A,69H
LCALL LCDWRITE
MOV XPOS,#9
MOV YPOS,#0
MOV A,68H
LCALL LCDWRITE
MOV XPOS,#10
MOV YPOS,#0
MOV A,6BH
LCALL LCDWRITE
MOV XPOS,#11
MOV YPOS,#0
MOV A,6AH
LCALL LCDWRITE
MOV XPOS,#12
MOV YPOS,#0
MOV A,6CH
LCALL LCDWRITE
MOV XPOS,#13
MOV YPOS,#0
MOV A,6BH
LCALL LCDWRITE
RET
LCDWRITE:
LCALL LCDPOS ;lcd 写地址指令
LCALL LCDWD ;LCD 写字符指令
RET
LCDRESET:
LCALL DELAY5MS
LCALL DELAY5MS
LCALL DELAY5MS
MOV A,#38H
LCALL LCDWCN
LCALL DELAY5MS
MOV A,#38H
LCALL LCDWCN
LCALL DELAY5MS
MOV A,#38H
LCALL LCDWCN
MOV A,#38H
LCALL LCDWC
MOV A,#08H
LCALL LCDWC
MOV A,#01H
LCALL LCDWC
MOV A,#06H
LCALL LCDWC
MOV A,#0CH
LCALL LCDWC
RET
;------------------------------LCD 写地址指令--------------------------------------------------------
LCDPOS:PUSH ACC
ANL XPOS,#0FH
ANL YPOS,#01H
MOV A,YPOS
CJNE A,#00,LPS_LAY
MOV A,XPOS
LJMP LPS_LAX
LPS_LAY:MOV A,XPOS
ADD A,#40H
LPS_LAX:ORL A,#80H
LCALL LCDWC
POP ACC
RET
LCDWC:LCALL WAITIDLE
;----------------------------------LCD write not check,写指令------------------------
LCDWCN:CLR RS
CLR RW
MOV P1,A
SETB E
NOP
CLR E
RET
;--------------------------LCD busy check,wait till not busy(读状态,判断是否忙)-----------------------------------
WAITIDLE:
PUSH ACC
MOV P1,#0FFH
CLR RS
SETB RW
SETB E
WTD_PA: NOP
JB P1.7,WTD_PA
CLR E
POP ACC
RET
;--------------------------LCD WRITE TATA(写数据)----------------------------------------
LCDWD: LCALL WAITIDLE
MOV P1,A
CLR RW
SETB RS
SETB E
NOP
CLR E
RET
;----------------------------DELAY---------------------------------
DELAY5MS:MOV R5,#5
DL2: MOV R6,#250
DL1: NOP
NOP
DJNZ R6,DL1
DJNZ R5,DL2
RET
DELAY400MS:
MOV R5,#20 ;延时子程序(400MS)
DL4_PA: MOV R6,#100
DL4_PB: MOV R7,#100
DJNZ R7,$
DJNZ R6,DL4_PB
DJNZ R5,DL4_PA
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -