📄 i2c.asm
字号:
SDA BIT P3.4
CLK BIT P3.2
KEY BIT P3.3
LED_PORT EQU P0
DIG_PORT EQU P2
KEY_PORT EQU P2
SW1 BIT P2.7
SW2 BIT P2.6
SW3 BIT P2.5
SW4 BIT P2.4
SW5 BIT P2.3
SW6 BIT P2.2
BEEP BIT P2.0
FLAG_TIM1 BIT 00H ;定时到置标识位
F_BEEP BIT 01H
BUFF_LED1 EQU 22H
BUFF_LED2 EQU 23H
BUFF_LED3 EQU 24H
BUFF_LED4 EQU 25H
BUFF_LED5 EQU 26H
BUFF_LED6 EQU 27H
BUFF_LED_LP EQU 28H
DAT EQU 2DH
SLA EQU 2EH ;24C02器件地址
MTD EQU 2FH ;发送给2402的MCU中资料缓冲区首地址
MRD EQU 30H ;接受2402中资料到中的缓冲区首地址
NUMBYT EQU 31H ;收/发字节数
BUFF_2402_1 EQU 32H ;2402
BUFF_2402_2 EQU 33H ;
BUFF_2402_3 EQU 34H ;
BUFF_2402_4 EQU 35H ;
BUFF_TIM1 EQU 36H ;间隔(秒)
BUFF_TIM2 EQU 37H ;次数
TIM1 EQU 38H
TIM2 EQU 39H
;---------------------------------------------------------------
ADD_TIM1 EQU 10H ;TIM1 资料在24C02中的存储地址
ADD_TIM2 EQU 20H ;TIM2 资料在24C02中的存储地址
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0_INT
ORG 0023H
LJMP 000H
ORG 0100H
MAIN: MOV A, #00H
MOV SP, #40H
MOV PSW, #00H
MOV IE, #00H
MOV P0, #0FFH
MOV P1, #0FFH
MOV P2, #0FFH
MOV P3, #0FFH
MOV R0, #7FH ;初始化RAM区,
CLR_RAM: MOV A, #00H
MOV @R0,A
DJNZ R0, CLR_RAM
MOV BUFF_LED3,#10H ;数码管LED3/4/5消隐
MOV BUFF_LED4,#10H
MOV BUFF_LED5,#10H
LCALL READ_24C02_TIM1 ;读取24C02中的参数
MOV BUFF_TIM1,TIM1
LCALL READ_24C02_TIM2
MOV BUFF_TIM2,TIM2
MOV TH0,#HIGH(65536-4000) ;T0=4MS
MOV TL0,#LOW(65536-4000)
MOV TMOD, #11H
SETB EA
SETB TR0
SETB ET0
LCALL DEL
LCALL DEL
WAIT_KEY: JB KEY,JUD_FLAG_TIM1
JMP PROC_KEY
JUD_FLAG_TIM1:JNB FLAG_TIM1,WAIT_KEY
CLR FLAG_TIM1
MOV BUFF_TIM1,TIM1
LCALL BEEP_LP
JMP WAIT_KEY
PROC_KEY: JNB SW1,SW1_OK
JNB SW2,SW2_OK
JNB SW5,SW5_OK
JNB SW6,SW6_OK
JMP WAIT_KEY
SW1_OK: MOV A,TIM1
CJNE A,#99,SW1_OVER
MOV TIM1,#9
SW1_OVER:INC TIM1 ;计时加1
MOV BUFF_TIM1,TIM1
LCALL WRITE_24C02_TIM1
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW2_OK: MOV A,TIM1
CJNE A,#10,SW2_OVER
MOV TIM1,#99
SW2_OVER:DEC TIM1 ;计时减1
MOV BUFF_TIM1,TIM1
LCALL WRITE_24C02_TIM1
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW5_OK: MOV A,TIM2
CJNE A,#10,SW5_OVER
MOV TIM2,#02H
SW5_OVER:INC TIM2 ;铃声加1
MOV BUFF_TIM2,TIM2
LCALL WRITE_24C02_TIM2
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW6_OK: MOV A,TIM2
CJNE A,#03,SW6_OVER
MOV TIM2,#11
SW6_OVER:DEC TIM2 ;铃声减1
MOV BUFF_TIM2,TIM2
LCALL WRITE_24C02_TIM2
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
BEEP_LP: SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
LCALL DEL
DJNZ BUFF_TIM2,BEEP_LP
MOV BUFF_TIM2,TIM2
RET
DEL: MOV R5,#02 ;为演示方便,人为插入的延时
DEL01: MOV R6,#200
DEL02: MOV R7,#200
DJNZ R7,$
DJNZ R6,DEL02
DJNZ R5,DEL01
RET
READ_2402_RAM1: MOV BUFF_2402_1,A ;读取24C02中A地址的1字节
MOV MTD,#BUFF_2402_1 ;入口在A(存放地址),出口在 DAT(存放资料)
MOV NUMBYT,#01H
MOV SLA,#0AEH
LCALL WNBYTE
MOV SLA,#0AFH
MOV NUMBYT,#01H
MOV MRD,#DAT
LCALL RNBYTE
MOV A, DAT
CPL A
MOV DAT,A
SETB SDA
SETB CLK
RET
WRITE_2402_RAM1:MOV BUFF_2402_1,A ;将DAT中的数据写入24C02中A地址单元
MOV A, DAT ;入口,A(地址),DAT(资料)
CPL A
MOV BUFF_2402_2,A ;1字节
MOV MTD,#BUFF_2402_1
MOV SLA,#0AEH
MOV NUMBYT,#02H
LCALL WNBYTE
RET
READ_24C02_TIM1:
MOV BUFF_2402_1,#ADD_TIM1
MOV MTD,#BUFF_2402_1 ;写24C02中定时周期存储地址(10H)
MOV NUMBYT,#01H
MOV SLA,#0AEH ;
LCALL WNBYTE
MOV SLA,#0AFH ;读24C02中定时TIM1值
MOV NUMBYT,#01H
MOV MRD,#BUFF_2402_1
LCALL RNBYTE
MOV A,BUFF_2402_1
CPL A
MOV TIM1,A
RET
READ_24C02_TIM2:
MOV BUFF_2402_1,#ADD_TIM2
MOV MTD,#BUFF_2402_1 ;写24C02中铃声存储地址(20H)
MOV NUMBYT,#01H
MOV SLA,#0AEH ;
LCALL WNBYTE
MOV SLA,#0AFH ;读24C02中铃声TIM2
MOV NUMBYT,#01H
MOV MRD,#BUFF_2402_1
LCALL RNBYTE
MOV A,BUFF_2402_1
CPL A
MOV TIM2,A
RET
WRITE_24C02_TIM1:
MOV BUFF_2402_1,#ADD_TIM1
MOV A,TIM1
CPL A
MOV BUFF_2402_2,A
MOV MTD,#BUFF_2402_1
MOV SLA,#0AEH
MOV NUMBYT,#02H
LCALL WNBYTE
RET
WRITE_24C02_TIM2:
MOV BUFF_2402_1,#ADD_TIM2
MOV A,TIM2
CPL A
MOV BUFF_2402_2,A
MOV MTD,#BUFF_2402_1
MOV SLA,#0AEH
MOV NUMBYT,#02H
LCALL WNBYTE
RET
BIN_BCD: MOV B,#10
DIV AB
RET
;------------- T0 INTRRUPT 数码管扫描定时中断---------------------------
T0_INT: PUSH ACC
PUSH PSW
MOV TH0,#240 ;T0=4MS
MOV TL0,#96
INC BUFF_LED_LP
MOV A,BUFF_LED_LP
CJNE A,#250,CONT_SCAN ;250*4MS=1S
MOV BUFF_LED_LP,#00H
DEC BUFF_TIM1
MOV A,BUFF_TIM1
CJNE A,#00,CONT_SCAN
MOV BUFF_TIM1,TIM1
SETB FLAG_TIM1
CONT_SCAN:MOV A,BUFF_TIM1
LCALL BIN_BCD
MOV BUFF_LED2,B
MOV BUFF_LED1,A
MOV A,BUFF_TIM2
LCALL BIN_BCD
MOV BUFF_LED6,B
;MOV BUFF_LED5,A
MOV A,BUFF_LED_LP
MOV B,#06
DIV AB
MOV A,B
RL A
MOV DPTR,#TAB_SCAN
JMP @A+DPTR
TAB_SCAN: AJMP SCAN_L1
AJMP SCAN_L2
AJMP SCAN_L3
AJMP SCAN_L4
AJMP SCAN_L5
AJMP SCAN_L6
SCAN_L1: MOV DIG_PORT,#01111111B
MOV A,BUFF_LED1
JMP END_SCAN
SCAN_L2: MOV DIG_PORT,#10111111B
MOV A,BUFF_LED2
JMP END_SCAN
SCAN_L3: MOV DIG_PORT,#11011111B
MOV A,BUFF_LED3
JMP END_SCAN
SCAN_L4: MOV DIG_PORT,#11101111B
MOV A,BUFF_LED4
JMP END_SCAN
SCAN_L5: MOV DIG_PORT,#11110111B
MOV A,BUFF_LED5
JMP END_SCAN
SCAN_L6: MOV DIG_PORT,#11111011B
MOV A,BUFF_LED6
END_SCAN: MOV DPTR,#TAB_LED
MOVC A,@A+DPTR
MOV LED_PORT,A
JNB F_BEEP,END_T0
CLR BEEP
END_T0: POP PSW
POP ACC
RETI
TAB_LED: DB 0C0H,0F9H,0A4H,0B0H,99H,92H ;数码管显示字型表
DB 82H,0F8H,80H,90H,88H,83H,0A7H
DB 0A1H,86H,8EH,0FFH
;-----SUB PROCESS OF IIC (24C02) READ/WRITE--------------------------------------
STA: SETB SDA ;启动IIC总线
NOP
NOP
SETB CLK
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR CLK
RET
STOP:CLR SDA ;停止IIC总线数据传输
NOP
SETB CLK
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR CLK
RET
MACK:CLR SDA ;发送应答位
NOP
NOP
SETB CLK
NOP
NOP
NOP
NOP
NOP
CLR CLK
NOP
NOP
SETB SDA
NOP
NOP
RET
MNACK:SETB SDA ;发送非应答位
NOP
SETB CLK
NOP
NOP
NOP
NOP
NOP
CLR CLK
NOP
NOP
CLR SDA
NOP
NOP
RET
CACK:SETB SDA ;应答位检查
NOP
NOP
SETB CLK
NOP
CLR F0
JNB SDA, CAC
SETB F0
NOP
CAC:CLR CLK
NOP
NOP
RET
WBYTE:MOV R0,#08H ;向SDA线上发送一个字节
WLP: RLC A ;发送字在ACC中,占用R0,C
JC WR1
LJMP WR0
WLP1: DJNZ R0,WLP
RET
WR1: SETB SDA
NOP
NOP
SETB CLK
NOP
NOP
NOP
NOP
NOP
CLR CLK
NOP
NOP
CLR SDA
LJMP WLP1
WR0: CLR SDA
NOP
SETB CLK
NOP
NOP
NOP
NOP
NOP
CLR CLK
NOP
NOP
LJMP WLP1
RBYTE:MOV R0,#08H ;从SDA线上读取一个字节
MOV R2,#00H
RBLP:SETB SDA ;读出字节存ACC中,占用R0,R2,C
NOP
SETB CLK
NOP
JNB SDA,RD0
AJMP RD1
RBLP1:DJNZ R0,RBLP
MOV A,R2
RET
RD0: CLR C
MOV A,R2
RLC A
MOV R2,A
CLR CLK
AJMP RBLP1
RD1: SETB C
MOV A,R2
RLC A
MOV R2,A
CLR CLK
NOP
AJMP RBLP1
WNBYTE:PUSH PSW ;MCU发送N个字节
MOV PSW,#18H ;占用第03组REG组,R1
LCALL STA ;MTD 为MCU发送缓存区首址
MOV A,SLA ;SLA 为器件接收缓存区首址
LCALL WBYTE ;NUMBYT 为发送数据字节数
LCALL CACK
JB F0,WNBYTE
MOV R1,MTD ;#MTD
WRDA: MOV A,@R1
LCALL WBYTE
LCALL CACK
JB F0,WNBYTE
INC R1
DJNZ NUMBYT,WRDA
LCALL STOP
POP PSW
RET
RNBYTE:PUSH PSW ;MCU接收N个字节
MOV PSW,#18H ;占用第"11"组REG组,R1
LCALL STA ;MRD 为MCU接收资料缓存区首址
MOV A,SLA ;SLA 为MCU需读取器件资料缓存区首址
LCALL WBYTE ;NUMBYT 为MCU接收数据字节数
LCALL CACK
JB F0,RNBYTE
RDN:MOV R1,MRD ;#MRD
RDN1:LCALL RBYTE
MOV @R1,A
DJNZ NUMBYT,ACK24
LCALL MNACK
LCALL STOP
POP PSW
RET
ACK24:LCALL MACK
INC R1
JMP RDN1
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -