⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.asm

📁 关于单片机的一系列的设计程序
💻 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 + -